Appearance
Plotly
python
<Fig> = px.line(<DF>, x=col_key, y=col_key) # Or: px.line(x=<list>, y=<list>)
<Fig>.update_layout(margin=dict(t=0, r=0, b=0, l=0)) # Also `paper_bgcolor='rgb(0, 0, 0)'`.
<Fig>.write_html/json/image('<path>') # <Fig>.show() displays the plot.
python
<Fig> = px.area/bar/box(<DF>, x=col_key, y=col_key) # Also `color=col_key`.
<Fig> = px.scatter(<DF>, x=col_key, y=col_key) # Also `color/size/symbol=col_key`.
<Fig> = px.scatter_3d(<DF>, x=col_key, y=col_key, …) # `z=col_key`. Also color/size/symbol.
<Fig> = px.histogram(<DF>, x=col_key [, nbins=<int>]) # Number of bins depends on DF size.
Displays a line chart of total coronavirus deaths per million grouped by continent:
Displays a multi-axis line chart of total coronavirus cases and changes in prices of Bitcoin, Dow Jones and gold:
python
# $ pip3 install pandas selenium plotly lxml
import pandas as pd, selenium.webdriver, plotly.graph_objects as go
def main():
covid, (bitcoin, gold, dow) = get_covid_cases(), get_tickers()
df = wrangle_data(covid, bitcoin, gold, dow)
display_data(df)
def get_covid_cases():
url = 'https://covid.ourworldindata.org/data/owid-covid-data.csv'
df = pd.read_csv(url, usecols=['location', 'date', 'total_cases'], parse_dates=['date'])
df = df[df.location == 'World']
s = df.set_index('date').total_cases
return s.rename('Total Cases')
def get_tickers():
with selenium.webdriver.Chrome() as driver:
symbols = {'Bitcoin': 'BTC-USD', 'Gold': 'GC=F', 'Dow Jones': '%5EDJI'}
for name, symbol in symbols.items():
yield get_ticker(driver, name, symbol)
def get_ticker(driver, name, symbol):
url = f'https://finance.yahoo.com/quote/{symbol}/history/'
driver.get(url + '?period1=1579651200&period2=9999999999')
if buttons := driver.find_elements('xpath', '//button[@name="reject"]'):
buttons[0].click()
dataframes = pd.read_html(driver.page_source, parse_dates=['Date'])
s = dataframes[0].set_index('Date').Open
return s.rename(name)
def wrangle_data(covid, bitcoin, gold, dow):
df = pd.concat([bitcoin, gold, dow], axis=1) # Creates table by joining columns on dates.
df = df.sort_index().interpolate() # Sorts rows by date and interpolates NaN-s.
df = df.loc['2020-02-23':'2021-12-20'] # Keeps rows between specified dates.
df = (df / df.iloc[0]) * 100 # Calculates percentages relative to day 1.
df = df.join(covid) # Adds column with covid cases.
return df.sort_values(df.index[-1], axis=1) # Sorts columns by last day's value.
def display_data(df):
figure = go.Figure()
for col_name in reversed(df.columns):
yaxis = 'y1' if col_name == 'Total Cases' else 'y2'
trace = go.Scatter(x=df.index, y=df[col_name], name=col_name, yaxis=yaxis)
figure.add_trace(trace)
figure.update_layout(
width=944,
height=423,
yaxis1=dict(title='Total Cases', rangemode='tozero'),
yaxis2=dict(title='%', rangemode='tozero', overlaying='y', side='right'),
colorway=['#EF553B', '#636EFA', '#00CC96', '#FFA152'],
legend=dict(x=1.08)
)
figure.show()
if __name__ == '__main__':
main()