Im vorheriger Teil In unserer Fb-Prophet-Reihe haben wir uns mit der Modellierung der Saisonalitätskomponente befasst. Sie sollten sich auch daran erinnern erster Teilin dem wir uns mit Trendmodellierung beschäftigt haben.
In diesem Artikel konzentrieren wir uns darauf, wie wir unserem Modell exogene Variablen hinzufügen können. Sie werden auch als unabhängige Variablen oder Prädiktorvariablen bezeichnet. Dabei handelt es sich um Variablen, die nicht direkt von anderen Variablen innerhalb eines Techniques oder Modells beeinflusst werden. Mit anderen Worten: Variablen, von denen man annimmt, dass sie eine kausale Wirkung auf andere Variablen im System haben, von denen sie aber nicht beeinflusst werden. Exogene Variablen werden typischerweise in ein Modell eingeführt, um das Verhalten einer endogenen Variablen zu erklären oder vorherzusagen, bei der es sich um eine Variable handelt, die von anderen Variablen im Modell beeinflusst wird.
Bei Fb Prophet können wir drei Typen unterscheiden: Feiertage, besondere Ereignisse und Regressoren.
Fb Prophet macht es ganz einfach, länderspezifische Feiertage im Modell zu berücksichtigen. Sie können dies mit dem tun add_country_holidays
Methode. In diesem Code fügen wir die Feiertage im Vereinigten Königreich hinzu:
# Import libraries
import pandas as pd
from prophet import Prophet# Load information
df = pd.read_csv('dataset.csv')
# Instantiate mannequin, add holidays and match information
mannequin = Prophet()
mannequin.add_country_holidays(country_name='UK')
mannequin.match(df)
# Outline forecasting interval
future = mannequin.make_future_dataframe(durations=72,
freq='H')
# Predict future values
forecast = mannequin.predict(future)
Wir können nun die Komponenten grafisch darstellen, um es zu visualisieren:
fig = mannequin.plot_components(forecast)
Wie Sie sehen, gab es am 17. März einen Feiertag, der dem St. Patrick’s Day entspricht.
Sie können sich auch ansehen, welche Feiertage Prophet ist, einschließlich:
mannequin.train_holiday_names
0 Krönung Karls III
1 Neujahrstag
2 Neujahrsfeiertage [Scotland]
3 Neujahrstag (beobachtet)
4 Neujahrsfeiertage [Scotland] (Beobachtet)
5 St. Patrick's Day [Northern Ireland]
6 Schlacht am Boyne [Northern Ireland]
7. Sommerfeiertag [Scotland]
8. Andreastag [Scotland]
9 Weihnachtstag
10 Karfreitag
11 Ostermontag [England/Wales/Northern Ireland]
12. Mai
13. Frühlingsfeiertag
14 Spätsommer-Bankfeiertag [England/Wales/Northe...
15 Boxing Day
dtype: object
You can see which countries can be added and the country name to use in this link.
There may be cases in which you would want to add some additional or special events.
We need to specify the dates, the name of the special event (or holiday), and the lower and upper windows:
lower_window
: this refers to the starting reference point. To selectively include specific days in the model, we can adjust it. Setting it to zero would consider only the current day. If we want to incorporate the day before the event, we can set it to -1. Similarly, by setting it to -2, -3, and so on, we can include multiple preceding days.upper_window
: similarly, this refers to the ending reference point. We can set it to 0 if we only want to consider up to that date. Otherwise, by setting it to 1, 2, 3, and so on, we can include multiple following days.
For example, in this particular case, there were two days of programmed maintenance on the system: the 5th of March and the 15th of March of 2023. We want only to model the days of maintenance, so we will set both the lower and upper windows to zero.
maintenance = pd.DataFrame({
'holiday': 'maintenance',
'ds': pd.to_datetime(['2023-03-05', '2023-03-15']),
'lower_window': 0,
'upper_window': 0,
})
Darüber hinaus gab es am 8. März drei Tage lang eine relevante Marketingveranstaltung. In diesem Fall müssen wir das obere Fenster auf 2 setzen, damit es zwei zusätzliche Tage zum Startdatum berücksichtigt.
advertising = pd.DataFrame({
'vacation': 'advertising',
'ds': pd.to_datetime(['2023-03-08']),
'lower_window': 0,
'upper_window': 2,
})
Wir können sie berücksichtigen, indem wir beide Datenrahmen verketten. Der Prophet nennt diese besonderen Ereignisse „Feiertage“, daher bezeichnen wir sie wie folgt:
holidays = pd.concat((upkeep, advertising))
Jetzt können wir das Modell erstellen (wir überspringen hier die Feiertage) und die Komponenten grafisch darstellen:
# Instantiate mannequin, add occasions and match information
mannequin = Prophet(holidays=holidays)
mannequin.match(df)# Outline forecasting interval
future = mannequin.make_future_dataframe(durations=72,
freq='H')
# Predict future values
forecast = mannequin.predict(future)
# Plot elements
fig = mannequin.plot_components(forecast)
Wir können sehen, wie sie im Modell berücksichtigt werden.
Wir können auch nur eines der besonderen Ereignisse wie folgt planen:
from prophet.plot import plot_forecast_component
plot_forecast_component(mannequin, forecast, 'upkeep')
plt.present()
Ähnlich wie wir es für die Saisonalitätskomponenten getan haben, können wir auch die Feiertage und besonderen Ereignisse regulieren, wenn wir der Meinung sind, dass sie zu sehr passen. Durch die Reduzierung der holidays_prior_scale
Parameter (standardmäßig auf 10 eingestellt) können wir ihre Wirkung dämpfen.
# Instantiate mannequin, add occasions and match information
mannequin = Prophet(holidays=holidays,
holidays_prior_scale=0.01)
mannequin.match(df)# Outline forecasting interval
future = mannequin.make_future_dataframe(durations=72,
freq='H')
# Predict future values
forecast = mannequin.predict(future)
# Plot elements
fig = mannequin.plot_components(forecast)
Regressoren können auch verwendet werden, um die Auswirkungen von Feiertagen und besonderen Ereignissen zu berücksichtigen. Einer ihrer bemerkenswerten Vorteile besteht darin, dass sie eine allgemeinere Schnittstelle zum Definieren zusätzlicher linearer Regressoren bieten, ohne dass der Regressor ausschließlich ein binärer Indikator sein muss. Dies eröffnet additionally die Möglichkeit, eine andere Zeitreihe als Regressor zu verwenden. Allerdings müssen diese Werte für den Prognosezeitraum bekannt sein.
Beispielsweise können wir einen binären Regressor hinzufügen, der angibt, ob der Tag ein Wochenende ist oder nicht, und einen kontinuierlichen Regressor, der die stündliche Temperatur an diesem Tag angibt.
Für den ersten, den Weekend-Regressor, können wir Folgendes tun:
# Outline operate to find out if the day is a weekend
def weekend(ds):
date = pd.to_datetime(ds)
if date.weekday() >= 5:
return 1
else:
return 0# Apply the operate to the dataset
df['weekend'] = df['ds'].apply(weekend)
Für den zweiten Fall, die stündliche Temperatur, müssen wir eine API oder externe Daten verwenden, um die Werte zu finden. Da wir die Werte im Prognosezeitraum kennen müssen, müssen wir die zukünftigen Werte von einer Wettervorhersage-API abrufen. In diesem Fall berücksichtigen wir der Einfachheit halber Daten aus der Vergangenheit, da wir die Temperaturen dieser Tage bereits kennen.
Wir können das nutzen meteostat
Python-Bibliothek zum Abrufen der historischen Temperaturen an einem Ort, in unserem Fall in London.
# Set up library
!pip set up meteostat# Import Meteostat library and dependencies
import datetime
from meteostat import Level, Hourly
# Set time interval
begin = datetime.datetime(2023, 3, 1)
finish = datetime.datetime(2023, 3, 31)
# Create Level for London
location = Level(51.509865, -0.11809, 7.971)
# Get every day information for March 2023
information = Hourly(location, begin, finish)
information = information.fetch()
# Extract temperature from information
temp = information[['temp']]
# Add it to Prophet dataframe
df = df.merge(temp, left_on='ds', right_index=True)
Der in das Modell einzugebende Datenrahmen sieht folgendermaßen aus:
Denken Sie daran, dass wir die Werte für den Prognosezeitraum kennen müssen. Aus diesem Grund müssen wir auch „weekend“ und „temp“ hinzufügen future
wie wir es mit gemacht haben df
:
# Instantiate mannequin and match information
mannequin = Prophet()
mannequin.match(df)# Outline forecasting interval
future = mannequin.make_future_dataframe(durations=72,
freq='H')
# Add regressors to future dataframe
future['weekend'] = future['ds'].apply(weekend)
future = future.merge(temp, left_on='ds', right_index=True)
# Predict future values
forecast = mannequin.predict(future)
# Plot elements
fig = mannequin.plot_components(forecast)
Wir können die Wirkung der zusätzlichen Regressoren im vorherigen Diagramm sehen. Wenn wir jeden Effekt des Regressors einzeln sehen möchten, können wir Folgendes tun:
from prophet.plot import plot_forecast_component# Plot weekend element
plot_forecast_component(mannequin, forecast, 'weekend')
plt.present()
# Plot temperature element
plot_forecast_component(mannequin, forecast, 'temp')
plt.present()