J'étudie l'analyse de séries chronologiques en utilisant ** "Bases de l'analyse des séries temporelles et des modèles d'espace d'état: théorie et implémentation apprises avec R et Stan" ** (soi-disant Hayashimoto). Cependant, comme je suis habitué à Python, j'ai sauté l'implémentation en R et l'ai implémentée en me référant à l'article suivant sur le blog de l'auteur. --Modèle d'espace d'état par Python: https://logics-of-blue.com/python-state-space-models/
Dans cet article, j'ai pu comprendre comment implémenter le modèle général d'espace d'états gaussien par Python, mais la méthode d'implémentation et l'effet en cas de nature extrinsèque n'étaient pas affichés. Par conséquent, nous utiliserons ** des données séparées pour résumer la mise en œuvre et les effets des données extrinsèques. ** **
python
df = pd.read_csv("data/juyo-2019.csv",encoding="shift-jis")
df.head()
Étant donné que les données sont horaires, réorganisez-les en données quotidiennes. Vous pouvez le faire tout de suite en utilisant la fonction groupby. Corrigez ensuite l'index des données à ce jour.
python
df["date"] = pd.to_datetime(df["date"],format="%Y/%m/%d")
df["power"] = df["power"].values.astype(int)
daily_data = df.groupby("date")["power"].sum().reset_index()
daily_data = daily_data.set_index(["date"])
rcParams["figure.figsize"] = [12,5]
daily_data.plot()
En regardant les données, nous pouvons voir qu'il y a des ** irrégularités périodiques **. Comme cela fluctue tous les 7 jours, on peut en déduire qu'il s'agit d'un cycle lié au jour de valeur. En d'autres termes, la demande d'électricité change selon qu'il s'agit de vacances ou non.
De plus, il est présumé que non seulement les jours mais aussi les vacances affectent la demande d'électricité. Les vacances ne se produisent pas périodiquement et peuvent être modélisées comme extrinsèques.
** En résumé, nous essaierons de modéliser plus précisément en modélisant ce qui suit. --Périodique: se produit tous les 7 jours sur une journée
Tout d'abord, modélisons sans tenir compte de la saisonnalité, c'est-à-dire du jour du mois. Modèle utilisant un modèle linéaire local qui ne tient pas compte de la saisonnalité et de la nature extrinsèque. Pour cette modélisation
python
#Modèle de tendance linéaire local
mod_trend = sm.tsa.UnobservedComponents(daily_data,"local linear trend")
res_trend = mod_trend.fit(method="bfgs")
rcParams["figure.figsize"] = 15,15
fig = res_trend.plot_components()
Dans la figure, le haut correspond aux données réelles, le second à l'état et le troisième aux données de tendance. ** Vous pouvez voir que la tendance est foirée sans tenir compte de la périodicité. ** **
Ensuite, en considérant la périodicité. Tout ce que vous avez à faire est de mettre l'argument saisonnier dans Composants non observés. Ici, l'argument est mis à 7 car le jour est pris en compte. Un graphique montrant la saisonnalité a été ajouté au quatrième de la figure. Vous pouvez voir qu'il fluctue périodiquement.
python
#Modèle de tendance linéaire local avec saisonnalité
mod_season_trend = sm.tsa.UnobservedComponents(daily_data.power,
"local linear trend",
seasonal = 7)
res_season_trend = mod_season_trend.fit(
method='bfgs',
maxiter=1000,
)
rcParams["figure.figsize"] = 15,20
fig = res_season_trend.plot_components()
** La grande différence par rapport à la précédente est que les données de tendance ne sont plus irrégulières. ** ** En supprimant la périodicité, la tendance peut être vue avec plus de précision qu'auparavant. (Je crains que les premières données par mois sur le graphique de périodicité soient élevées ...)
Vous pouvez également voir que le graphique de niveau a considérablement diminué au début du mois de mai. Ceci est probablement dû à la GW plutôt qu'au changement d'état. Alors maintenant, considérons un modèle où les vacances sont incorporées comme extrinsèques.
Enfin, il s'agit d'un modèle lorsque des facteurs extrinsèques sont également pris en compte. Considérez les vacances comme extrinsèques. Importez jpholiday pour mettre le drapeau de vacances. (Voici le code lors de l'utilisation de google colab) Ajoutez une colonne de vacances qui sera 1 pour les vacances.
Le samedi et le dimanche étant fermés depuis le début, le drapeau de vacances n'est pas activé.
python
#Mettre un drapeau de vacances, dans le cas de google colab
!pip install jpholiday
import jpholiday
#Drapeau de vacances
daily_data["holiday"] = 0
for i in range(len(daily_data)):
if daily_data.index[i].dayofweek != 6: #Seulement sinon dimanche
date_i = daily_data.index[i] #Date
if jpholiday.is_holiday(date_i): #Pour les jours fériés
daily_data.loc[date_i,"holiday"] = 1
daily_data.head()
Si ce n'est que des vacances, vous ne pouvez pas envisager de vacances consécutives. Réécrivez manuellement les vacances d'hiver de décembre à janvier, la GW en mai et les vacances d'Obon en août au 1.
python
list1 = daily_data.query("20190101 <= index <= 20190104").index
list2 = daily_data.query("20190429 <= index <= 20190503").index
list3 = daily_data.query("20190812 <= index <= 20190816").index
list4 = daily_data.query("20191230 <= index <= 20191231").index
for i in list1:
daily_data.loc[i,"holiday"]=1
for i in list2:
daily_data.loc[i,"holiday"]=1
for i in list3:
daily_data.loc[i,"holiday"]=1
for i in list4:
daily_data.loc[i,"holiday"]=1
Enfin, créez un modèle de tendance linéaire local avec des propriétés extrinsèques et tracez-le. ** Mettez exog dans l'argument et spécifiez l'indicateur de vacances créé précédemment. ** **
python
#Modèle de tendance linéaire local avec saisonnalité et nature extrinsèque
mod_season_exog_trend = sm.tsa.UnobservedComponents(
daily_data.power,
"local linear trend",
seasonal=7,
exog=daily_data.holiday
)
res_season_exog_trend = mod_season_exog_trend.fit(
method="bfgs",
maxiter=1000,
)
#Dessin de l'état / tendance / effets saisonniers estimés
rcParams['figure.figsize'] = 15, 20
fig = res_season_exog_trend.plot_components()
En se concentrant sur le début du mois de mai, la diminution est ** légèrement ** supprimée par rapport au cas de la seule périodicité. Cependant, il semble que cette diminution ne soit pas complètement supprimée uniquement par l'ajout du drapeau de vacances.
Il semble qu'une amélioration supplémentaire soit nécessaire, mais c'était la limite de mes capacités actuelles. .. ..
Merci d'avoir lu pour moi jusqu'à la fin.
--Modèle d'espace d'état par Python: https://logics-of-blue.com/python-state-space-models/
Recommended Posts