我刚开始探索时间序列。我有这样的df
Volume Year Month
718394219 2013 01
763723622 2014 01
762225057 2015 01
787479774 2016 01
845614054 2017 01
我想预测2018年的音量。预测的准确性不需要很高,因为我只想了解基础知识。
我制作了这样的方法,将我的移动平均函数与实际数据一起绘制
def plotMovingAverage(series, n):
"""
series - dataframe with timeseries
n - rolling window size
"""
rolling_mean = series.rolling(window=n).mean()
#rolling_std = series.rolling(window=n).std()
#upper_bond = rolling_mean+1.96*rolling_std
#lower_bond = rolling_mean-1.96*rolling_std
plt.figure(figsize=(15,5))
plt.title("Moving average\n window size = {}".format(n))
plt.plot(rolling_mean, "g", label="Rolling mean trend")
#plt.plot(upper_bond, "r--", label="Upper Bond / Lower Bond")
#plt.plot(lower_bond, "r--")
plt.plot(series[n:], label="Actual values")
plt.legend(loc="upper left")
plt.grid(True)
但是,我没有得到如何预测t+1
的价值
指数平滑的相同问题
def exponential_smoothing(series, alpha):
result = [series[0]] # first value is same as series
for n in range(1, len(series)):
result.append(alpha * series[n] + (1 - alpha) * result[n-1])
return result
答案 0 :(得分:0)
预测: pandas
由他们自己没有实施任何预测机制。预测是机器学习领域使用适当的工具或手动实现您的算法。
您可以使用sklearn中实施的线性模型或SARIMAX使用statsmodels等特殊时间序列预测模型,请参阅how in notebook
对于窗口计算 pandas
有一组特殊功能,请查看文档中的EWM
答案 1 :(得分:0)
我不认为滚动平均值对您非常有用,因为它不会向您显示任何趋势。假设您的股票每年上涨10美元,您的滚动均值将明显低于明年的股票价值。
我建议使用线性外推法(例如最后3个单位)
import pylab
from numpy import polyfit, poly1d, linspace
import matplotlib.pyplot as plt
data = [[718394219, 2013 , 01],
[763723622, 2014 , 01],
[762225057, 2015 , 01],
[787479774, 2016 , 01],
[845614054, 2017 , 01]]
values = [i[0] for i in data]
years = [i[1] for i in data]
plt.plot(years, values)
for i in range(0, len(data)-3):
# interpolate values
# you can choose for yourself how many point should be taken into account
# as well as the degree of interpolation (the last variable mentioned)
z = polyfit(years[i:i+3],values[i:i+3], 1)
p = poly1d(z)
# extrapolate interpolation by 1
start_year = years[i]
end_year = years[i+3] + 1
# plot values
x = linspace(start_year, end_year, 10)
y = p(x)
plt.plot(x, y)
plt.show()
您可以根据需要更改此位:
for i in range(0, len(data)-amount_points_used):
z = polyfit(years[i:i+amount_points_used],
values[i:i+amount_points_used],
degree of interpolation)
非常清楚,我没有统计学背景,如果“准确度不需要很高”,这就是我如何预测东西。