来自趋势 python 的时间序列拟合值
Posted
技术标签:
【中文标题】来自趋势 python 的时间序列拟合值【英文标题】:timeseries fitted values from trend python 【发布时间】:2015-07-09 18:04:45 【问题描述】:我在名为price_data
的数据框中有来自雅虎财经的每日股价数据。
我想为此添加一列,它提供来自 Adj Close
列的时间序列趋势的拟合值。
这是我正在使用的数据结构:
In [41]: type(price_data)
Out[41]: pandas.core.frame.DataFrame
In [42]: list(price_data.columns.values)
Out[42]: ['Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close']
In [45]: type(price_data.index)
Out[45]: pandas.tseries.index.DatetimeIndex
在 Python 语言中实现这一目标的最佳方式是什么?
顺便说一句,以下是用 R 语言实现的
all_time_fitted <- function(data)
all_time_model <- lm(Adj.Close ~ Date, data=data)
fitted_value <- predict(all_time_model)
return(fitted_value)
这里是一些示例数据:
In [3]: price_data
Out[3]:
Open High Low Close Volume Adj Close
Date
2005-09-27 21.05 21.40 19.10 19.30 961200 19.16418
2005-09-28 19.30 20.53 19.20 20.50 5747900 20.35573
2005-09-29 20.40 20.58 20.10 20.21 1078200 20.06777
2005-09-30 20.26 21.05 20.18 21.01 3123300 20.86214
2005-10-03 20.90 21.75 20.90 21.50 1057900 21.34869
2005-10-04 21.44 22.50 21.44 22.16 1768800 22.00405
2005-10-05 22.10 22.31 21.75 22.20 904300 22.04377
【问题讨论】:
您能添加一些输入数据的样本吗? 向问题添加示例数据 而且,这可能很愚蠢,但是“拟合值”是什么意思? 对于给定的 x (Date) 值,模型计算的 y (Adj Close) 的预期值。这是参考businessdictionary.com/definition/fitted-value.html 【参考方案1】:又快又脏……
# get some data
import pandas.io.data as web
import datetime
start = datetime.datetime(2015, 1, 1)
end = datetime.datetime(2015, 4, 30)
df=web.DataReader("F", 'yahoo', start, end)
# a bit of munging - better column name - Day as integer
df = df.rename(columns='Adj Close':'AdjClose')
dayZero = df.index[0]
df['Day'] = (df.index - dayZero).days
# fit a linear regression
import statsmodels.formula.api as sm
fit = sm.ols(formula="AdjClose ~ Day", data=df).fit()
print(fit.summary())
predict = fit.predict(df)
df['fitted'] = predict
# plot
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(8,4))
ax.scatter(df.index, df.AdjClose)
ax.plot(df.index, df.fitted, 'r')
ax.set_ylabel('$')
fig.suptitle('Yahoo')
plt.show()
【讨论】:
感谢马克,这已经完成了工作。我现在已经投了赞成票,如果明天没有更整洁的解决方案,我将标记为已接受。通过更简洁的解决方案,我的意思是使用内置功能来处理时间序列趋势,而不是要求将日期作为整数以上是关于来自趋势 python 的时间序列拟合值的主要内容,如果未能解决你的问题,请参考以下文章