enoelia/cripto_chart_app
0
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 