cryptoTester / frontpage.py
SamHastings1088's picture
first commit
642c876
#-------------------
# Imports
#-------------------
import streamlit as st
import yfinance as yf
import pandas as pd
import numpy as np
import plotly.graph_objs as go
import plotly.io as pio
from bs4 import BeautifulSoup
import requests
from datetime import datetime
# today's date
today = datetime.today().strftime('%d %B %Y')
st.set_page_config(layout="wide")
#-------------------
# Web scraping Yahoo Finance
#-------------------
dic = {}
url = 'https://finance.yahoo.com/cryptocurrencies?offset=0&count=100'
soup = BeautifulSoup(requests.get(url).text)
# store values in separate lists and then in a dictionary
for listing in soup.find_all('div', attrs={'id':'fin-scr-res-table'}):
symbol_list = []
name_list = []
price_list = []
change_list = []
mcap_list = []
for symbol in listing.find_all('td', attrs={'aria-label':'Symbol'}):
symbol_list.append(symbol.text)
dic['Symbol'] = symbol_list
for name in listing.find_all('td', attrs={'aria-label':'Name'}):
name_list.append(name.text)
dic['Name'] = name_list
for price in listing.find_all('td', attrs={'aria-label':'Price (Intraday)'}):
price_list.append(price.text)
dic['Price'] = price_list
for change in listing.find_all('td', attrs={'aria-label':'% Change'}):
change_list.append(change.text)
dic['% Change'] = change_list
for mcap in listing.find_all('td', attrs={'aria-label':'Market Cap'}):
mcap_list.append(mcap.text)
dic['Market Cap'] = mcap_list
# create a dataframe from dictionary
df_scrape = pd.DataFrame(dic)
df_scrape.Symbol = df_scrape.Symbol.str.replace('-USD','')
df_scrape.Name = df_scrape.Name.str.replace(' USD','')
dic1 = dict(zip(df_scrape.Symbol,df_scrape.Name))
#-------------------
# Streamlit Sidebar
#-------------------
fiat = ['USD','EUR','GBP']
tokens = df_scrape.Symbol.values
# filters selectbox
st.sidebar.title("Filters")
select_token = st.sidebar.selectbox('Tokens', tokens)
select_fiat = st.sidebar.selectbox('Fiat', fiat)
# special expander objects
st.sidebar.markdown('***')
with st.sidebar.expander('Help'):
st.markdown('''
- Select token and fiat of your choice.
- Interactive plots can be zoomed or hovered to retrieve more info.
- Plots can be downloaded using Plotly tools.''')
with st.sidebar.expander('Sources'):
st.markdown('''
- Python Libraries: yfinance, BeautifulSoup, Plotly, Pandas, Streamlit
- Prices: https://finance.yahoo.com
- Logos: https://cryptologos.cc/
''')
st.write("Dashboard adapted from https://github.com/rohithteja/the-crypto-dashboard")
#-------------------
# Add crypto logo and name
#-------------------
col1, col2 = st.columns([1,10])
with col1:
try:
st.image(f'logos/{select_token}.png',width=70)
except:
pass
with col2:
st.markdown(f'''## {dic1[select_token]}''')
#-------------------
# Candlestick chart with moving averages
#-------------------
st.markdown('''
- The following is an interactive Candlestick chart for the price fluctuations over the past 5 years.
- Simple moving averages were computed for 20, 50 and 100 day frequencies.
- Aids in trading strategy and to better interpret the price fluctuations.''')
# download 5 year crypto prices from Yahoo Finance
df = yf.download(tickers=f'{select_token}-{select_fiat}', period = '5y', interval = '1d')
# compute moving averages
df['MA100'] = df.Close.rolling(100).mean()
df['MA50'] = df.Close.rolling(50).mean()
df['MA20'] = df.Close.rolling(20).mean()
# Plotly candlestick chart
fig = go.Figure(data=
[go.Candlestick(x=df.index,
open=df.Open,
high=df.High,
low=df.Low,
close=df.Close,
name=f'{select_token}'),
go.Scatter(x=df.index, y=df.MA20,
line=dict(color='yellow',width=1),name='MA20'),
go.Scatter(x=df.index, y=df.MA50,
line=dict(color='green',width=1),name='MA50'),
go.Scatter(x=df.index, y=df.MA100,
line=dict(color='red',width=1),name='MA100')])
fig.update_layout(go.Layout(xaxis = {'showgrid': False},
yaxis = {'showgrid': False}),
title=f'{dic1[select_token]} Price Fluctuation with Moving Averages',
yaxis_title=f'Price ({select_fiat})',
xaxis_rangeslider_visible=False)
st.plotly_chart(fig, use_container_width=True)
#-------------------
# Line Chart with daily trends
#-------------------
st.markdown('## Daily Trends')
st.markdown(f'''
- Line graph below shows the price fluctuation of {dic1[select_token]} every minute for today's date ({today}).
- The data is automatically updated for the current day.
- The horizontal line shows the current day's open price.
- Green portion indicates the price greater than open price and red for lower.
''')
# download daily crypto prices from Yahoo Finance
df = yf.download(tickers=f'{select_token}-{select_fiat}', period = '1d', interval = '1m')
# Plotly line chart
fig = go.Figure()
fig.add_scattergl(x=df.index, y=df.Close,
line={'color': 'green'},name='Up trend')
fig.add_scattergl(x=df.index, y=df.Close.where(df.Close <= df.Open[0]),
line={'color': 'red'},name='Down trend')
fig.add_hline(y=df.Open[0])
fig.update_layout(go.Layout(xaxis = {'showgrid': False},
yaxis = {'showgrid': False}),
title=f'{dic1[select_token]} Daily Trends in Comparison to Open Price',
yaxis_title=f'Price ({select_fiat})',template='plotly_dark',
xaxis_rangeslider_visible=False)
st.plotly_chart(fig, use_container_width=True)
#-------------------
# Table showing top 25 cryptos
#-------------------
st.markdown('## Top 25 Cryptocurrency Prices and Stats')
st.markdown('''
- Realtime price changes (in USD).
- Values updated every few minutes.
- Colour coded column indicates the increase or decrease in price.
''')
# create table from webscraped data
df_scrape = df_scrape.rename(columns={'Symbol':'Token'})
df_scrape['% Change'] = df_scrape['% Change'].str.replace('%','').str.replace(',','').astype(float)
df_scrape["color"] = df_scrape["% Change"].map(lambda x:'red' if x<0 else 'green')
cols_to_show = ['Name','Token', 'Price', '% Change', 'Market Cap']
# to change color of "% change" column
fill_color = []
n = len(df_scrape)
for col in cols_to_show:
if col!='% Change':
fill_color.append(['black']*n)
else:
fill_color.append(df_scrape["color"].to_list())
# Plotly Table
data=[go.Table(columnwidth = [20,15,15,15,15],
header=dict(values=[f"<b>{col}</b>" for col in cols_to_show],
font=dict(color='white', size=20),
height=30,
line_color='black',
fill_color='dimgrey',
align=['left','left', 'right','right','right']),
cells=dict(values=df_scrape[cols_to_show].values.T,
fill_color=fill_color,
font=dict(color='white', size=20),
height=30,
line_color='black',
align=['left','left', 'right','right','right']))]
fig = go.Figure(data=data)
fig.update_layout(go.Layout(xaxis = {'showgrid': False},
yaxis = {'showgrid': False}))
st.plotly_chart(fig, use_container_width=True)