Cela fait longtemps que je n'ai pas posté avec le titre du même nom avant, et ça devient un peu mûr, alors je le posterai à nouveau.
Veuillez vous référer à l'article suivant créé le 22/12/2017. Prévisions de consommation d'énergie avec TensorFlow avec Keras
Tout d'abord, téléchargez les données de demande d'énergie sur le site Web de Tokyo Electric Power.
http://www.tepco.co.jp/forecast/html/download-j.html
http://www.tepco.co.jp/forecast/html/images/juyo-2016.csv
De plus, si vous modifiez l'URL, vous pouvez obtenir les données de 2014.
http://www.tepco.co.jp/forecast/html/images/juyo-2014.csv
Les données téléchargées sont un CSV de la date, de l'heure et de la puissance réelle.
Au fait, il semble que vous puissiez également l'obtenir avec la commande suivante.
python
$ curl -O http://www.tepco.co.jp/forecast/html/images/juyo-2014.csv
$ curl -O http://www.tepco.co.jp/forecast/html/images/juyo-2016.csv
Comme auparavant, téléchargez les données météorologiques passées de l'Agence météorologique.
http://www.data.jma.go.jp/gmd/risk/obsdl/index.php
Le point est "Tokyo", les éléments sont "valeur horaire" et "température", et la période va du 2013/12/31 au 2015/1/1 et du 2015/12/31 au 2017/1/1, data-2014.csv, Enregistrez-le sous data-2016.csv. La raison de choisir une période légèrement plus longue ici est de réduire la période plus tard.
Les données téléchargées sont un fichier CSV contenant des données telles que la date et l'heure, la température, les informations de qualité et le numéro d'homogénéité.
À propos, il semble que le téléchargement à partir du site soit généralement rapide.
python
import pandas as pd
import numpy as np
import datetime as dt
import math
Commencez par charger les données de puissance 2014.
python
filename = "juyo-2014.csv"
#Le code de caractère est shift JIS, sautant les lignes inutiles et lisant
df = pd.read_csv(filename,encoding="SHIFT-JIS",skiprows=2)
#Convertir les noms de colonnes
df.columns = ["DATE","TIME","KW"]
#Étant donné que les données de date et d'heure sont séparées, connectez-les en une seule, convertissez-les en un type de date et d'heure et spécifiez-les sous forme d'index.
df.index = df.index.map(lambda x: dt.datetime.strptime(df.loc[x].DATE + " " + df.loc[x].TIME,"%Y/%m/%d %H:%M"))
#Obtenez des données mensuelles
df["MONTH"] = df.index.month
#Obtenez des données journalières
df["WEEK"] = df.index.weekday
#Obtenir des données de temps
df["HOUR"] = df.index.hour
df_kw = df
Ensuite, chargez les données de température 2014.
python
filename = "data-2014.csv"
#Le code de caractère est shift JIS, sautez les lignes inutiles et obtenez seulement les 2 colonnes requises
df = pd.read_csv(filename,encoding="SHIFT-JIS",skiprows=4)[[0,1]]
#Convertir les noms de colonnes
df.columns = ["DATE","TEMP"]
#Convertir les données de date et d'heure en type de date et d'heure et spécifier comme index
df.index = df.index.map(lambda x: dt.datetime.strptime(df.loc[x].DATE,"%Y/%m/%d %H:%M:%S"))
df_temp = df
python
d1 = df_kw.index.min()
d2 = df_kw.index.max()
df_kw["TEMP"] = df_temp.ix[d1:d2].TEMP
Acquiert les données d'entrée et les données de sortie utilisées pour l'apprentissage automatique. Puisque nous prévoyons la demande de puissance, nous utiliserons la colonne KW pour la sortie et les colonnes MONTH, WEEK, HOUR et TEMP pour l'entrée.
python
#Spécification de la chaîne de données utilisée pour l'entrée
X_cols = ["MONTH","WEEK","HOUR","TEMP"]
#Spécification de la chaîne de données utilisée pour la sortie
y_cols = ["KW"]
#Acquisition des données d'entrée / sortie
X = df_kw[X_cols].as_matrix().astype('float')
y = df_kw[y_cols].as_matrix().astype('int').flatten()
Divisez en données d'entraînement et données de validation.
python
from sklearn import cross_validation
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=.1, random_state=42)
Normalise les données d'entrée.
python
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
Apprenez avec un modèle de régression.
python
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor()
model.fit(X_train, y_train)
Calculez le score en utilisant les données de test divisées.
python
print(model.score(X_test,y_test))
Le score était "0,91601162513664502" (^ - ^)
Graphisons le résultat de la prédiction et les données réelles et vérifions-les.
python
#Résultat de la prédiction
result = model.predict(X_test)
#Convertir en bloc de données
df_result = pd.DataFrame({
"y_test":y_test,
"result":result
})
#Bibliothèque de graphes
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
#Dessin graphique
df_result.plot(figsize=(15, 3))
On dirait que ça frappe, mais je ne sais pas comment c'est.
Réduisez le nombre de données et reconfirmez.
python
#Dessin graphique
df_result[:20].plot(figsize=(15, 3))
N'est-ce pas un bon sentiment!
Chargez les données 2016 en utilisant la même procédure que pour les données 2014.
python
#Demande de puissance
filename = "juyo-2016.csv"
df = pd.read_csv(filename,encoding="SHIFT-JIS",skiprows=2)
df.columns = ["DATE","TIME","KW"]
df.index = df.index.map(lambda x: dt.datetime.strptime(df.loc[x].DATE + " " + df.loc[x].TIME,"%Y/%m/%d %H:%M"))
df["MONTH"] = df.index.month
df["WEEK"] = df.index.weekday
df["HOUR"] = df.index.hour
#Utiliser uniquement pour avril
df_kw = df[df.index.month == 4]
#Température
filename = "data-2016.csv"
df = pd.read_csv(filename,encoding="SHIFT-JIS",skiprows=4)[[0,1]]
df.columns = ["DATE","TEMP"]
df.index = df.index.map(lambda x: dt.datetime.strptime(df.loc[x].DATE,"%Y/%m/%d %H:%M:%S"))
df_temp = df
#Jointure de données
d1 = df_kw.index.min()
d2 = df_kw.index.max()
df_kw["TEMP"] = df_temp.ix[d1:d2].TEMP
python
#Acquisition des données d'entrée / sortie
X = df_kw[X_cols].as_matrix().astype('float')
y = df_kw[y_cols].as_matrix().astype('int').flatten()
X_test = scaler.transform(X)
y_test = y
Prédire et calculer les scores à l'aide d'un modèle formé avec les données de 2014
python
model.score(X_test,y_test)
Le résultat était "0,82435418225963963", qui était un peu plus bas.
python
#Résultat de la prédiction
result = model.predict(X_test)
#Convertir en bloc de données
df_result = pd.DataFrame({
"y_test":y_test,
"result":result
})
#Dessin graphique
df_result.plot(figsize=(15, 3))
J'ai besoin d'un peu plus d'ingéniosité (-_-;)
Recommended Posts