我有一个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轴只是无意义的数字,而是我希望它们能够显示时间序列。
答案 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)
答案 1 :(得分:0)
你可能会对seaborn感到满意吗? 请试试 seaborn.regplot
答案 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'])