无法删除趋势组件和季节性组件

时间:2015-07-21 16:10:22

标签: python pandas matplotlib machine-learning

我正在尝试使用ARMA模型制作预测能源生产的模型。

我可用于培训的数据如下:

https://github.com/soma11soma11/EnergyDataSimulationChallenge/blob/master/challenge1/data/training_dataset_500.csv

ID  Label   House   Year    Month   Temperature Daylight    EnergyProduction
0     0       1     2011     7         26.2      178.9         740
1     1       1     2011     8         25.8      169.7         731
2     2       1     2011     9         22.8      170.2         694
3     3       1     2011     10        16.4      169.1         688
4     4       1     2011     11        11.4      169.1         650
5     5       1     2011     12         4.2      199.5         763
...............

11995 19     500    2013     2          4.2      201.8         638
11996 20     500    2013     3         11.2        234         778
11997 21     500    2013     4         13.6      237.1         758
11998 22     500    2013     5         19.2      258.4         838
11999 23     500    2013     6         22.7      122.9         586

如上所示,我可以使用2011年7月至2013年5月的数据进行培训。 通过培训,我想预测2013年6月每500所房屋的能源产量。

问题是时间序列数据不是固定的,并且具有趋势分量和季节性成分(我将其检查如下)。

import csv
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


data_train = pd.read_csv('../../data/training_dataset_500.csv')

rng=pd.date_range('7/1/2011', '6/1/2013', freq='M')
house1 = data_train[data_train.House==1][['EnergyProduction','Daylight','Temperature']].set_index(rng)
fig, axes = plt.subplots(nrows=1, ncols=3)
for i, column in enumerate(house1.columns):
    house1[column].plot(ax=axes[i], figsize=(14,3), title=column)

plt.show()

enter image description here

有了这些数据,我无法实现ARMA模型来获得良好的预测。所以我想摆脱趋势组件和季节性组件,使时间序列数据保持不变。我试过这个问题,但是我无法移除这些组件并让它静止不动..

1 个答案:

答案 0 :(得分:1)

我会推荐Hodrick-Prescott(HP)过滤器,它广泛用于宏观经济学,将长期趋势分量与短期波动区分开来。它已实施statsmodels.api.tsa.filters.hpfilter

import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm

df = pd.read_csv('/home/Jian/Downloads/data.csv', index_col=[0])

# get part of the data
x = df.loc[df.House==1, 'Daylight']
# hp-filter, set parameter lamb=129600 following the suggestions for monthly data
x_smoothed, x_trend = sm.tsa.filters.hpfilter(x, lamb=129600)
fig, axes = plt.subplots(figsize=(12,4), ncols=3)
axes[0].plot(x)
axes[0].set_title('raw x')
axes[1].plot(x_trend)
axes[1].set_title('trend')
axes[2].plot(x_smoothed)
axes[2].set_title('smoothed x')

enter image description here