Enoder commited on
Commit
8121e1e
·
verified ·
1 Parent(s): bb3c115

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +34 -174
app.py CHANGED
@@ -1,188 +1,48 @@
 
1
  import pandas as pd
2
  import numpy as np
3
- from datetime import timedelta
4
- from sklearn.metrics import mean_squared_error
5
- import streamlit as st
6
  import requests
7
 
8
- # Fonction pour récupérer les taux des cryptomonnaies via l'API CoinCap
9
- def get_crypto_data(crypto_symbol="bitcoin", limit=100):
10
- url = f"https://api.coincap.io/v2/assets/{crypto_symbol}/history?interval=m15
11
  response = requests.get(url)
12
-
13
- if response.status_code == 200:
14
- data = response.json()['data']
15
- df = pd.DataFrame(data)
16
- df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
17
- df['price'] = pd.to_numeric(df['price'])
18
- df.set_index('timestamp', inplace=True)
19
- return df
20
- else:
21
- st.error("Erreur lors de la récupération des données de l'API CoinCap.")
22
- return None
23
-
24
- # Fonction pour prédire les tendances basées sur les patterns
25
- def predict_patterns(data, future_hours=24):
26
- df = pd.DataFrame(data, columns=["timestamp", "price"])
27
- df["timestamp"] = pd.to_datetime(df["timestamp"], unit="ms")
28
- df.set_index("timestamp", inplace=True)
29
-
30
- last_timestamp = df.index[-1]
31
- future_timestamps = [last_timestamp + timedelta(minutes=15 * i) for i in range(1, (future_hours * 60 // 15) + 1)]
32
-
33
- last_price = df["price"].iloc[-1]
34
- trend = (df["price"].iloc[-1] - df["price"].iloc[0]) / len(df)
35
- sma = df["price"].rolling(window=10).mean().iloc[-1]
36
- ema = df["price"].ewm(span=10, adjust=False).mean().iloc[-1]
37
- cycle_amplitude = (df["price"].max() - df["price"].min()) / 2
38
- mean_price = df["price"].mean()
39
-
40
- patterns = {}
41
 
42
- # 10 patterns précédents
43
- patterns["Trend"] = [last_price + i * trend for i in range(1, len(future_timestamps) + 1)]
44
- patterns["Reversal"] = [last_price - i * trend for i in range(1, len(future_timestamps) + 1)]
45
- patterns["SMA"] = [sma] * len(future_timestamps)
46
- patterns["EMA"] = [ema] * len(future_timestamps)
47
- patterns["Cycle"] = [
48
- last_price + cycle_amplitude * np.sin(2 * np.pi * i / len(future_timestamps))
49
- for i in range(len(future_timestamps))
50
- ]
51
- patterns["Rebound"] = [last_price + trend * (0.5 ** i) for i in range(len(future_timestamps))]
52
- patterns["Plateau"] = [last_price] * len(future_timestamps)
53
- patterns["Breakout"] = [
54
- last_price + (trend * 2 if i < len(future_timestamps) // 2 else -trend * 2)
55
- for i in range(len(future_timestamps))
56
- ]
57
- patterns["Recovery"] = [last_price + (mean_price - last_price) * (i / len(future_timestamps)) for i in range(len(future_timestamps))]
58
- patterns["Acceleration"] = [last_price + (trend * 1.5) * i for i in range(len(future_timestamps))]
59
 
60
- # 20 nouveaux patterns
61
- patterns["Descending Triangle"] = [
62
- last_price - (i * 0.1 * cycle_amplitude) for i in range(len(future_timestamps))
63
- ]
64
- patterns["Ascending Triangle"] = [
65
- last_price + (i * 0.1 * cycle_amplitude) for i in range(len(future_timestamps))
66
- ]
67
- patterns["Double Top"] = [
68
- last_price + cycle_amplitude * (-1 if i < len(future_timestamps) // 2 else 1)
69
- for i in range(len(future_timestamps))
70
- ]
71
- patterns["Double Bottom"] = [
72
- last_price - cycle_amplitude * (1 if i < len(future_timestamps) // 2 else -1)
73
- for i in range(len(future_timestamps))
74
- ]
75
- patterns["Head and Shoulders"] = [
76
- last_price + cycle_amplitude * (1 if (i % 10 < 3 or i % 10 > 6) else -1)
77
- for i in range(len(future_timestamps))
78
- ]
79
- patterns["Inverse Head and Shoulders"] = [
80
- last_price - cycle_amplitude * (1 if (i % 10 < 3 or i % 10 > 6) else -1)
81
- for i in range(len(future_timestamps))
82
- ]
83
- patterns["Flag Pattern"] = [
84
- last_price + trend * (0.3 * np.sin(2 * np.pi * i / len(future_timestamps)))
85
- for i in range(len(future_timestamps))
86
- ]
87
- patterns["Cup and Handle"] = [
88
- last_price + (np.sqrt(i) if i < len(future_timestamps) * 0.7 else 0)
89
- for i in range(len(future_timestamps))
90
- ]
91
- patterns["Pennant"] = [
92
- last_price + (cycle_amplitude / (i + 1)) for i in range(len(future_timestamps))
93
- ]
94
- patterns["Wedge Up"] = [
95
- last_price + (cycle_amplitude * 0.5 * (1 + np.sin(i))) for i in range(len(future_timestamps))
96
- ]
97
- patterns["Wedge Down"] = [
98
- last_price - (cycle_amplitude * 0.5 * (1 + np.sin(i))) for i in range(len(future_timestamps))
99
- ]
100
- patterns["Triple Top"] = [
101
- last_price + cycle_amplitude * (-1 if i % 15 < 5 else 1)
102
- for i in range(len(future_timestamps))
103
- ]
104
- patterns["Triple Bottom"] = [
105
- last_price - cycle_amplitude * (1 if i % 15 < 5 else -1)
106
- for i in range(len(future_timestamps))
107
- ]
108
- patterns["Falling Channel"] = [
109
- last_price - trend * i for i in range(len(future_timestamps))
110
- ]
111
- patterns["Rising Channel"] = [
112
- last_price + trend * i for i in range(len(future_timestamps))
113
- ]
114
- patterns["Symmetrical Triangle"] = [
115
- last_price + cycle_amplitude * (np.sin(i) * (1 - i / len(future_timestamps)))
116
- for i in range(len(future_timestamps))
117
- ]
118
- patterns["Rounding Bottom"] = [
119
- last_price + cycle_amplitude * (np.sqrt(i / len(future_timestamps)))
120
- for i in range(len(future_timestamps))
121
- ]
122
- patterns["Broadening Formation"] = [
123
- last_price + cycle_amplitude * (1 + i / len(future_timestamps))
124
- for i in range(len(future_timestamps))
125
- ]
126
- patterns["Rectangle"] = [
127
- last_price + (cycle_amplitude * (-1 if i % 20 < 10 else 1))
128
- for i in range(len(future_timestamps))
129
- ]
130
 
131
- pattern_dfs = {
132
- pattern_name: pd.DataFrame({"timestamp": future_timestamps, "price": prices})
133
- for pattern_name, prices in patterns.items()
134
- }
135
- return pattern_dfs
136
-
137
- # Fonction pour identifier le meilleur pattern basé sur la MSE (Mean Squared Error)
138
- def identify_best_pattern(df, patterns):
139
- actual_values = df["price"].values
140
- mse_values = {}
141
-
142
- for pattern_name, pattern_df in patterns.items():
143
- predicted_values = pattern_df["price"].values
144
-
145
- # Limiter la longueur des prédictions pour éviter des séries trop longues
146
- if len(predicted_values) > len(actual_values):
147
- predicted_values = predicted_values[:len(actual_values)]
148
-
149
- # Assurez-vous que les longueurs sont identiques
150
- if len(actual_values) != len(predicted_values):
151
- st.warning(f"Avertissement : Longueur des séries différentes pour le pattern {pattern_name}.")
152
- continue
153
-
154
- mse = mean_squared_error(actual_values, predicted_values)
155
- mse_values[pattern_name] = mse
156
 
157
- if mse_values:
158
- best_pattern = min(mse_values, key=mse_values.get)
159
- return best_pattern, patterns[best_pattern]
160
- else:
161
- st.error("Aucun pattern valide n'a été trouvé.")
162
- return None, None
163
-
164
- # Interface utilisateur Streamlit
165
- st.title("Analyse des tendances de prix de Cryptomonnaies")
166
 
167
- # Sélection de la cryptomonnaie
168
- crypto_symbol = st.selectbox("Sélectionnez la cryptomonnaie", ["bitcoin", "ethereum", "litecoin", "dogecoin"])
 
169
 
170
- # Récupérer les données de la cryptomonnaie via l'API CoinCap
171
- df = get_crypto_data(crypto_symbol=crypto_symbol)
172
-
173
- if df is not None:
174
- # Affichage des données récupérées
175
- st.write(f"Données de {crypto_symbol.upper()}")
176
- st.write(df)
 
177
 
178
- # Prédiction des patterns
179
- patterns = predict_patterns(df[['timestamp', 'price']].values.tolist())
180
 
181
- # Identification du meilleur pattern
182
- best_pattern_name, best_pattern_df = identify_best_pattern(df, patterns)
 
183
 
184
- if best_pattern_name:
185
- st.write(f"Le meilleur pattern pour {crypto_symbol.upper()} est : {best_pattern_name}")
186
- st.write(best_pattern_df)
187
- else:
188
- st.write("Aucun pattern n'a été identifié.")
 
1
+ import streamlit as st
2
  import pandas as pd
3
  import numpy as np
 
 
 
4
  import requests
5
 
6
+ # Fonction pour obtenir les données de la crypto-monnaie via l'API CoinCap
7
+ def get_crypto_data(crypto_symbol="bitcoin", lookback=30):
8
+ url = f"https://api.coincap.io/v2/assets/{crypto_symbol}/history?interval=m15"
9
  response = requests.get(url)
10
+ data = response.json()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
 
12
+ # Afficher les premières lignes des données retournées pour vérifier la structure
13
+ st.write("Données brutes de l'API CoinCap:", data)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
 
15
+ if 'data' not in data:
16
+ st.error(f"Erreur : Impossible de récupérer les données pour {crypto_symbol}")
17
+ return pd.DataFrame()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
 
19
+ # Vérifier la structure et s'assurer que les colonnes sont correctes
20
+ raw_data = data['data']
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
 
22
+ if len(raw_data) == 0:
23
+ st.error("Aucune donnée disponible pour cette crypto-monnaie.")
24
+ return pd.DataFrame()
 
 
 
 
 
 
25
 
26
+ # Convertir les données en DataFrame et afficher les premières lignes pour vérifier la structure
27
+ df = pd.DataFrame(raw_data)
28
+ st.write("Données transformées en DataFrame:", df.head())
29
 
30
+ # Vérifier les noms de colonnes avant de procéder
31
+ if 'time' in df.columns:
32
+ df['timestamp'] = pd.to_datetime(df['time'], unit='ms')
33
+ df.set_index('timestamp', inplace=True)
34
+ df.drop(columns=['time'], inplace=True) # Supprimer la colonne 'time' si nécessaire
35
+ else:
36
+ st.error("Le champ 'time' n'existe pas dans les données.")
37
+ return pd.DataFrame()
38
 
39
+ return df
 
40
 
41
+ # Exemple d'utilisation dans Streamlit
42
+ crypto_symbol = "bitcoin" # Vous pouvez changer cela pour d'autres cryptos comme 'ethereum'
43
+ df = get_crypto_data(crypto_symbol)
44
 
45
+ if not df.empty:
46
+ st.write("Données crypto:", df)
47
+ else:
48
+ st.write("Pas de données à afficher.")