Predictions / app.py
Enoder's picture
Update app.py
707da7e verified
Raw
History Blame Contribute Delete
5.98 kB
import streamlit as st
import requests
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime, timedelta
from sklearn.metrics import mean_squared_error
# Fonction pour récupérer les prix historiques
def get_crypto_prices(coins, start_time, end_time, interval='m15'):
prices = {}
for coin, coin_id in coins.items():
url = f'https://api.coincap.io/v2/assets/{coin_id}/history'
params = {
'interval': interval,
'start': int(start_time.timestamp() * 1000),
'end': int(end_time.timestamp() * 1000)
}
response = requests.get(url, params=params)
if response.status_code == 200:
data = response.json().get('data', [])
prices[coin] = [[int(item['time']), float(item['priceUsd'])] for item in data]
if data:
prices[coin].append([int(end_time.timestamp() * 1000), float(data[-1]['priceUsd'])])
else:
st.error(f"Erreur lors de la récupération des prix pour {coin}: {response.status_code}")
st.write(response.text) # Debug pour afficher l'erreur complète
return prices
# Fonction pour prédire les tendances basées sur les patterns
def predict_patterns(data, future_hours=24):
df = pd.DataFrame(data, columns=["timestamp", "price"])
df["timestamp"] = pd.to_datetime(df["timestamp"], unit="ms")
df.set_index("timestamp", inplace=True)
last_timestamp = df.index[-1]
future_timestamps = [last_timestamp + timedelta(hours=i) for i in range(1, future_hours + 1)]
last_price = df["price"].iloc[-1]
trend = (df["price"].iloc[-1] - df["price"].iloc[0]) / len(df)
sma = df["price"].rolling(window=10).mean().iloc[-1]
ema = df["price"].ewm(span=10, adjust=False).mean().iloc[-1]
cycle_amplitude = (df["price"].max() - df["price"].min()) / 2
mean_price = df["price"].mean()
# Prédictions initiales (Courbe jaune)
predictions = {
"Trend": [last_price + i * trend for i in range(1, len(future_timestamps) + 1)],
"SMA": [sma] * len(future_timestamps),
"EMA": [ema] * len(future_timestamps),
"Cycle": [
last_price + cycle_amplitude * np.sin(2 * np.pi * i / len(future_timestamps))
for i in range(len(future_timestamps))
]
}
return predictions, future_timestamps
# Fonction pour rechercher un pattern similaire
def find_similar_pattern(df, prediction, future_hours=24):
# Calculer la similarité entre la courbe prédite et les patterns passés
mse_scores = {}
for i in range(len(df) - future_hours): # Exclure la dernière période pour éviter la correspondance avec elle-même
past_pattern = df["price"].iloc[i:i + future_hours].values
mse = mean_squared_error(past_pattern, prediction[:len(past_pattern)])
mse_scores[i] = mse
# Trouver l'indice du pattern le plus similaire
best_match_index = min(mse_scores, key=mse_scores.get)
similar_pattern = df["price"].iloc[best_match_index:best_match_index + future_hours].values
return similar_pattern
# Fonction pour générer une prédiction dynamique (Courbe verte)
def generate_dynamic_prediction(df, initial_prediction, future_hours=24):
green_prediction = []
# Première prédiction
green_prediction.extend(initial_prediction)
# Boucle pour ajuster la prédiction à chaque étape
for i in range(future_hours // 5): # Prédiction par segments de 5 heures
start_idx = i * 5
end_idx = (i + 1) * 5
# Prendre les 5 dernières valeurs et chercher un pattern similaire
similar_pattern = find_similar_pattern(df, green_prediction[start_idx:end_idx], future_hours=5)
# Ajouter le pattern similaire à la prédiction
green_prediction.extend(similar_pattern)
# Création des timestamps de prévision pour la courbe verte
future_timestamps = pd.date_range(start=df.index[-1], periods=len(green_prediction) + 1, freq='H')[1:]
return green_prediction, future_timestamps
# Configuration des dates
end_time = datetime.now()
start_time = end_time - timedelta(days=7) # Plage sur les 7 derniers jours
# Liste des cryptos avec leurs IDs corrects sur CoinCap
coins = {
"Bitcoin": "bitcoin",
"Ripple": "xrp",
"Ethereum": "ethereum",
"Tether": "tether",
"Stellar": "stellar"
}
# Récupération des prix
crypto_prices = get_crypto_prices(coins, start_time, end_time)
# Affichage des graphiques
st.title("Analyse et Prédictions des Cryptos avec Patterns")
for coin, price_data in crypto_prices.items():
if price_data:
df = pd.DataFrame(price_data, columns=["timestamp", "price"])
df["timestamp"] = pd.to_datetime(df["timestamp"], unit="ms")
# Générer les prédictions initiales (jaune)
predictions, future_timestamps = predict_patterns(price_data, future_hours=24)
# Sélectionner une prédiction (par exemple Trend)
initial_prediction = predictions["Trend"]
# Générer la prédiction dynamique (verte)
green_prediction, green_future_timestamps = generate_dynamic_prediction(df, initial_prediction, future_hours=24)
# Affichage des résultats
st.write(f"#### {coin} - Prix et Prédictions")
fig, ax = plt.subplots(figsize=(12, 6))
ax.plot(df["timestamp"], df["price"], label="Prix réel", color="blue")
# Courbe de prédiction initiale (jaune)
ax.plot(future_timestamps, initial_prediction, label="Prédiction initiale (jaune)", linestyle="--", color="yellow")
# Courbe de prédiction dynamique (verte)
ax.plot(green_future_timestamps, green_prediction, label="Prédiction dynamique (verte)", linestyle="--", color="green")
ax.set_title(f"{coin} - Prix (7 derniers jours + 24h prévus)")
ax.set_xlabel("Date")
ax.set_ylabel("Prix (USD)")
ax.legend()
st.pyplot(fig)