Sfoglia il codice sorgente

vérification de l'apprentissage du wilshire5000 et ajout de la météo par des RNN

Emile
Emile Siboulet 4 anni fa
parent
commit
e732d8735a

+ 1
- 0
code/RNN_prediction_meteo/.gitignore Vedi File

@@ -0,0 +1 @@
data

code/RNN/Model.py → code/RNN_prediction_meteo/Model.py Vedi File


+ 5
- 0
code/RNN_prediction_meteo/README.md Vedi File

@@ -0,0 +1,5 @@
# Prédictions météo

## Données

[Données](https://donneespubliques.meteofrance.fr/?fond=produit&id_produit=90&id_rubrique=32)

BIN
code/RNN_prediction_meteo/dataset.npy Vedi File


+ 58
- 0
code/RNN_prediction_meteo/grab_data.py Vedi File

@@ -0,0 +1,58 @@
import os
import pandas
import numpy as np
import progressbar
from matplotlib import pyplot as plt

station = 7460 # clermont ferand <3
downlaod = True

if downlaod :
print("Suppresion des fichiers existants")
os.system("rm -rf data")
os.system("mkdir data")
print("Début du téléchargement depuis météo france")
for annee in progressbar.progressbar(range(1996,2021)) :
for moi in range(1,13) :
titre = f'{annee:04d}{moi:02d}'
os.system(f'wget -q https://donneespubliques.meteofrance.fr/donnees_libres/Txt/Synop/Archive/synop.{titre}.csv.gz -P data')

os.chdir("data")
os.system(f"gzip -vd *")
os.chdir("..")


donnees = {}
for nom in os.listdir("data") :
csv = pandas.read_csv(f"data/{nom}",sep=";")
extraction = csv[csv["numer_sta"]==station][["date","t"]].values.tolist()

for i in range(len(extraction)) :
mesure = int(extraction[i][0]//1e6//7)
if mesure not in donnees :
donnees[mesure] = []
try :
donnees[mesure].append(float(extraction[i][1]))
except ValueError :
print(f"Erreur de valeur pour la date {extraction[i][0]} : {extraction[i][1]}")


clefs = list(donnees.keys())
clefs.sort()
table = np.zeros(len(clefs))
for i, clef in enumerate(clefs) :
somme = 0
for j in range(len(donnees[clef])) :
somme += donnees[clef][j]
if len(donnees[clef]) > 0 :
table[i] = somme/len(donnees[clef])
else :
table[i] = table[i-1]

plt.plot(np.array(range(len(table)))/52-len(table)/52,table,"bo")
np.save("dataset.npy", table)
print("sauvegardé")
plt.show()




code/RNN/training.py → code/RNN_prediction_meteo/training.py Vedi File

@@ -6,7 +6,7 @@ from Model import MyModel

LEN_SEQ = 64
PRED = 0.05
HIDDEN = 128
HIDDEN = 32

model = MyModel(HIDDEN)

@@ -69,6 +69,7 @@ plt.legend()
fig, axs = plt.subplots(2)
axs[0].plot(annee[:start_pred],dataset[:start_pred], label="apprentissage")
axs[0].plot(annee[start_pred:],dataset[start_pred:], label="validation")
axs[1].plot(annee, data_Pred, label="prediction")
axs[1].plot(annee[:start_pred],dataset[:start_pred], label="données")
axs[1].plot(annee[start_pred:], data_Pred[start_pred:], label="prediction")
plt.legend()
plt.show()

+ 26
- 0
code/RNN_wilshire_5000/Model.py Vedi File

@@ -0,0 +1,26 @@
import tensorflow as tf

class MyModel(tf.keras.Model):

def __init__(self, HIDDEN):
super(MyModel, self).__init__()
self.lstm1 = tf.keras.layers.LSTM(HIDDEN, return_sequences=True)
#self.lstm2 = tf.keras.layers.LSTM(HIDDEN, return_sequences=True)
#self.lstm3 = tf.keras.layers.LSTM(HIDDEN, return_sequences=True)
#self.lstm4 = tf.keras.layers.LSTM(HIDDEN, return_sequences=True)
self.lstmlast = tf.keras.layers.LSTM(HIDDEN, return_sequences=True)
self.dense1 = tf.keras.layers.Dense(HIDDEN, activation='relu')
self.dense2 = tf.keras.layers.Dense(HIDDEN//2, activation='relu')
self.denselast = tf.keras.layers.Dense(1, activation='sigmoid')


def call(self, inputs):
x = self.lstm1(inputs)
#x = self.lstm2(x)
#x = self.lstm3(x)
#x = self.lstm4(x)
x = self.lstmlast(x)
x = self.dense1(x)
x = self.dense2(x)
x = self.denselast(x)
return x

code/RNN/README.md → code/RNN_wilshire_5000/README.md Vedi File


code/RNN/WILL5000INDFC.csv → code/RNN_wilshire_5000/WILL5000INDFC.csv Vedi File


code/RNN/dataset.npy → code/RNN_wilshire_5000/dataset.npy Vedi File


code/RNN/grab_data.py → code/RNN_wilshire_5000/grab_data.py Vedi File


+ 75
- 0
code/RNN_wilshire_5000/training.py Vedi File

@@ -0,0 +1,75 @@
import tensorflow as tf
from matplotlib import pyplot as plt
import numpy as np
from Model import MyModel


LEN_SEQ = 64
PRED = 0.027
HIDDEN = 128

model = MyModel(HIDDEN)

dataset = np.load('dataset.npy')
scale = (np.max(dataset) - np.min(dataset))
data = dataset/scale
shift = np.min(data)
data = data - shift

annee = np.array(list(range(len(data))))/365
annee = annee - annee[-1]
start_pred = int(len(data)*(1-PRED))
print(len(data))
print(start_pred)
plt.figure(1)
plt.plot(annee[:start_pred],data[:start_pred], label="apprentissage")
plt.plot(annee[start_pred:],data[start_pred:], label="validation")
plt.legend()
plt.show()

X_train_tot = [data[0:start_pred-1]]
Y_train_tot = [data[1:start_pred]]

X_train_tot = np.expand_dims(np.array(X_train_tot),2)
Y_train_tot = np.expand_dims(np.array(Y_train_tot),2)

X_train = X_train_tot[:,:LEN_SEQ,:]
Y_train = Y_train_tot[:,:LEN_SEQ,:]

for i in range(len(X_train_tot[0]) - LEN_SEQ) :
X_train = np.concatenate((X_train, X_train_tot[:,i:i+LEN_SEQ,:]),0)
Y_train = np.concatenate((Y_train, Y_train_tot[:,i:i+LEN_SEQ,:]),0)
print(X_train_tot.shape)
print(X_train.shape)


model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['binary_crossentropy'])
import os
os.system("rm -rf log_dir")

model.fit(x=X_train, y=Y_train, batch_size=16, epochs=5, shuffle=True)

Pred = X_train_tot.copy()
while len(Pred[0]) < len(data) :
print(len(data) - len(Pred[0]))
Pred = np.concatenate((Pred, np.array([[model.predict(Pred)[0][-1]]])),1)
Pred = Pred + shift
Pred = Pred * scale

data_Pred = np.squeeze(Pred)

plt.figure(2)
plt.plot(annee[:start_pred],dataset[:start_pred], label="apprentissage")
plt.plot(annee[start_pred:],dataset[start_pred:], label="validation")
plt.plot(annee, data_Pred, label="prediction")
plt.legend()

fig, axs = plt.subplots(2)
axs[0].plot(annee[:start_pred],dataset[:start_pred], label="données")
axs[0].plot(annee[start_pred:],dataset[start_pred:], label="validation")
axs[1].plot(annee[:start_pred],dataset[:start_pred], label="données")
axs[1].plot(annee[start_pred:], data_Pred[start_pred:], label="prediction")
plt.legend()
plt.show()

Loading…
Annulla
Salva