1时序图
# -*- coding: utf-8 -*-
from pandas import Series
import matplotlib.pyplot as plt
data = Series.from_csv('minimum.csv',header=0)
data.astype(float)
print(data.head())
data.plot(style='r.')
plt.show()
#画其中一年图
data = Series.from_csv('minimum.csv', header=0)
one_year = data['1990']
one_year.plot()
这个解决的一个问题是object类型是不能plot的,查看
pandas 读csv文件 TypeError: Empty 'DataFrame': no numeric data to plot
另外plot的style可以查看文档自己选择喜欢的,查看
plot类型
2直方图和密度图
直方图,没有时序,只是在一个时间范围的变量范围统计,比方说这些数据分成10个bins,我们会看到每个bin的数量(比方说多少天,月等等),这种统计方法同密度图是一样的,能看到变量在哪些取值范围比较多,哪些比较少等等,观测到数据的潜在分布规律。
from pandas import Series
import matplotlib.pyplot as plt
data = Series.from_csv('minimum.csv', header=0)
data.hist()
plt.show()
data.plot(kind='kde')
plt.show()
这里面主要有一个问题,就是什么是kde:Kernel Density Estimation,sklearn的tutorial会告诉你,请看文档
3箱线图
from pandas import *
import matplotlib.pyplot as plt
data = Series.from_csv('minimum.csv', header=0)
groups = data.groupby(TimeGrouper('A'))
years = DataFrame()
for name,group in groups:
years[name.year]=group.values
years.boxplot()
plt.show()
图片.png
箱形图,它能显示出一组数据的最大值、最小值、中位数、及上下四分位数,其中最主要的是最大值最小值给的是在上下四分位数的某个区间里面,形成一个盒子加上胡须(因此也叫盒须图),例如上图1981年,最大值是20-25之间,最小值在0-5之间,务必记住是在一个大概率区间里面最大最小,不是实际的最大最小,离开了这个区间会有很多小圆圈和表示,圆圈表示离群值,表示极端值。
也可以取出其中一年分析:
from pandas import *
import matplotlib.pyplot as plt
data = Series.from_csv('minimum.csv', header=0)
data = data['1990']
groups = data.groupby(TimeGrouper('M'))
months = concat([DataFrame(x[1].values) for x in groups], axis=1)
months = DataFrame(months)
months.columns = range(1,13)
months.boxplot()
plt.show()
4热力图
热力图就更加形象,虽然我们不知道数值,但是通过颜色我们能看看极值的分布,颜色越鲜艳,数值越大(红黄),颜色越暗淡,数值越小(蓝绿),当然显示也有可能不一样。
#1988年的例子
from pandas import *
import matplotlib.pyplot as plt
data = Series.from_csv('minimum.csv', header=0)
data = data['1988']
groups = data.groupby(TimeGrouper('M'))
months = concat([DataFrame(x[1].values) for x in groups], axis=1)
months = DataFrame(months)
months.columns = range(1,13)
plt.matshow(months,interpolation=None,aspect='auto')
plt.show()
5滞后图和散点图
这里应该注意一下,滞后图与散点图可以按照时序画,那就是(1)里面的线形图了,这里讲的其实不是时序的,而是分析数据相关性的,我们给数据一段时间的观测间隔,因为假定前面的数据和后面的数据有关系,是正相关或是负相关还是什么,选定一个间隔,plot一下。
from pandas import *
import matplotlib.pyplot as plt
from pandas.plotting import lag_plot
data = Series.from_csv('minimum.csv', header=0)
lag_plot(data)
plt.show()
图片.png
明显我们看到了正相关。下面给出一个星期的散点图,我们可以看到间隔一天、两天、三天......
from pandas import *
import matplotlib.pyplot as plt
data = Series.from_csv('minimum.csv', header=0)
values = DataFrame(data.values)
lags = 7
columns = [values]
for i in range(1,(lags + 1)):
columns.append(values.shift(i))
dataframe = concat(columns, axis=1)
columns = ['t']
for i in range(1,(lags + 1)):
columns.append('t-' + str(i))
dataframe.columns = columns
plt.figure(1)
for i in range(1,(lags + 1)):
ax = plt.subplot(240 + i)
ax.set_title('t vs t-' + str(i))
plt.scatter(x=dataframe['t'].values, y=dataframe['t-'+str(i)].values)
plt.show()
图片.png
6自相关图
自相关图其实就是考虑数据和一定间隔数据的相关性,越接近1是正相关,接近-1是负相关,接近0就是相关性很低。下面就是计算公式(右边是左边的特殊情形,也就是自相关图的公式,因为是自己和自己所有可能的间隔产生的),下面代码给的自相关默认是数据和滞后1步的相关性。
图片.png
图片.png
from pandas import Series
import matplotlib.pyplot as plt
from pandas.plotting import autocorrelation_plot
series = Series.from_csv('minimum.csv', header=0)
autocorrelation_plot(series)
plt.show()
7时序图(加label)
图片.pngimport pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
df = pd.read_excel('quanguojingji10nian.xls')
x=df['指标']
y1=df['国民总收入(亿元)']
plt.plot(x,y1,label='国民总收入')
plt.xlabel('年份')
plt.ylabel('亿元')
plt.title('国内生产总值')
plt.legend()
plt.show()
图片.png
8直方图(带label)
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
df = pd.read_excel('quanguojingji10nian.xls')
x=df['指标']
y1=df['国民总收入(亿元)']
plt.bar(x, y1, label='国民总收入')
plt.xlabel('年份')
plt.ylabel('亿元')
plt.legend()
plt.show()
图片.png
9饼图(带label)
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
df = pd.read_excel('quanguojingji10nian.xls')
labels='2018年','2017年','2016年','2015年','2014年','2013年','2012年','2011年','2010年','2009年'
x=df['国民总收入(亿元)']
explode=(0.1,0,0,0,0,0,0,0,0,0)
plt.pie(x,labels=labels,explode=explode,startangle=60,autopct='%1.1f%%')
plt.axis("equal")
plt.title('国民总收入')
plt.show()
图片.png
网友评论