すべて、
データセットは次のようになります。 fbProphet
または他のモデルを使用して、今後6か月の「金額」を予測しようとしています。しかし、私の問題は、次の6か月間の各グループ、つまりA、B、C、Dに基づいて金額を予測したいということです。 python
または他のモデルを使用してfbProphet
でそれを行う方法がわかりませんか?私は fbprophetの公式ページ を参照しましたが、私が見つけた唯一の情報は、 "Prophet"は2つの列のみを取ることです。1つは "Date"で、他は "amount"です。
私はpythonを初めて使用するので、コードの説明に関するヘルプは大歓迎です!
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)
出力:
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
fbprophet
には2つの列ds
とy
が必要なので、最初に2つの列の名前を変更する必要があります
_df = df.rename(columns={'Date': 'ds', 'Amount':'y'})
_
グループが互いに独立していて、グループごとに1つの予測を取得したい場合、データフレームを「グループ」列でグループ化し、グループごとに予測を実行できます。
_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())
_
グループDには単一のデータポイントしかないため、質問で指定した入力データフレームはモデルにとって十分ではないことに注意してください。 fbprophet
の予測には、Nan以外の行が少なくとも2行必要です。
編集:すべての予測を1つのデータフレームにマージする場合は、観測ごとにyhat
に異なる名前を付け、ループでpd.merge()
を実行してから、列をチェリーピッキングすることをお勧めしますあなたは最後に必要です:
_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()]]
_
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()