File size: 2,704 Bytes
93fe912
205053c
 
93fe912
c65698a
45d9bfe
c65698a
 
93fe912
 
 
45d9bfe
 
 
 
 
 
93fe912
 
45d9bfe
 
 
 
93fe912
 
45d9bfe
93fe912
45d9bfe
c65698a
 
 
 
 
45d9bfe
c65698a
45d9bfe
 
 
c65698a
 
45d9bfe
 
c65698a
 
 
 
 
 
 
45d9bfe
 
 
 
 
 
 
 
 
c65698a
 
 
 
 
93fe912
45d9bfe
93fe912
205053c
 
c65698a
93fe912
205053c
 
 
45d9bfe
205053c
93fe912
205053c
45d9bfe
93fe912
 
45d9bfe
 
 
205053c
45d9bfe
 
 
205053c
93fe912
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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
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()