如何使用移动平均值/滚动平均值预测下一个值

时间:2018-02-25 12:51:11

标签: python pandas time-series

我刚开始探索时间序列。我有这样的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

2 个答案:

答案 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)

非常清楚,我没有统计学背景,如果“准确度不需要很高”,这就是我如何预测东西。