使用pandas时间序列的线性回归

时间:2016-05-20 04:14:49

标签: python pandas

我有一个dataframe对象,其中包含EUR_USD货币对的1秒间隔。但理论上它可以是任何间隔,在这种情况下它可能看起来像这样:

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轴只是无意义的数字,而是我希望它们能够显示时间序列。

4 个答案:

答案 0 :(得分:5)

详细说明我的评论:

假设您有一些均匀分布的时间序列数据time以及一些相关数据data,正如您在问题中所列出的那样。< / p>

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)

enter image description here

答案 1 :(得分:0)

你可能会对seaborn感到满意吗? 请试试 seaborn.regplot

Plot the relationship between two variables in a DataFrame

答案 2 :(得分:0)

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

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)

答案 3 :(得分:0)

以公认的答案为基础,这里有一种巧妙的方法来绘制来自任何 pd.Series 的趋势和数据,包括时间序列:

trend.plot(df['data']) 

其中 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'])