我有一个时间序列数据集,我喜欢在历史中捕捉向上趋势模式(通常爬升趋势为30-90天)。 我试图使用滚动窗口,但是我必须放弃NaN以获得线性回归工作,这会使x轴混乱,从而使回归系数变得混乱。
我的问题是:
感谢您的帮助!
数据框示例
import pandas as pd
import scipy.stats
import numpy as np
dict_ = {'COMPLETIONDATE': ['2017-10-05 11:05:08',
'2017-10-06 14:18:25',
'2017-10-05 10:52:20',
'2017-10-05 11:13:18',
'2017-10-03 15:18:08',
'2017-10-06 11:19:38',
'2017-10-03 15:36:34',
'2017-10-06 11:32:08',
'2017-10-05 11:15:38',
'2017-10-06 11:20:37'],
'LOGFIELD16': [45.44571,
46.31465,
47.66407,
38.89286,
45.37415,
38.44305,
45.74217,
40.59497,
39.72602,
46.18687]}
df_ = pd.DataFrame(dict_)
COMPLETIONDATE LOGFIELD16
0 2017-10-05 11:05:08 45.44571
1 2017-10-06 14:18:25 46.31465
2 2017-10-05 10:52:20 47.66407
3 2017-10-05 11:13:18 38.89286
4 2017-10-03 15:18:08 45.37415
5 2017-10-06 11:19:38 38.44305
6 2017-10-03 15:36:34 45.74217
7 2017-10-06 11:32:08 40.59497
8 2017-10-05 11:15:38 39.72602
9 2017-10-06 11:20:37 46.18687
我目前的方法是滚动窗口线性回归,然后检测高于阈值的斜率。但挑战是如何在所选择的数据窗口中拟合线性回归,在该窗口的某些天可能缺少数据。
# function to calculate the slope
def roll_reg(df):
df_size = df.shape[0]
linregress = scipy.stats.linregress(df, np.array(range(df_size)))
return linregress[0]
df_.index = pd.to_datetime(df_.COMPLETIONDATE)
df_.sort_index(inplace=True)
df_[['LOGFIELD16']].resample("1D").mean().dropna().rolling(30).apply(roll_reg).plot(style='o')
滚动回归斜率图。但是,如果你仔细观察,斜坡高原的值大约为2,这不应该是预期的。