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

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

不确定您是否在正确的论坛上。我会在这里问:https://stats.stackexchange.com/ - ma3oun
或者访问 https://datascience.stackexchange.com/ 获取更多实用的解决方案。 - ilia timofeev
请查看此处的问题和答案:https://dev59.com/MaTia4cB1Zd3GeqP_k5b#45689315 - vestland
2个回答

1
预测: pandas 本身没有实现任何预测机制。预测是一个机器学习领域,需要使用适当的工具或手动实现算法。您可以使用sklearn中实现的线性模型,或者对于特殊的时间序列预测模型,例如SARIMAX,请使用statsmodels,请参见如何在笔记本中实现
对于窗口计算pandas有一组特殊函数,请查看文档中的EWM

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)

要非常清楚,我在统计学方面没有任何背景,这只是我预测事物的方法,如果“准确性不需要很高”的话。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接