Bis zum letzten Mal haben wir zukünftige Umsätze mithilfe des ARIMA-Modells der Zeitreihenanalyse prognostiziert. Ich habe vor, verschiedene Anstrengungen zu unternehmen, aber die Parameter, die angepasst werden können, sind begrenzt und die Genauigkeit verbessert sich nicht.
Daher möchte ich anstelle des ARIMA-Modells vom aktuellen Trend des Deep Learning lernen. Es ist jedoch schwierig, plötzlich von vorne zu beginnen. Daher möchte ich dieses Mal Prophet verwenden, eine von Facebook veröffentlichte Zeitreihenanalysebibliothek, die häufig als "Apropos Zeitreihenanalyse" verwendet wird.
Ich habe programmiert, während ich mir die folgenden Seiten angesehen habe, aber es hat an einigen Stellen nicht so funktioniert, wie ich es erwartet hatte. Wird die Version der Bibliothek geändert?
Oder besser gesagt, Prophet wurde 2017 veröffentlicht. Ich habe gelebt, ohne das zu wissen. .. ..
Google Colaboratory
Wie bei [Letztes Mal] verwenden die Daten den täglichen Umsatz und die Temperatur (Durchschnitt, Maximum, Minimum) als erklärende Variablen.
Datum | Verkaufszahlen | Durchschnittstemperatur | Höchste Temperatur | Niedrigste Temperatur |
---|---|---|---|---|
2018-01-01 | 7,400,000 | 4.9 | 7.3 | 2.2 |
2018-01-02 | 6,800,000 | 4.0 | 8.0 | 0.0 |
2018-01-03 | 5,000,000 | 3.6 | 4.5 | 2.7 |
2018-01-04 | 7,800,000 | 5.6 | 10.0 | 2.6 |
Das Abrufen von Daten von BigQuery zu Pandas ist der gleiche wie zuvor. Da ich jedoch die Zukunft vorhersage, mache ich die letzten 2 Jahre (df) und die Zukunft 1 Monat (df_future).
Danach müssen Sie das Datumselement auch in den Typ datetime64 konvertieren. Außerdem sollte das Datum in ds geändert und der vorhergesagte Wert (hier der Verkaufsbetrag) in den Variablennamen y geändert werden.
import pandas as pd
query = """
SELECT *
FROM `myproject.mydataset.mytable`
WHERE CAST(Datum als Zeitstempel) between CAST("{from_day}" AS TIMESTAMP) AND CAST("{to_day}" AS TIMESTAMP) ORDER BY p_date'
"""
df = pd.io.gbq.read_gbq(query.format(from_day="2017-01-01",to_day="2018-12-31"), project_id="myproject", dialect="standard")
df_future = pd.io.gbq.read_gbq(query.format(from_day="2019-01-01",to_day="2019-01-31"), project_id="myproject", dialect="standard")
from datetime import datetime
#Konvertieren Sie Datumselemente in den Typ datetime64
def strptime_with_offset(string, format='%Y-%m-%d'):
base_dt = datetime.strptime(string, format)
return base_dt
df['Datum'] = df['Datum'].apply(strptime_with_offset)
df.rename(columns={'Verkaufszahlen': 'y','Datum': 'ds'}, inplace=True)
Rufen Sie den Propheten an und fügen Sie dem Modell verschiedene Dinge hinzu.
from fbprophet import Prophet
#Das Modell ist nicht linear
model = Prophet(growth='logistic', daily_seasonality=False)
#Sie können ein Land angeben, in dem Feiertage hinzugefügt werden sollen
model.add_country_holidays(country_name="JP")
#Fügen Sie Saisonalität mit monatlichen Elementen hinzu
model.add_seasonality(name='monthly', period=30.5, fourier_order=5)
#Variablen, die der Prognose hinzugefügt werden sollen
features_list =["Durchschnittstemperatur","Höchste Temperatur","Niedrigste Temperatur"]
for f in features_list:
model.add_regressor(f)
#Bei Nichtlinearität ist CAP unerlässlich. Geben Sie daher den oberen Grenzwert ein.
df['cap']=15000000
model.fit(df)
Dadurch wird das Modell trainiert. Sie können problemlos Elemente usw. hinzufügen, daher scheint es gut zu sein, beim Hinzufügen und Subtrahieren verschiedener Elemente zu lernen.
Wenden Sie dann das resultierende Modell auf zukünftige Daten an.
#Wie weit prognostizieren Sie? Geben Sie hier 30 Tage an
future = model.make_future_dataframe(periods=30, freq='D')
future["cap"]=15000000
#Df, weil wir Variablen benötigen, um die Vorhersage der Temperatur usw. zu ergänzen._Vorhersage nach dem Zusammenführen mit der Zukunft
future=pd.merge(future, df_future, on="ds")
df_forecast = model.predict(future)
Das Vorhersageergebnis wird jetzt in df_forecast gespeichert. Wenn man sich den Inhalt ansieht, scheint es, dass er mit dem Wert yhat eingegeben wird. Darüber hinaus wird es durch die Breite von yhat_lower und yhat_upper vorhergesagt. Darüber hinaus werden verschiedene Trends sowie die Auswirkungen von Saisonalität und Temperatur analysiert.
Lassen Sie uns die Analyseergebnisse auf leicht verständliche Weise grafisch darstellen. Sie können die Umsatzprognose und die tatsächlichen Ergebnisse des letzten Monats vergleichen.
from matplotlib import pyplot as plt
% matplotlib inline
df_output=pd.merge(df_forecast, df_future, on="ds")
#Aus irgendeinem Grund ist in der aktuellen Version ein Fehler ohne Folgendes aufgetreten
pd.plotting.register_matplotlib_converters()
df_output.plot(figsize=(18, 12), x="ds", y=["yhat","y"])
Die Prognose (yhat) ist etwas höher, aber es scheint, dass die Zukunftsprognose durch Anheben und Absenken einen ziemlich guten Trend zeigt.
Sie können auch den Trend und die Periodizität extrahieren und sehen.
model.plot_components(df_forecast)
plt.show()
»Urlaub ist ein Tag für Erwachsene, nicht wahr? Es ist durchdringend. ――In der Woche sind Wochenenden an Samstagen und Sonntagen immer noch teuer. ――Monatlich ist matschig. Bedeutet das, dass das Monatsende und der Monatsanfang hoch sind?
Es war nicht einfach, wie die Artikelnamen ds und y, und die Programme der Pioniere an einigen Stellen, die Fehler verursachten, aber als es fertig war, war es sehr einfach zu verschieben.
Die Formel ist nicht im Programm enthalten, aber beim Vergleich von y und yhat liegt der monatliche Fehler innerhalb von etwa 10%, sodass ich der Meinung bin, dass er ausreichend verwendet werden kann.
Dieses Mal wurde die Verkaufsmenge des gesamten Geschäfts verwendet, aber in Zukunft möchte ich etwas mit höherer Genauigkeit finden, wie die Anzahl der Besucher und die Verkaufsmenge nur einer bestimmten Kategorie.
Recommended Posts