import logging import requests import pandas as pd import streamlit as st from constants import COIN_API_ENDPOINT, BITCOIN_DATA_ANALYSIS_TITLE, TOOL_INVITATION_DESCRIPTION from market_data_calculator import MarketDataCalculator from data_retriever import DataRetriever import prediction import visualize # Logging setup logging.basicConfig( filename='app.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s' ) def apply_market_calculations(df, calculations): """Applies a series of market calculations on the DataFrame.""" for calculation in calculations: df = calculation(df) return df def visualize_data(df): """Visualizes the market data using various methods.""" visualize.market_data(df) visualize.volatility(df) visualize.trade_velocity(df) visualize.rsi_and_macd(df) def display_video(): """Displays a WEBM video.""" with open('app.webm', 'rb') as video_file: st.video(video_file.read(), format='video/webm') def fetch_and_predict_data(api_key, period): limit = DataRetriever.set_limit(period) url = f"{COIN_API_ENDPOINT}?period_id={period}&limit={limit}" headers = {"X-CoinAPI-Key": api_key} data = DataRetriever.retrieve_data(url, headers) if isinstance(data, list) and data: df = pd.DataFrame(data) calculations = [ MarketDataCalculator.convert_to_datetime, MarketDataCalculator.calculate_market_data, MarketDataCalculator.calculate_volatility, MarketDataCalculator.calculate_trade_velocity, MarketDataCalculator.calculate_rsi, MarketDataCalculator.calculate_macd ] df = apply_market_calculations(df, calculations) df = prediction.append_forecasted_data(df) return df else: st.write(f"Unexpected response format: {data}") return None def main(): st.title(BITCOIN_DATA_ANALYSIS_TITLE) st.write(TOOL_INVITATION_DESCRIPTION) display_video() col1, col2 = st.columns(2) api_key = col1.text_input('Enter your CoinAPI.io API Key:', type='password') period = col2.selectbox('Select the time period:', ['1HRS', '4HRS', '12HRS']) if api_key: try: df = fetch_and_predict_data(api_key, period) if df is not None: visualize_data(df) except requests.RequestException as e: logging.error(f"Request error: {e}") st.write(f"Request error: {e}") except Exception as e: logging.error(f"An unknown error occurred: {e}") st.write(f"An unknown error occurred: {e}") if __name__ == "__main__": main()