AudreyMireille commited on
Commit
5046098
1 Parent(s): 3904e32

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +272 -34
app.py CHANGED
@@ -1,37 +1,275 @@
 
 
 
 
 
1
  import streamlit as st
 
 
 
 
 
2
 
3
 
4
- st.markdown("# Prédiction du prix des cryptomonnaies")
5
- st.markdown(
6
- "Crypto Predict(CP) est une application web alimentée par un modèle d'apprentissage automatique qui anticipe le cours de clôture à venir."
7
- )
8
- st.markdown(
9
- "Nous avons effectué les expérimentations sur deux crypto à savoir : le Bitcoin (BTC) et l'Ethereum (ETH). N'empêche que dans l'appplication finale, nous produisons des prédictions pour la crypto monnaies les plus connues"
10
- )
11
-
12
- st.markdown("----")
13
- st.markdown("# Notre boite à outils ")
14
- st.markdown(
15
- "**API/Web Scraper** : Le scraper CryptoCmd Python a extrait les données de CoinMarketCap."
16
- )
17
- st.markdown("**Préparation des données** : Pandas, Numpy")
18
- st.markdown("**Visualisation des données** : Matplotlib, Seaborn")
19
- st.markdown("**Modélisation des données** : Scikit: Learn, TensorFlow, Keras")
20
- # st.markdown("**Database** : SQL")
21
- st.markdown("**Application web** : Streamlit")
22
- st.markdown("**Environnement de travail** : Google Colab,vs Code")
23
-
24
- st.markdown("----")
25
- st.markdown("# Algorithmes d'IA utilisés")
26
- st.markdown("Nous avons utilisé les modèles ci-après durant l'expérimentation : ")
27
- st.markdown("1. **Les KNN** : c'est un algorithme ML intéressant que l'on peut utiliser ici est kNN (k voisins les plus proches). Sur la base des variables indépendantes, kNN trouve la similitude entre les nouveaux points de données et les anciens points de données.")
28
- st.markdown("2. **La regression linéaire** : ce modèle est un grand classique en ML et l'un des plus simples à mettre en oeuvre. Le modèle de régression linéaire renvoie une équation qui détermine la relation entre les variables indépendantes et la variable dépendante.")
29
- st.markdown("3. **Le Random Forest** : un autre grand modèle basé sur les arbres de décision qui peut aider à capturer la variabilité dans le cours des valeurs de crypto-actifs.")
30
- st.markdown("4. **Les LSTM** : ils sont largement utilisés pour les problèmes de prédiction de séquences , en l'occurence les séries chronologiques et se sont révélés extrêmement efficaces. La raison pour laquelle ils fonctionnent si bien est que LSTM est capable de stocker des informations passées importantes et d'oublier celles qui ne le sont pas. LSTM a trois portes.")
31
-
32
-
33
-
34
- st.markdown("----")
35
- st.markdown("# Les métriques d'évaluation")
36
- st.markdown("1. **Le R2 du modèle (%)** : qui est le pourcentage de variabilité expliqué par le modèle;")
37
- st.markdown("2. **Le Root Mean Squared Error (RMSE)** : il est une mesure de la précision d'un modèle qui calcule la racine carrée de la moyenne des carrés des écarts entre les valeurs prédites et les valeurs réelles. Un RMSE plus faible indique une meilleure précision du modèle..")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ import numpy as np
3
+ import tensorflow as tf
4
+ import random as rn
5
+ import yfinance as yf
6
  import streamlit as st
7
+ import datetime as dt
8
+ import plotly.graph_objects as go
9
+ from plotly.subplots import make_subplots
10
+ from sklearn.preprocessing import MinMaxScaler
11
+ from streamlit_option_menu import option_menu
12
 
13
 
14
+ np.random.seed(1)
15
+ tf.random.set_seed(1)
16
+ rn.seed(1)
17
+ from keras.models import Sequential
18
+ from keras.layers import Dense, Dropout, LSTM
19
+ from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
20
+ from millify import millify
21
+ import pandas_datareader as web
22
+ from cryptocmd import CmcScraper
23
+ from datetime import datetime, timedelta
24
+
25
+
26
+ # import utils
27
+ from utils import *
28
+ import time
29
+
30
+
31
+ st.set_page_config(layout="wide")
32
+
33
+ def load_data(dataset):
34
+ df=pd.read_csv(dataset)
35
+ return df
36
+
37
+ def main():
38
+ # récupération des données sur 10 ans
39
+ start = dt.datetime.today() - dt.timedelta(10 * 365)
40
+ end = dt.datetime.today()
41
+
42
+ a = start.strftime("%d-%m-%Y")
43
+ b = end.strftime("%d-%m-%Y")
44
+
45
+ with st.sidebar:
46
+ selected = option_menu("Menu",["Accueil","Visualisation", "Prédiction", "Documentation"],
47
+ icons =['house',"bar-chart-fill", 'gear', 'book'] , menu_icon ="border-width", default_index=0)
48
+ #whitespace = 15
49
+ #choice = st.tabs([s.center(whitespace,"\u2001") for s in menu])
50
+
51
+
52
+ if selected == "Accueil":
53
+ left, middle, right = st.columns((1,2,1))
54
+ with middle:
55
+ st.image('images/cryptos.jpeg',width=400)
56
+ st.markdown("----")
57
+ st.write(" ")
58
+ st.write(" ")
59
+ st.write(" ")
60
+ st.write(" ")
61
+ st.markdown("<h1 style='text-align:center;color: black;'>Bienvenue sur Crypto Predict(CP)!</h1>",unsafe_allow_html=True)
62
+ st.markdown("<h3 style='text-align:center;color: black;'>Crypto Predict(CP) est une application web alimentée par un modèle d'apprentissage automatique qui anticipe le cours de clôture à venir.</h1>",unsafe_allow_html=True)
63
+ left, middle, right = st.columns((1.5,1,1))
64
+ with middle:
65
+ Go = st.button("LET'S GO!")
66
+
67
+ if selected == "Visualisation":
68
+ st.title('Visualisation des données ')
69
+ csv = pd.read_csv("convertcsv.csv")
70
+
71
+ symbol = csv["symbol"].tolist()
72
+
73
+ # select box ticker
74
+ ticker_input = st.selectbox(
75
+ "Saisir ou choisir une crypto", symbol, index=symbol.index("BTC")
76
+ )
77
+
78
+ # initialisation du scraper avec les deux dates
79
+ scraper = CmcScraper(ticker_input, a, b)
80
+ # Pandas dataFrame for the same data
81
+ df = scraper.get_dataframe()
82
+
83
+ fig_viz = go.Figure()
84
+ fig_viz.add_trace(
85
+ go.Scatter(x=df["Date"], y=df["Close"])
86
+ )
87
+
88
+ fig_viz.update_layout(
89
+ legend=dict(orientation="h", yanchor="bottom", y=1, xanchor="left", x=0),
90
+ height=600,
91
+ title_text=f"Evolution du prix à la fermeture pour {ticker_input}",
92
+ template="gridon",
93
+ )
94
+ st.plotly_chart(fig_viz, use_container_width=True)
95
+
96
+ if selected == 'Prédiction':
97
+ st.title("Prédiction")
98
+
99
+ csv = pd.read_csv("convertcsv.csv")
100
+
101
+ symbol = csv["symbol"].tolist()
102
+
103
+ # select box ticker
104
+ ticker_input = st.selectbox(
105
+ "Saisir ou choisir une crypto", symbol, index=symbol.index("BTC")
106
+ )
107
+
108
+ # initialisation du scraper avec les deux dates
109
+ scraper = CmcScraper(ticker_input, a, b)
110
+ # Pandas dataFrame for the same data
111
+ df = scraper.get_dataframe()
112
+
113
+ if ticker_input:
114
+ # Enregistrement du temps de début
115
+ start_time = time.time()
116
+ st.write(f"Génération des prédictions pour : {ticker_input}...")
117
+ # tri du dataframe par dates croissantes vu que les données sont rendues par ordre décroissant
118
+ crypto_df = df.sort_values(["Date"], ascending=True, axis=0)
119
+
120
+ # création du dataframe pour les LSTM
121
+ crypto_df_lstm = pd.DataFrame(index=range(0, len(crypto_df)), columns=["Date", "Close"])
122
+ for i in range(0, len(crypto_df)):
123
+ crypto_df_lstm["Date"][i] = crypto_df["Date"][i]
124
+ crypto_df_lstm["Close"][i] = crypto_df["Close"][i]
125
+
126
+ # on fixe de la date comme index
127
+ crypto_df_lstm.index = crypto_df_lstm.Date
128
+ crypto_df_lstm.drop("Date", axis=1, inplace=True)
129
+ crypto_df_lstm = crypto_df_lstm.sort_index(ascending=True)
130
+
131
+ dataset = crypto_df_lstm.values
132
+ # division 70% (train) 20% (test)
133
+ train_index = int(0.70 * len(dataset))
134
+
135
+ # train set
136
+ train = dataset[:train_index]
137
+ # test set
138
+ valid = dataset[train_index:]
139
+
140
+ # mise à l'échelle des données
141
+ scaler = MinMaxScaler(feature_range=(0, 1))
142
+ scaled_data = scaler.fit_transform(dataset)
143
+
144
+ x_train, y_train = [], []
145
+ window = 30 # un mois
146
+ for i in range(window, len(train)):
147
+ # récupération des données par bloc d'un mois (30 jours)
148
+ x_train.append(scaled_data[i - window : i, 0])
149
+ # récupération de la prochaine valeur comme étiquette
150
+ y_train.append(scaled_data[i, 0])
151
+ x_train, y_train = np.array(x_train), np.array(y_train)
152
+
153
+ # mise sous la forme (nombre d'échantillons, fenêtre de temps, nombre de features)
154
+ x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))
155
+
156
+ # construction du réseau LSTM par la méthode fonctionnelle
157
+ # le réseau n'est pas complexifié pour permettre une exécution rapide
158
+ model = Sequential()
159
+ model.add(LSTM(units=100, return_sequences=True, input_shape=(x_train.shape[1], 1)))
160
+ model.add(Dropout(0.2))
161
+ model.add(LSTM(units=100))
162
+ model.add(Dropout(0.2))
163
+ model.add(Dense(1))
164
+
165
+ model.compile(loss="mean_squared_error", optimizer="adam")
166
+ print("Entrainement du modèle")
167
+ model.fit(x_train, y_train, epochs=1, batch_size=32,validation_split=0.3)
168
+
169
+
170
+ # récupération de toutes les valeurs du test set (valid) et des window valeurs avant elles, ce qui explique le -window
171
+ inputs = crypto_df_lstm[len(crypto_df_lstm) - len(valid) - window :].values
172
+ inputs = inputs.reshape(-1, 1)
173
+ inputs = scaler.transform(inputs)
174
+
175
+ X_test = []
176
+ for i in range(window, inputs.shape[0]):
177
+ X_test.append(inputs[i - window : i, 0])
178
+ X_test = np.array(X_test)
179
+
180
+ # transformation du test set à un format approprié
181
+ X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
182
+ closing_price = model.predict(X_test)
183
+ closing_price = scaler.inverse_transform(closing_price)
184
+
185
+ # for plotting
186
+ train = crypto_df[:train_index]
187
+ valid = crypto_df[train_index:]
188
+ valid["Predictions"] = closing_price
189
+
190
+ fig_preds = go.Figure()
191
+ fig_preds.add_trace(
192
+ go.Scatter(x=train["Date"], y=train["Close"], name="Train Set")
193
+ )
194
+
195
+ fig_preds.add_trace(
196
+ go.Scatter(x=valid["Date"], y=valid["Close"], name="Test Set")
197
+ )
198
+
199
+ fig_preds.add_trace(
200
+ go.Scatter(x=valid["Date"], y=valid["Predictions"], name="Prédictions")
201
+ )
202
+
203
+ fig_preds.update_layout(
204
+ legend=dict(orientation="h", yanchor="bottom", y=1, xanchor="left", x=0),
205
+ height=600,
206
+ title_text=f"Valeurs actuelles VS Valeurs prédites pour {ticker_input}",
207
+ template="gridon",
208
+ )
209
+
210
+ st.plotly_chart(fig_preds, use_container_width=True)
211
+
212
+ # Prédiction au jour suivant
213
+ real_data = [inputs[len(inputs) - window : len(inputs + 1), 0]]
214
+ real_data = np.array(real_data)
215
+ real_data = np.reshape(real_data, (real_data.shape[0], real_data.shape[1], 1))
216
+
217
+ prediction = model.predict(real_data)
218
+ prediction = scaler.inverse_transform(prediction)
219
+ # calcul des métriques
220
+ perfs = performances(valid["Close"],valid["Predictions"])
221
+ end_time = time.time()
222
+
223
+ # Convertir la dernière en objet datetime
224
+ date_obj = dt.datetime.strptime(b, "%d-%m-%Y")
225
+
226
+ # Ajouter un jour
227
+ nouvelle_date = date_obj + dt.timedelta(days=1)
228
+
229
+ # Convertir la nouvelle date en format souhaité
230
+ nouvelle_date_str = nouvelle_date.strftime("%d-%m-%Y")
231
+
232
+ with st.container():
233
+ col_1, col_2, col_3,col_4 = st.columns(4)
234
+ col_1.metric(f"Préd. jour **{nouvelle_date_str}** :",f"{str(round(float(prediction), 2))}")
235
+ col_2.metric(f"R2 Score :", f"{perfs[0]} %")
236
+ col_3.metric(f"RMSE :",f"{perfs[1]}")
237
+ col_4.metric(f"Temps mis : ",f"{taken_time(start_time,end_time)}")
238
+ else:
239
+ st.write("Aucune crypto sélectionnée.")
240
+
241
+ if selected == 'Documentation':
242
+ st.title("Documentation")
243
+ st.markdown(
244
+ "Le Bitcoin (BTC) et l'Ethereum (ETH) étant les deux crypto-monnaies les plus célèbres, nous les avons utilisées comme base pour entrainer nos modèles. Les prédictions sont ensuite faites pour les autres crypto-actifs."
245
+ )
246
+
247
+ st.markdown("----")
248
+ st.markdown("## Notre équipe ")
249
+ st.markdown("1. DJEOGANG Audrey")
250
+ st.markdown("2. OWONA Edouard")
251
+ st.markdown("----")
252
+ st.markdown("## Notre boite à outils ")
253
+ st.markdown(
254
+ "**1. API/Web Scraper** : Le scraper CryptoCmd Python a extrait les données de CoinMarketCap."
255
+ )
256
+ st.markdown("**2. Préparation des données** : Pandas, Numpy")
257
+ st.markdown("**3. Visualisation des données** : Matplotlib, Seaborn")
258
+ st.markdown("**4. Modélisation des données** : Scikit: Learn, TensorFlow, Keras")
259
+ # st.markdown("Database: SQL")
260
+ st.markdown("**5. Application web** : Streamlit")
261
+ st.markdown("**6. Environnements de travail** : Jupyter Notebook/ Vs Code")
262
+
263
+ st.markdown("----")
264
+ st.markdown("## Algorithmes d'IA utilisé")
265
+ st.markdown("Nous avons utilisé les modèles ci-après durant l'expérimentation : ")
266
+ st.markdown("1. **Les KNN** : c'est un algorithme ML intéressant que l'on peut utiliser ici est kNN (k voisins les plus proches). Sur la base des variables indépendantes, kNN trouve la similitude entre les nouveaux points de données et les anciens points de données.")
267
+ st.markdown("2. **La regression linéaire** : ce modèle est un grand classique en ML et l'un des plus simples à mettre en oeuvre. Le modèle de régression linéaire renvoie une équation qui détermine la relation entre les variables indépendantes et la variable dépendante.")
268
+ st.markdown("3. **Le Random Forest** : un autre grand modèle basé sur les arbres de décision qui peut aider à capturer la variabilité dans le cours des valeurs de crypto-actifs.")
269
+ st.markdown("4. **Les LSTM** : ils sont largement utilisés pour les problèmes de prédiction de séquences , en l'occurence les séries chronologiques et se sont révélés extrêmement efficaces. La raison pour laquelle ils fonctionnent si bien est que LSTM est capable de stocker des informations passées importantes et d'oublier celles qui ne le sont pas. LSTM a trois portes.")
270
+
271
+ st.markdown("----")
272
+ st.markdown("## Les métriques d'évaluation")
273
+ st.markdown("1. **Le R2 du modèle (%)** : qui est le pourcentage de variabilité expliqué par le modèle;")
274
+ st.markdown("2. **Le Root Mean Squared Error (RMSE)** : il est une mesure de la précision d'un modèle qui calcule la racine carrée de la moyenne des carrés des écarts entre les valeurs prédites et les valeurs réelles. Un RMSE plus faible indique une meilleure précision du modèle..")
275
+ main()