File size: 12,313 Bytes
eee01d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
import pandas as pd
import numpy as np
import tensorflow as tf
import random as rn
import yfinance as yf
import streamlit as st
import datetime as dt
import plotly.graph_objects as go
from plotly.subplots import make_subplots
from sklearn.preprocessing import MinMaxScaler
from streamlit_option_menu import option_menu


np.random.seed(1)
tf.random.set_seed(1)
rn.seed(1)
from keras.models import Sequential
from keras.layers import Dense, Dropout, LSTM
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from millify import millify
import pandas_datareader as web
from cryptocmd import CmcScraper
from datetime import datetime, timedelta


# import utils
from utils import *
import time


st.set_page_config(layout="wide")

def load_data(dataset):
    df=pd.read_csv(dataset)
    return df

def main():
    # récupération des données sur 10 ans 
    start = dt.datetime.today() - dt.timedelta(10 * 365)
    end = dt.datetime.today()

    a = start.strftime("%d-%m-%Y")
    b = end.strftime("%d-%m-%Y")

    with st.sidebar:
        selected = option_menu("Menu",["Accueil", "Prédiction"],
        icons =['house', 'gear'] , menu_icon ="border-width", default_index=0)
    #whitespace = 15
    #choice = st.tabs([s.center(whitespace,"\u2001") for s in menu])
    
    
    if selected == "Accueil":
        left, middle, right = st.columns((1,2,1))
        with middle:
            st.image('images/cryptos.jpeg',width=400)
        st.markdown("----")
        st.write("  ")
        st.write("  ")
        st.write("  ")
        st.write("  ")
        st.markdown("<h1 style='text-align:center;color: black;'>Bienvenue sur Crypto Predict(CP)!</h1>",unsafe_allow_html=True)
        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)
        # left, middle, right = st.columns((1.5,1,1))
        # with middle:
        #     Go = st.button("LET'S GO!")

    # if selected == "Visualisation":
    #     st.title('Visualisation des données ')
    #     csv = pd.read_csv("convertcsv.csv")
        
    #     symbol = csv["symbol"].tolist()

    #     # select box ticker
    #     ticker_input = st.selectbox(
    #         "Saisir ou choisir une crypto", symbol, index=symbol.index("BTC")
    #     )

    #     # initialisation du scraper avec les deux dates
    #     scraper = CmcScraper(ticker_input, a, b)
    #     # Pandas dataFrame for the same data
    #     df = scraper.get_dataframe()

    #     fig_viz = go.Figure()
    #     fig_viz.add_trace(
    #         go.Scatter(x=df["Date"], y=df["Close"])
    #     )

    #     fig_viz.update_layout(
    #         legend=dict(orientation="h", yanchor="bottom", y=1, xanchor="left", x=0),
    #         height=600,
    #         title_text=f"Evolution du prix à la fermeture pour {ticker_input}",
    #         template="gridon",
    #     )
    #     st.plotly_chart(fig_viz, use_container_width=True)
        
    if selected == 'Prédiction':
        st.title("Prédiction")
        
        csv = pd.read_csv("convertcsv.csv")
        
        symbol = csv["symbol"].tolist()

        # select box ticker
        ticker_input = st.selectbox(
            "Saisir ou choisir une crypto", symbol, index=symbol.index("BTC")
        )

        # initialisation du scraper avec les deux dates
        scraper = CmcScraper(ticker_input, a, b)
        # Pandas dataFrame for the same data
        df = scraper.get_dataframe()

        if ticker_input:
            # Enregistrement du temps de début
            start_time = time.time()
            st.write(f"Génération des prédictions pour : {ticker_input}...")
            # tri du dataframe par dates croissantes vu que les données sont rendues par ordre décroissant
            crypto_df = df.sort_values(["Date"], ascending=True, axis=0)

            # création du dataframe pour les LSTM
            crypto_df_lstm = pd.DataFrame(index=range(0, len(crypto_df)), columns=["Date", "Close"])
            for i in range(0, len(crypto_df)):
                crypto_df_lstm["Date"][i] = crypto_df["Date"][i]
                crypto_df_lstm["Close"][i] = crypto_df["Close"][i]

            # on fixe de la date comme index
            crypto_df_lstm.index = crypto_df_lstm.Date
            crypto_df_lstm.drop("Date", axis=1, inplace=True)
            crypto_df_lstm = crypto_df_lstm.sort_index(ascending=True)

            dataset = crypto_df_lstm.values
            # division 70% (train) 20% (test)
            train_index = int(0.70 * len(dataset))

            # train set
            train = dataset[:train_index]
            # test set
            valid = dataset[train_index:]

            # mise à l'échelle des données
            scaler = MinMaxScaler(feature_range=(0, 1))
            scaled_data = scaler.fit_transform(dataset)

            x_train, y_train = [], []
            window = 30 # un mois 
            for i in range(window, len(train)):
                # récupération des données par bloc d'un mois (30 jours)
                x_train.append(scaled_data[i - window : i, 0])
                # récupération de la prochaine valeur comme étiquette
                y_train.append(scaled_data[i, 0])
            x_train, y_train = np.array(x_train), np.array(y_train)

            # mise sous la forme (nombre d'échantillons, fenêtre de temps, nombre de features)
            x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))

            # construction du réseau LSTM par la méthode fonctionnelle
            # le réseau n'est pas complexifié pour permettre une exécution rapide
            model = Sequential()
            model.add(LSTM(units=100, return_sequences=True, input_shape=(x_train.shape[1], 1)))
            model.add(Dropout(0.2))
            model.add(LSTM(units=100))
            model.add(Dropout(0.2))
            model.add(Dense(1))

            model.compile(loss="mean_squared_error", optimizer="adam")
            print("Entrainement du modèle")
            model.fit(x_train, y_train, epochs=1, batch_size=32,validation_split=0.3)
            

            # récupération de toutes les valeurs du test set (valid) et des window valeurs avant elles, ce qui explique le -window
            inputs = crypto_df_lstm[len(crypto_df_lstm) - len(valid) - window :].values
            inputs = inputs.reshape(-1, 1)
            inputs = scaler.transform(inputs)

            X_test = []
            for i in range(window, inputs.shape[0]):
                X_test.append(inputs[i - window : i, 0])
            X_test = np.array(X_test)

            # transformation du test set à un format approprié
            X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
            closing_price = model.predict(X_test)
            closing_price = scaler.inverse_transform(closing_price)

            # for plotting
            # train = crypto_df[:train_index]
            # valid = crypto_df[train_index:]
            # valid["Predictions"] = closing_price

            # fig_preds = go.Figure()
            # fig_preds.add_trace(
            #     go.Scatter(x=train["Date"], y=train["Close"], name="Train Set")
            # )

            # fig_preds.add_trace(
            #     go.Scatter(x=valid["Date"], y=valid["Close"], name="Test Set")
            # )

            # fig_preds.add_trace(
            #     go.Scatter(x=valid["Date"], y=valid["Predictions"], name="Prédictions")
            # )

            # fig_preds.update_layout(
            #     legend=dict(orientation="h", yanchor="bottom", y=1, xanchor="left", x=0),
            #     height=600,
            #     title_text=f"Valeurs actuelles VS Valeurs prédites pour {ticker_input}",
            #     template="gridon",
            # )

            # st.plotly_chart(fig_preds, use_container_width=True)

            # Prédiction au jour suivant
            real_data = [inputs[len(inputs) - window : len(inputs + 1), 0]]
            real_data = np.array(real_data)
            real_data = np.reshape(real_data, (real_data.shape[0], real_data.shape[1], 1))

            prediction = model.predict(real_data)
            prediction = scaler.inverse_transform(prediction)
            # calcul des métriques
            #perfs = performances(valid["Close"],valid["Predictions"])
            #end_time = time.time()
            
            # Convertir la dernière en objet datetime
            date_obj = dt.datetime.strptime(b, "%d-%m-%Y")

            # Ajouter un jour
            nouvelle_date = date_obj + dt.timedelta(days=1)

            # Convertir la nouvelle date en format souhaité
            nouvelle_date_str = nouvelle_date.strftime("%d-%m-%Y")

            with st.container():
                col_1, col_2, col_3,col_4 = st.columns(4)
                col_1.metric(f"Préd. jour **{nouvelle_date_str}** :",f"{str(round(float(prediction), 2))}")
                #col_2.metric(f"R2 Score :", f"{perfs[0]} %")
                #col_3.metric(f"RMSE :",f"{perfs[1]}")
                #col_4.metric(f"Temps mis : ",f"{taken_time(start_time,end_time)}")
        else:
            st.write("Aucune crypto sélectionnée.")

    #if selected == 'Documentation':
        #st.title("Documentation")
        #st.markdown(
         #   "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."
        #)

        #st.markdown("----")
        #st.markdown("## Notre équipe ")
        #st.markdown("1. DJEOGANG Audrey")
        #st.markdown("2. OWONA Edouard")
        #st.markdown("----")
        #st.markdown("## Notre boite à outils ")
        #st.markdown(
            #"**1. API/Web Scraper** : Le scraper CryptoCmd Python a extrait les données de CoinMarketCap."
        #)
        #st.markdown("**2. Préparation des données** : Pandas, Numpy")
        #st.markdown("**3. Visualisation des données** : Matplotlib, Seaborn")
        #st.markdown("**4. Modélisation des données** : Scikit: Learn, TensorFlow, Keras")
        # st.markdown("Database: SQL")
        #st.markdown("**5. Application web** : Streamlit")
        #st.markdown("**6. Environnements de travail** : Jupyter Notebook/ Vs Code")

        #st.markdown("----")
        #st.markdown("## Algorithmes d'IA utilisé")
        #st.markdown("Nous avons utilisé les modèles ci-après durant l'expérimentation : ")
        #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.")
        #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.")
        #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.")
        #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.")

        #st.markdown("----")
        #st.markdown("## Les métriques d'évaluation")
        #st.markdown("1. **Le R2 du modèle (%)** : qui est le pourcentage de variabilité expliqué par le modèle;")
        #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..")
main()