Enoder commited on
Commit
2ab0462
·
verified ·
1 Parent(s): 7998d67

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +69 -90
app.py CHANGED
@@ -1,115 +1,94 @@
1
- import streamlit as st
2
- import requests
3
- import pandas as pd
4
- import matplotlib.pyplot as plt
5
- from datetime import datetime, timedelta
6
- import numpy as np
7
-
8
- # Mapping des cryptomonnaies et devises avec leurs IDs pour CoinCap
9
- coins = {
10
- "Bitcoin": "bitcoin",
11
- "Ripple": "ripple",
12
- "Ethereum": "ethereum",
13
- "Tether": "tether",
14
- "Stellar": "stellar"
15
- }
16
-
17
- currencies = {
18
- "Dollar (USD)": "usd",
19
- "Euro (EUR)": "eur",
20
- "Livre (GBP)": "gbp",
21
- "Bitcoin (BTC)": "btc",
22
- "Tether (USDT)": "usdt"
23
- }
24
-
25
- # Fonction pour récupérer les données de CoinCap
26
- def get_crypto_prices(selected_coins, start_time, end_time):
27
- prices = {}
28
- for coin, coin_id in selected_coins.items():
29
- url = f'https://api.coincap.io/v2/assets/{coin_id}/history'
30
- params = {
31
- 'interval': 'm15', # Intervalle de 15 minutes
32
- 'start': int(start_time.timestamp() * 1000), # Timestamp en millisecondes
33
- 'end': int(end_time.timestamp() * 1000)
34
- }
35
- response = requests.get(url, params=params)
36
- if response.status_code == 200:
37
- data = response.json().get('data', [])
38
- prices[coin] = [[int(item['time']), float(item['priceUsd'])] for item in data]
39
- else:
40
- st.error(f"Erreur lors de la récupération des prix pour {coin}: {response.status_code}")
41
- return prices
42
-
43
- # Fonction de prédiction (simple extrapolation basée sur la tendance)
44
- def predict_future_prices(data, future_hours=24):
45
  # Convertir les données en DataFrame
46
  df = pd.DataFrame(data, columns=["timestamp", "price"])
47
  df["timestamp"] = pd.to_datetime(df["timestamp"], unit="ms")
48
  df.set_index("timestamp", inplace=True)
49
 
50
- # Calculer la tendance moyenne des 48 dernières heures
51
- trend = (df["price"].iloc[-1] - df["price"].iloc[0]) / len(df)
52
-
53
  # Générer les futures timestamps
54
  last_timestamp = df.index[-1]
55
  future_timestamps = [last_timestamp + timedelta(minutes=15 * i) for i in range(1, (future_hours * 60 // 15) + 1)]
56
 
57
- # Générer les futurs prix en extrapolant la tendance
58
  last_price = df["price"].iloc[-1]
59
- future_prices = [last_price + i * trend for i in range(1, len(future_timestamps) + 1)]
60
-
61
- # Retourner un DataFrame des prédictions
62
- future_df = pd.DataFrame({"timestamp": future_timestamps, "price": future_prices})
63
- return future_df
64
-
65
- # Streamlit App
66
- st.title("Analyse Multi-Crypto avec Prédictions (CoinCap)")
67
- st.sidebar.header("Paramètres")
68
-
69
- # Choix des cryptomonnaies
70
- selected_coins = st.sidebar.multiselect(
71
- "Choisissez les cryptomonnaies",
72
- list(coins.keys()),
73
- default=["Bitcoin", "Ethereum"]
74
- )
75
-
76
- # Choix de la devise
77
- selected_currency = st.sidebar.selectbox(
78
- "Choisissez la devise",
79
- list(currencies.keys()),
80
- index=0
81
- )
82
-
83
- # Période de temps
84
- end_time = datetime.now()
85
- start_time = end_time - timedelta(hours=48) # Dernières 48 heures
86
-
87
- # Conversion des sélections en IDs
88
- selected_coin_ids = {coin: coins[coin] for coin in selected_coins}
89
-
90
- # Récupération des données
91
- st.write(f"### Données pour : {', '.join(selected_coins)} en {selected_currency}")
92
- crypto_prices = get_crypto_prices(selected_coin_ids, start_time, end_time)
93
-
94
- # Affichage des graphiques avec prédictions
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
  for coin, price_data in crypto_prices.items():
96
  if price_data:
97
  # Convertir les données en DataFrame
98
  df = pd.DataFrame(price_data, columns=["timestamp", "price"])
99
  df["timestamp"] = pd.to_datetime(df["timestamp"], unit="ms")
100
 
101
- # Prédiction des 24 prochaines heures
102
- future_df = predict_future_prices(price_data, future_hours=24)
103
 
104
- # Affichage du graphique
105
- st.write(f"#### {coin} - Prix en {selected_currency}")
106
  fig, ax = plt.subplots(figsize=(12, 6))
107
 
108
  # Graphique des prix réels
109
  ax.plot(df["timestamp"], df["price"], label="Prix réel", color="blue")
110
 
111
- # Graphique des prédictions
112
- ax.plot(future_df["timestamp"], future_df["price"], label="Prédiction (24h)", color="orange", linestyle="dashed")
 
 
 
 
 
 
 
 
113
 
114
  # Ajustements
115
  ax.set_title(f"{coin} - Prix (48h réels + 24h prévus)")
 
1
+ # Fonction pour appliquer différents patterns
2
+ def predict_patterns(data, future_hours=24):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  # Convertir les données en DataFrame
4
  df = pd.DataFrame(data, columns=["timestamp", "price"])
5
  df["timestamp"] = pd.to_datetime(df["timestamp"], unit="ms")
6
  df.set_index("timestamp", inplace=True)
7
 
 
 
 
8
  # Générer les futures timestamps
9
  last_timestamp = df.index[-1]
10
  future_timestamps = [last_timestamp + timedelta(minutes=15 * i) for i in range(1, (future_hours * 60 // 15) + 1)]
11
 
12
+ # Calculer des métriques utiles
13
  last_price = df["price"].iloc[-1]
14
+ trend = (df["price"].iloc[-1] - df["price"].iloc[0]) / len(df)
15
+ sma = df["price"].rolling(window=10).mean().iloc[-1] # Moyenne mobile simple (sur 10 points)
16
+ ema = df["price"].ewm(span=10, adjust=False).mean().iloc[-1] # Moyenne mobile exponentielle
17
+
18
+ # Liste des patterns
19
+ patterns = {}
20
+
21
+ # 1. Tendance linéaire
22
+ patterns["Trend"] = [last_price + i * trend for i in range(1, len(future_timestamps) + 1)]
23
+
24
+ # 2. Moyenne Mobile Simple
25
+ patterns["SMA"] = [sma] * len(future_timestamps)
26
+
27
+ # 3. Moyenne Mobile Exponentielle
28
+ patterns["EMA"] = [ema] * len(future_timestamps)
29
+
30
+ # 4. Cycle Répété
31
+ cycle_amplitude = (df["price"].max() - df["price"].min()) / 2
32
+ patterns["Cycle"] = [
33
+ last_price + cycle_amplitude * np.sin(2 * np.pi * i / len(future_timestamps))
34
+ for i in range(len(future_timestamps))
35
+ ]
36
+
37
+ # 5. Rebond
38
+ patterns["Rebound"] = [last_price + trend * (0.5 ** i) for i in range(len(future_timestamps))]
39
+
40
+ # 6. Effet Plateau
41
+ patterns["Plateau"] = [last_price] * len(future_timestamps)
42
+
43
+ # 7. Renversement de Tendance
44
+ reverse_trend = -trend
45
+ patterns["Reversal"] = [last_price + i * reverse_trend for i in range(len(future_timestamps))]
46
+
47
+ # 8. Récupération après Crash
48
+ mean_price = df["price"].mean()
49
+ patterns["Recovery"] = [last_price + (mean_price - last_price) * (i / len(future_timestamps)) for i in range(len(future_timestamps))]
50
+
51
+ # 9. Accélération de la Tendance
52
+ patterns["Acceleration"] = [last_price + (trend * 1.5) * i for i in range(len(future_timestamps))]
53
+
54
+ # 10. Volatilité Aléatoire
55
+ random_volatility = np.random.normal(0, trend * 0.5, len(future_timestamps))
56
+ patterns["Random"] = [last_price + sum(random_volatility[:i]) for i in range(len(future_timestamps))]
57
+
58
+ # Retourner les données des patterns avec leurs timestamps
59
+ pattern_dfs = {
60
+ pattern_name: pd.DataFrame({"timestamp": future_timestamps, "price": prices})
61
+ for pattern_name, prices in patterns.items()
62
+ }
63
+ return pattern_dfs
64
+
65
+ # Partie graphique intégrant les patterns
66
  for coin, price_data in crypto_prices.items():
67
  if price_data:
68
  # Convertir les données en DataFrame
69
  df = pd.DataFrame(price_data, columns=["timestamp", "price"])
70
  df["timestamp"] = pd.to_datetime(df["timestamp"], unit="ms")
71
 
72
+ # Générer les patterns de prédiction
73
+ patterns = predict_patterns(price_data, future_hours=24)
74
 
75
+ # Affichage des graphiques
76
+ st.write(f"#### {coin} - Prix et Prédictions en {selected_currency}")
77
  fig, ax = plt.subplots(figsize=(12, 6))
78
 
79
  # Graphique des prix réels
80
  ax.plot(df["timestamp"], df["price"], label="Prix réel", color="blue")
81
 
82
+ # Affichage des prédictions
83
+ colors = ["orange", "green", "red", "purple", "brown", "pink", "cyan", "black", "gray", "magenta"]
84
+ for i, (pattern_name, pattern_df) in enumerate(patterns.items()):
85
+ ax.plot(
86
+ pattern_df["timestamp"],
87
+ pattern_df["price"],
88
+ label=f"Prédiction ({pattern_name})",
89
+ linestyle="dashed",
90
+ color=colors[i % len(colors)]
91
+ )
92
 
93
  # Ajustements
94
  ax.set_title(f"{coin} - Prix (48h réels + 24h prévus)")