python画时间序列图_[Python与数据分析]-7Python画时序各种图

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()

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)

图片.png

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.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