用Pandas时间序列进行线性回归

11

我有一个数据框对象,其中包含欧元/美元货币对每秒的间隔。但从理论上讲,它可以是任何间隔,如果是这种情况,它可能是这样的:

2015-11-10 01:00:00+01:00    1.07616
2015-11-10 01:01:00+01:00    1.07605
2015-11-10 01:02:00+01:00    1.07590
2015-11-10 01:03:00+01:00    1.07592
2015-11-10 01:04:00+01:00    1.07583

我想使用线性回归从数据框中绘制趋势线,但是我不确定如何在时间序列中实现最佳方式,即使是这样一个小的时间序列。

目前,我通过将时间替换为(这只是为了展示我希望达到的效果)列表,该列表范围从0到时间序列列表长度,来进行调试。

x = list(range(0, len(df.index.tolist()), 1))
y = df["closeAsk"].tolist()

使用numpy进行数学运算

fit = np.polyfit(x,y,1)
fit_fn = np.poly1d(fit)

最后我会绘制这个函数,同时将df["closeAsk"]与其一起呈现,以便理解趋势。

plt.plot(x,df["closeAsk"], '-')
plt.plot(x,y, 'yo', x, fit_fn(x), '--k')
plt.show()

然而现在X轴上只是无意义的数字,我希望它们能显示时间序列。


为什么在绘图时不直接用 df["time_series_data"] 替换 x 呢? - lanery
4个回答

18

进一步解释我的评论:

假设您有一些等间隔的时间序列数据time,以及一些相关的数据data,就像您在问题中所描述的那样。

time = pd.date_range('9:00', '10:00', freq='1s')
data = np.cumsum(np.random.randn(time.size))

df = pd.DataFrame({'time' : time,
                   'data' : data})

就如您所演示的,您可以使用 np.polyfit 对数据进行线性拟合,并使用 np.poly1d 创建趋势线。

x = np.arange(time.size) # = array([0, 1, 2, ..., 3598, 3599, 3600])
fit = np.polyfit(x, df['data'], 1)
fit_fn = np.poly1d(fit)

然后使用df['time']作为x轴绘制数据和拟合曲线。

plt.plot(df['time'], fit_fn(x), 'k-')
plt.plot(df['time'], df['data'], 'go', ms=2)

输入图像描述


如果你没有均匀间隔的时间序列数据怎么办? - sunny

0

3
seaborn的regplot函数无法处理时间序列,而该功能对于这个问题至关重要。 - K.-Michael Aye

0
在接受的答案基础上,这里有一种简洁的方法可以绘制任何pd.Series(包括时间序列)的趋势和数据:
trend(df['data']).plot()

其中trend.plot的定义如下(从被接受的答案概括而来):

def trend(s):
    x = np.arange(len(s))
    z = np.polyfit(x, s, 1)
    p = np.poly1d(z)
    t = pd.Series(p(x), index=s.index)
    return t

trend.plot = lambda s: [s.plot(), trend(s).plot()]

如果您只需要趋势数据(而非图表):
trendline = trend(df['data'])

0

你可以创建一个numpy linspace,使其x值的长度与数据点相同,如下所示:

y = df["closeAsk"].dropna() # or.fillna(method='bfill')
x = np.linspace(1, len(y), num=len(y))

import seaborn as sb

sb.regplot(x, y)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接