Team Ai
Apppublic

enoelia/cripto_chart_app

sourceHugging Faceupdated 4y agoView on Hugging Face
0likes
app.py112 linesDownload Raw Back to root
1import streamlit as st2import requests3import pandas as pd4from datetime import date, datetime, timedelta5 6URL = 'http://api.coincap.io/v2/assets'7 8 9def get_request(url, params=None):10    return requests.get(url=url, params=params).json()11 12 13def get_id_from_coin_symbol(assets, symbol):14    return assets[assets['symbol'] == symbol]['id'].values[0]15 16 17def years_ago(years, from_date=None):18    if from_date is None:19        from_date = datetime.now()20    try:21        return from_date.replace(year=from_date.year - years)22    except ValueError:23        # Must be 2/2924        return from_date.replace(month=2, day=28,25                                 year=from_date.year-years)26 27 28def timestamp(date_value):29    dt = datetime.combine(date_value, datetime.min.time())30    epoch = datetime.utcfromtimestamp(0)31    return int((dt - epoch).total_seconds() * 1000)32 33 34def interval_detalization(date_from, date_to):35    if date_to - date_from > timedelta(days=120):36        return 'd1'37    elif date_to - date_from > timedelta(days=50):38        return 'h6'39    elif date_to - date_from > timedelta(days=5):40        return 'h1'41    else:42        return 'm15'43 44 45def prepare_data(data):46    df = pd.DataFrame(data)47    result = pd.DataFrame()48    result['PRICE'] = df['priceUsd'].astype(float)49    result['TIME'] = pd.to_datetime(df['date'])50    return result51 52 53def get_actual_data(assets):54    coin_id = get_id_from_coin_symbol(assets=assets, symbol=st.session_state['coin_symbol'])55    date_from = timestamp(st.session_state['date_from'])56    date_to = timestamp(st.session_state['date_to'])57    request_url = f'{URL}/{coin_id}/history'58    interval = interval_detalization(st.session_state['date_from'], st.session_state['date_to'])59    parameters = {60        'interval': interval,61        'start': date_from,62        'end': date_to,63    }64    grouped_data = prepare_data(get_request(url=request_url, params=parameters)['data'])65    return grouped_data66 67 68def main():69    @st.cache70    def get_assets_df():71        return pd.DataFrame(get_request(url=URL)['data'])72 73    today = date.today()74 75    if 'date_from' not in st.session_state:76        st.session_state['date_from'] = today - timedelta(weeks=1)77    if 'date_to' not in st.session_state:78        st.session_state['date_to'] = today79 80    assets_df = get_assets_df()81 82    st.sidebar.selectbox(83        label='Select an asset',84        key='coin_symbol',85        options=assets_df['symbol'])86 87    scol1, scol2 = st.sidebar.columns(2)88 89    minimum_available_date=years_ago(years=11,90                                     from_date=today+timedelta(days=1))91 92    scol1.date_input(93        label="Date from",94        key='date_from',95        value=st.session_state['date_from'],96        min_value=minimum_available_date,97        max_value=st.session_state['date_to'] - timedelta(days=1)98    )99 100    scol2.date_input(101        label="Date to",102        key='date_to',103        value=st.session_state['date_to'],104        min_value=st.session_state['date_from'] + timedelta(days=1),105        max_value=today)106 107    grouped_data = get_actual_data(assets=assets_df)108    st.bar_chart(grouped_data, y='PRICE', x='TIME')109 110if __name__ == "__main__":111    main()112