web-dev-qa-db-fra.com

Comment effectuer une analyse de séries chronologiques qui contient plusieurs groupes dans Python en utilisant fbProphet ou d'autres modèles?

Tout,

Mon jeu de données ressemble à ce qui suit. J'essaie de prédire le "montant" pour les 6 prochains mois en utilisant le fbProphet ou un autre modèle. Mais mon problème est que je voudrais prédire le montant en fonction de chaque groupe, c'est-à-dire A, B, C, D pour les 6 prochains mois. Je ne sais pas comment faire cela dans python en utilisant fbProphet ou un autre modèle? J'ai référencé page officielle de fbprophet , mais la seule information que j'ai trouvée est que "Prophète" ne prend que deux colonnes. L'une est "Date" et l'autre est "montant".

Je suis nouveau sur python, donc toute aide avec l'explication du code est grandement appréciée!

import pandas as pd
data = {'Date':['2017-01-01', '2017-02-01', '2017-03-01', '2017-04-01','2017-05-01','2017-06-01','2017-07-01'],'Group':['A','B','C','D','C','A','B'],
       'Amount':['12.1','13','15','10','12','9.0','5.6']}
df = pd.DataFrame(data)
print (df)

sortie:

         Date Group Amount
0  2017-01-01     A   12.1
1  2017-02-01     B     13
2  2017-03-01     C     15
3  2017-04-01     D     10
4  2017-05-01     C     12
5  2017-06-01     A    9.0
6  2017-07-01     B    5.6
10
Data_is_Power

fbprophet nécessite deux colonnes ds et y, vous devez donc d'abord renommer les deux colonnes

df = df.rename(columns={'Date': 'ds', 'Amount':'y'})

En supposant que vos groupes sont indépendants les uns des autres et que vous souhaitez obtenir une prédiction pour chaque groupe, vous pouvez regrouper la trame de données par colonne "Groupe" et exécuter des prévisions pour chaque groupe

from fbprophet import Prophet
grouped = df.groupby('Group')
for g in grouped.groups:
    group = grouped.get_group(g)
    m = Prophet()
    m.fit(group)
    future = m.make_future_dataframe(periods=365)
    forecast = m.predict(future)
    print(forecast.tail())

Notez que la trame de données d'entrée que vous fournissez dans la question n'est pas suffisante pour le modèle car le groupe D ne possède qu'un seul point de données. Les prévisions de fbprophet nécessitent au moins 2 lignes non Nan.

EDIT: si vous voulez fusionner toutes les prédictions en une seule trame de données, l'idée est de nommer le yhat pour chaque observation différemment, faites pd.merge() dans la boucle, puis choisissez les colonnes qui vous avez besoin à la fin:

final = pd.DataFrame()
for g in grouped.groups:
    group = grouped.get_group(g)
    m = Prophet()
    m.fit(group)
    future = m.make_future_dataframe(periods=365)
    forecast = m.predict(future)    
    forecast = forecast.rename(columns={'yhat': 'yhat_'+g})
    final = pd.merge(final, forecast.set_index('ds'), how='outer', left_index=True, right_index=True)

final = final[['yhat_' + g for g in grouped.groups.keys()]]
13
Aditya Santoso
import pandas as pd
import numpy as np
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.tsa.stattools import adfuller
from matplotlib import pyplot as plt
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_squared_log_error  



# Before doing any modeling using ARIMA or SARIMAS etc Confirm that
# your time-series is stationary by using Augmented Dick Fuller test
# or other tests.

# Create a list of all groups or get from Data using np.unique or other methods
groups_iter = ['A', 'B', 'C', 'D']

dict_org = {}
dict_pred = {}
group_accuracy = {}

# Iterate over all groups and get data 
# from Dataframe by filtering for specific group
for i in range(len(groups_iter)):
    X = data[data['Group'] == groups_iter[i]]['Amount'].values
    size = int(len(X) * 0.70)
    train, test = X[0:size], X[size:len(X)]
    history = [x for in train]

    # Using ARIMA model here you can also do grid search for best parameters
    for t in range(len(test)):
        model = ARIMA(history, order = (5, 1, 0))
        model_fit = model.fit(disp = 0)
        output = model_fit.forecast()
        yhat = output[0]
        predictions.append(yhat)
        obs = test[t]
        history.append(obs)
        print("Predicted:%f, expected:%f" %(yhat, obs))
    error = mean_squared_log_error(test, predictions)
    dict_org.update({groups_iter[i]: test})
    dict_pred.update({group_iter[i]: test})

    print("Group: ", group_iter[i], "Test MSE:%f"% error)
    group_accuracy.update({group_iter[i]: error})
    plt.plot(test)
    plt.plot(predictions, color = 'red')
    plt.show()
2
user3432888