Python 3.x 如何在python中为时间序列数据中的组计算SMAPE?

Python 3.x 如何在python中为时间序列数据中的组计算SMAPE?,python-3.x,time-series,pandas-groupby,facebook-prophet,Python 3.x,Time Series,Pandas Groupby,Facebook Prophet,我的数据如下所示,我正在使用facebookFbProphet进行预测。接下来,我想为数据帧中的每个组计算SMAPE。我找到了Kaggle用户描述的函数,但我不确定如何在当前代码中实现。这样,SMAPE就可以为每组进行计算。此外,我知道fbProphet具有验证功能,但我想为每个组计算SMAPE 注意:我是python新手,请提供代码解释 数据集 import pandas as pd data = {'Date':['2017-01-01', '2017-01-01','2017-01-01'

我的数据如下所示,我正在使用facebook
FbProphet
进行预测。接下来,我想为数据帧中的每个组计算
SMAPE
。我找到了Kaggle用户描述的函数,但我不确定如何在当前代码中实现。这样,
SMAPE
就可以为每组进行计算。此外,我知道fbProphet具有验证功能,但我想为每个组计算
SMAPE

注意:我是python新手,请提供代码解释

数据集

import pandas as pd
data = {'Date':['2017-01-01', '2017-01-01','2017-01-01','2017-01-01','2017-01-01','2017-01-01','2017-01-01','2017-01-01',
               '2017-02-01', '2017-02-01','2017-02-01','2017-02-01','2017-02-01','2017-02-01','2017-02-01','2017-02-01'],'Group':['A','A','B','B','C','C','D','D','A','A','B','B','C','C','D','D'],
       'Amount':['12.1','13.2','15.1','10.7','12.9','9.0','5.6','6.7','4.3','2.3','4.0','5.6','7.8','2.3','5.6','8.9']}
df = pd.DataFrame(data)
print (df)
到目前为止的代码…

def get_prediction(df):
    prediction = {}
    df = df.rename(columns={'Date': 'ds','Amount': 'y', 'Group': 'group'})
    df=df.groupby(['ds','group'])['y'].sum()
    df=pd.DataFrame(df).reset_index()
    list_articles = df.group.unique()

    for group in list_articles:
        article_df = df.loc[df['group'] == group]
        # set the uncertainty interval to 95% (the Prophet default is 80%)
        my_model = Prophet(weekly_seasonality= True, daily_seasonality=True,seasonality_prior_scale=1.0)
        my_model.fit(article_df)
        future_dates = my_model.make_future_dataframe(periods=6, freq='MS')
        forecast = my_model.predict(future_dates)
        prediction[group] = forecast
        my_model.plot(forecast)
    return prediction

您仍然可以使用fbprophet自己的
交叉验证
功能,但可以使用您自己的评分。下面是uber关于他们如何进行回溯测试(滑动窗口和扩展窗口)的一个不错的博客:

fbprophet的cv功能在滑动窗口上运行。如果这对您来说是可以的,您可以将其与自定义评分功能结合使用。我认为一个很好的方法是扩展Prophet并实现
.score()
方法

这里是一个示例实现:

从FBI导入Prophet
从fbprophet.diagnostics导入交叉验证
将numpy作为np导入
类别估计(Prophet):
"""
带有自定义评分的包装器
"""
定义初始化(self,*args,**kwargs):
超级(预估器,自我)。\uuuuu初始值(*args,**kwargs)
def分数(自我):
#跨val分数重用prophets自己的cv实现
df\U cv=交叉验证(自我,水平=6天)
#在这里决定如何计算SMAPE。
#这里总结了每个滑动窗口,
#对于所有窗口,SMAPE是在周期总和上计算的。
df_cv=df_cv.groupby('cutoff').agg({
“yhat”:“sum”,
‘y’:‘sum’
})
smape=self.calc_smape(df_cv['yhat'],df_cv['y']))
回程票
def calc_smape(自我、帽子、帽子):
返回100/len(y)*np.sum(2*np.abs(y_hat-y)/(np.abs(y)+np.abs(y_hat)))
def get_预测(df):
预测={}
df=df.rename(列={'Date':'ds','Amount':'y','Group':'Group'})
df=df.groupby(['ds','group'])['y'].sum()
df=pd.DataFrame(df).reset_index()
list_articles=df.group.unique()
对于列表中的组\u文章:
第条df=df.loc[df['group']==group]
#将不确定性区间设置为95%(Prophet默认值为80%)
my_模型=预测估计器(每周_季节性=真,每日_季节性=真,季节性_先验_量表=1.0)
my_model.fit(文章_df)
smape=my_model.score()#将此存储在某处
未来日期=我的模型。生成未来数据帧(周期=6,频率=MS)
预测=我的模型。预测(未来日期)
预测[组]=(预测,smape)
my_模型图(预测)
收益预测

这可能会有所帮助,您是否正在尝试为列表中的组计算此组的smape
@jayprakashstar..是..我正在尝试为位于“组”列中的每个组计算smape以及使用prophet获得的预测值