Update app.py
Browse files
app.py
CHANGED
|
@@ -1,115 +1,94 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 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 |
-
#
|
| 58 |
last_price = df["price"].iloc[-1]
|
| 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 |
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 |
-
#
|
| 102 |
-
|
| 103 |
|
| 104 |
-
# Affichage
|
| 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 |
-
#
|
| 112 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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)")
|