import streamlit as st import requests import pandas as pd from datetime import datetime import time import csv import threading from huggingface_hub import HfApi import os # Hugging Face Info HF_USERNAME = "abolfazle80" REPO_NAME = "crypto_data" CSV_FILENAME = "USDT.csv" HF_CSV_URL = f"https://huggingface.co/datasets/{HF_USERNAME}/{REPO_NAME}/resolve/main/{CSV_FILENAME}" # Define the markets (cryptocurrencies to monitor) markets = ['DOTUSDT', 'BTCUSDT', 'ADAUSDT', 'BNBUSDT', 'SUIUSDT', 'XRPUSDT'] # Initialize Hugging Face API api = HfApi() # 🔹 Initialize loop control variable (Fixed Global Issue) loop_running = False # Function to fetch data from CoinEx def get_crypto_price_from_coinex(symbol): url = 'https://api.coinex.com/v1/market/ticker' params = {'market': symbol} try: response = requests.get(url, params=params) response.raise_for_status() data = response.json() if 'data' in data: price = data['data']['ticker']['last'] volume = data['data']['ticker']['vol'] return [price, volume] else: return ["Symbol not found", "Symbol not found"] except Exception as e: st.error(f"Error fetching data: {e}") return ["Error", "Error"] # Function to download CSV from Hugging Face and save it locally def download_existing_csv(): try: response = requests.get(HF_CSV_URL) response.raise_for_status() with open(CSV_FILENAME, "wb") as file: file.write(response.content) df = pd.read_csv(CSV_FILENAME) return df except requests.exceptions.RequestException: return pd.DataFrame() # Return empty DataFrame if file doesn't exist # Function to upload the CSV back to Hugging Face def upload_to_huggingface(): try: api.upload_file( path_or_fileobj=CSV_FILENAME, path_in_repo=CSV_FILENAME, repo_id=f"{HF_USERNAME}/{REPO_NAME}", repo_type="dataset", ) print("✅ CSV successfully uploaded to Hugging Face.") except Exception as e: print(f"❌ Upload failed: {e}") # Function to fetch, append & update the CSV def fetch_data(): global loop_running # ✅ Fixed Scope Issue while loop_running: try: all_data = [] for market in markets: crypto_data = get_crypto_price_from_coinex(market) all_data += crypto_data timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S') all_data.append(timestamp) # Check if CSV exists locally; if not, download it if not os.path.exists(CSV_FILENAME): df_existing = download_existing_csv() else: df_existing = pd.read_csv(CSV_FILENAME) # Convert new data to DataFrame df_new = pd.DataFrame([all_data], columns=[f"{m} Price" for m in markets] + [f"{m} Volume" for m in markets] + ["Timestamp"]) # Append new data to existing data df_combined = pd.concat([df_existing, df_new], ignore_index=True) # Save updated data to CSV df_combined.to_csv(CSV_FILENAME, index=False) print(f"✅ {all_data} added to CSV and uploaded.") # Upload to Hugging Face upload_to_huggingface() time.sleep(1) # Fetch new data every second except Exception as e: st.error(f"An error occurred: {e}") loop_running = False # Streamlit UI st.title("🔄 Live Cryptocurrency Data Fetching") # Start Fetching Button if st.button("Start Fetching Data"): if not loop_running: # ✅ Fixed issue by ensuring variable scope loop_running = True threading.Thread(target=fetch_data, daemon=True).start() st.success("✅ Started fetching and saving data.") else: st.warning("⚠️ Fetching is already running.") # Stop Fetching Button if st.button("Stop Fetching Data"): loop_running = False st.success("🛑 Stopped fetching data.") # Show Latest Data st.text("📊 Latest Data from CSV:") # Ensure the file exists before reading it if not os.path.exists(CSV_FILENAME): download_existing_csv() try: df = pd.read_csv(CSV_FILENAME) st.write(df.tail()) # Show last 5 rows except Exception as e: st.error(f"Error reading CSV: {e}")