分类: python 编程语言 Data Analysis
2017-03-14 18:50:54
statsmodels
库,它在处理数据时提供了很大的灵活性,而statsmodels
库允许我们在Python中执行统计计算。这两个库一起使用,扩展了Python以提供更多的功能,并显着增加我们的分析工具包。
像其他Python包一样,我们可以用pip
安装statsmodels
和statsmodels
。首先,让我们进入我们的本地编程环境或基于服务器的编程环境:
cd environments
. my_env/bin/activate
从这里,让我们为我们的项目创建一个新的目录。我们将调用它的时间timeseries
,然后移动到目录。 如果调用该项目不同的名称,请务必在整个指南中用您的名称timeseries
序列
mkdir timeseries
cd timeseries
我们现在可以安装statsmodels
, statsmodels
和数据绘图软件包matplotlib
。它们的依赖也将被安装:
pip install pandas statsmodels matplotlib
在这一点上,我们现在设置开始使用pandas
和statsmodels
。
jupyter notebook
要创建新的笔记本文件,请从右上角的下拉菜单中选择新建 > Python 3 :
matplotlib
和statsmodels
的标准statsmodels
)。在我们的笔记本顶部,我们应该写下面的内容:
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
在本教程中的每个代码块之后,您应该键入ALT + ENTER
运行代码并移动到笔记本中的新代码块。
方便地, statsmodels
带有内置数据集,因此我们可以将时间序列数据集直接加载到内存中。
我们将使用一个名为“来自美国夏威夷Mauna Loa天文台的连续空气样本的大气CO2”的数据集,其中收集了1958年3月至2001年12月的CO2样本。我们可以引入这些数据:
data = sm.datasets.co2.load_pandas()
co2 = data.data
让我们检查我们的时间序列数据的前5行是什么样子:
print(co2.head(5))
co2
1958-03-29 316.1
1958-04-05 317.3
1958-04-12 317.6
1958-04-19 317.5
1958-04-26 316.4
随着我们的包导入和CO2数据集准备好,我们可以继续索引我们的数据。
pandas
DataFrame的索引。当在Python中使用时间序列数据时,我们应该确保使用日期作为索引,所以请务必检查,我们可以通过运行以下命令:
co2.index
DatetimeIndex(['1958-03-29', '1958-04-05', '1958-04-12', '1958-04-19',
'1958-04-26', '1958-05-03', '1958-05-10', '1958-05-17',
'1958-05-24', '1958-05-31',
...
'2001-10-27', '2001-11-03', '2001-11-10', '2001-11-17',
'2001-11-24', '2001-12-01', '2001-12-08', '2001-12-15',
'2001-12-22', '2001-12-29'],
dtype='datetime64[ns]', length=2284, freq='W-SAT')
dtype=datetime[ns]
字段确认我们的索引由日期戳对象组成,而length=2284
和freq='W-SAT'
告诉我们,我们有从周六开始的2,284周的日期戳。
每周的数据可能很难处理,所以让我们使用我们的时间序列的月平均值。这可以通过使用方便的resample
函数来获得,这允许我们将时间序列分组为桶(1个月),对每个组应用函数(平均值),并组合结果(每个组一行)。
y = co2['co2'].resample('MS').mean()
这里,术语MS
意味着我们以桶为单位对数据进行分组,并确保我们使用每个月的开始作为时间戳:
y.head(5)
1958-03-01 316.100
1958-04-01 317.200
1958-05-01 317.120
1958-06-01 315.800
1958-07-01 315.625
Freq: MS, Name: co2, dtype: float64
pandas的一个有趣的特点是它能够处理日期戳索引,这使我们能够快速分割我们的数据。例如,我们可以将数据集切分为仅检索1990
后的数据点:
y['1990':]
1990-01-01 353.650
1990-02-01 354.650
...
2001-11-01 369.375
2001-12-01 371.020
Freq: MS, Name: co2, dtype: float64
或者,我们可以将我们的数据集分割为仅在1995
10月到1996
10月1995
检索数据点:
y['1995-10-01':'1996-10-01']
1995-10-01 357.850
1995-11-01 359.475
1995-12-01 360.700
1996-01-01 362.025
1996-02-01 363.175
1996-03-01 364.060
1996-04-01 364.700
1996-05-01 365.325
1996-06-01 364.880
1996-07-01 363.475
1996-08-01 361.320
1996-09-01 359.400
1996-10-01 359.625
Freq: MS, Name: co2, dtype: float64
使用我们的数据正确索引处理时间数据,我们可以移动到可能缺少的处理值。
y.isnull().sum()
5
此输出告诉我们,在我们的时间序列中有5个月缺少值。
一般来说,如果它们不是太多,我们应该“填充”缺失值,以便我们在数据中没有间隙。我们可以使用fillna()
命令在fillna()
中做到这一点。为了简单起见,我们可以使用我们的时间序列中最接近的非空值填充缺失值,但重要的是要注意滚动平均值有时会更好。
y = y.fillna(y.bfill())
在填充缺失值的情况下,我们可以再次检查是否存在任何空值,以确保我们的操作有效:
y.isnull().sum()
0
在执行这些操作后,我们看到我们已经成功地填充了我们的时间序列中的所有缺失值。
matplotlib
API周围的matplotlib
包装来显示我们的数据集的图:
y.plot(figsize=(15, 6))
plt.show()
statsmodels
提供了方便的季节性分解功能来执行季节性分解开箱即用。 如果您有兴趣了解更多,其原始实现的参考可以在以下文章“ STL:A Seasonal-Trend Decomposition Procedure Based on Loess ”中找到 。
下面的脚本显示了如何在Python中执行时间序列季节性分解。默认情况下, seasonal_decompose
返回一个相对较小的数字,所以这段代码块的前两行确保输出数据足够大以供我们可视化。
from pylab import rcParams
rcParams['figure.figsize'] = 11, 9
decomposition = sm.tsa.seasonal_decompose(y, model='additive')
fig = decomposition.plot()
plt.show()
statsmodels
库读取CSV文件,或者使用预先装入statsmodels
库的statsmodels
数据集: data = sm.datasets.sunspots.load_pandas().data
。
关注云架构公众号
Linux入门
QQ交流群:308781113