|
2717 | 2717 | <DF> = <DF>[row_bools] <span class="hljs-comment"># Keeps rows as specified by bools.</span>
|
2718 | 2718 | <DF> = <DF>[<DF_of_bools>] <span class="hljs-comment"># Assigns NaN to False values.</span>
|
2719 | 2719 | </code></pre>
|
2720 |
| -<pre><code class="python language-python hljs"><DF> = <DF> ><== <el/Sr/DF> <span class="hljs-comment"># Returns DataFrame of bools.</span> |
| 2720 | +<pre><code class="python language-python hljs"><DF> = <DF> ><== <el/Sr/DF> <span class="hljs-comment"># Returns DF of bools. Sr is treated as a row.</span> |
2721 | 2721 | <DF> = <DF> +-*/ <el/Sr/DF> <span class="hljs-comment"># Items with non-matching keys get value NaN.</span>
|
2722 | 2722 | </code></pre>
|
2723 | 2723 | <pre><code class="python language-python hljs"><DF> = <DF>.set_index(column_key) <span class="hljs-comment"># Replaces row keys with values from a column.</span>
|
|
2879 | 2879 |
|
2880 | 2880 | <div><h4 id="confirmedcovidcasesdowjonesgoldandbitcoinprice">Confirmed covid cases, Dow Jones, gold, and Bitcoin price:</h4><p></p><div id="e23ccacc-a456-478b-b467-7282a2165921" class="plotly-graph-div" style="height:315px; width:100%;"></div><pre><code class="python language-python hljs"><span class="hljs-keyword">import</span> pandas <span class="hljs-keyword">as</span> pd
|
2881 | 2881 | <span class="hljs-keyword">import</span> plotly.graph_objects <span class="hljs-keyword">as</span> go
|
2882 |
| -<span class="hljs-keyword">import</span> datetime |
2883 | 2882 |
|
2884 | 2883 | <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
|
2885 | 2884 | display_data(wrangle_data(*scrape_data()))
|
2886 | 2885 |
|
2887 | 2886 | <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">scrape_data</span><span class="hljs-params">()</span>:</span>
|
2888 |
| - <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">scrape_yahoo</span><span class="hljs-params">(id_)</span>:</span> |
2889 |
| - BASE_URL = <span class="hljs-string">'https://query1.finance.yahoo.com/v7/finance/download/'</span> |
2890 |
| - now = int(datetime.datetime.now().timestamp()) |
2891 |
| - url = <span class="hljs-string">f'<span class="hljs-subst">{BASE_URL}</span><span class="hljs-subst">{id_}</span>?period1=1579651200&period2=<span class="hljs-subst">{now}</span>&interval=1d&events=history'</span> |
2892 |
| - <span class="hljs-keyword">return</span> pd.read_csv(url, usecols=[<span class="hljs-string">'Date'</span>, <span class="hljs-string">'Close'</span>]).set_index(<span class="hljs-string">'Date'</span>).Close |
2893 |
| - covid = pd.read_csv(<span class="hljs-string">'https://covid.ourworldindata.org/data/owid-covid-data.csv'</span>, |
2894 |
| - usecols=[<span class="hljs-string">'location'</span>, <span class="hljs-string">'date'</span>, <span class="hljs-string">'total_cases'</span>]) |
2895 |
| - covid = covid[covid.location == <span class="hljs-string">'World'</span>].set_index(<span class="hljs-string">'date'</span>).total_cases |
2896 |
| - dow, gold, bitcoin = [scrape_yahoo(id_) <span class="hljs-keyword">for</span> id_ <span class="hljs-keyword">in</span> (<span class="hljs-string">'^DJI'</span>, <span class="hljs-string">'GC=F'</span>, <span class="hljs-string">'BTC-USD'</span>)] |
2897 |
| - dow.name, gold.name, bitcoin.name = <span class="hljs-string">'Dow Jones'</span>, <span class="hljs-string">'Gold'</span>, <span class="hljs-string">'Bitcoin'</span> |
2898 |
| - <span class="hljs-keyword">return</span> covid, dow, gold, bitcoin |
2899 |
| - |
2900 |
| -<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">wrangle_data</span><span class="hljs-params">(covid, dow, gold, bitcoin)</span>:</span> |
2901 |
| - df = pd.concat([dow, gold, bitcoin], axis=<span class="hljs-number">1</span>) |
| 2887 | + <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">scrape_covid</span><span class="hljs-params">()</span>:</span> |
| 2888 | + url = <span class="hljs-string">'https://covid.ourworldindata.org/data/owid-covid-data.csv'</span> |
| 2889 | + df = pd.read_csv(url, usecols=[<span class="hljs-string">'location'</span>, <span class="hljs-string">'date'</span>, <span class="hljs-string">'total_cases'</span>]) |
| 2890 | + <span class="hljs-keyword">return</span> df[df.location == <span class="hljs-string">'World'</span>].set_index(<span class="hljs-string">'date'</span>).total_cases |
| 2891 | + <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">scrape_yahoo</span><span class="hljs-params">(slug)</span>:</span> |
| 2892 | + url = <span class="hljs-string">f'https://query1.finance.yahoo.com/v7/finance/download/<span class="hljs-subst">{slug}</span>'</span> + \ |
| 2893 | + <span class="hljs-string">'?period1=1579651200&period2=1608850800&interval=1d&events=history'</span> |
| 2894 | + df = pd.read_csv(url, usecols=[<span class="hljs-string">'Date'</span>, <span class="hljs-string">'Close'</span>]) |
| 2895 | + <span class="hljs-keyword">return</span> df.set_index(<span class="hljs-string">'Date'</span>).Close |
| 2896 | + <span class="hljs-keyword">return</span> scrape_covid(), scrape_yahoo(<span class="hljs-string">'BTC-USD'</span>), scrape_yahoo(<span class="hljs-string">'GC=F'</span>), scrape_yahoo(<span class="hljs-string">'^DJI'</span>) |
| 2897 | + |
| 2898 | +<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">wrangle_data</span><span class="hljs-params">(covid, bitcoin, gold, dow)</span>:</span> |
| 2899 | + df = pd.concat([bitcoin, gold, dow], axis=<span class="hljs-number">1</span>) |
2902 | 2900 | df = df.sort_index().interpolate()
|
2903 | 2901 | df = df.rolling(<span class="hljs-number">10</span>, min_periods=<span class="hljs-number">1</span>, center=<span class="hljs-keyword">True</span>).mean()
|
2904 | 2902 | df = df.loc[<span class="hljs-string">'2020-02-23'</span>:<span class="hljs-string">'2020-11-25'</span>]
|
2905 | 2903 | df = (df / df.iloc[<span class="hljs-number">0</span>]) * <span class="hljs-number">100</span>
|
2906 | 2904 | <span class="hljs-keyword">return</span> pd.concat([covid, df], axis=<span class="hljs-number">1</span>, join=<span class="hljs-string">'inner'</span>)
|
2907 | 2905 |
|
2908 | 2906 | <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">display_data</span><span class="hljs-params">(df)</span>:</span>
|
2909 |
| - <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_trace</span><span class="hljs-params">(col_name)</span>:</span> |
2910 |
| - <span class="hljs-keyword">return</span> go.Scatter(x=df.index, y=df[col_name], name=col_name, yaxis=<span class="hljs-string">'y2'</span>) |
2911 |
| - traces = [get_trace(col_name) <span class="hljs-keyword">for</span> col_name <span class="hljs-keyword">in</span> df.columns[<span class="hljs-number">1</span>:]] |
2912 |
| - traces.append(go.Scatter(x=df.index, y=df.total_cases, name=<span class="hljs-string">'Total Cases'</span>, yaxis=<span class="hljs-string">'y1'</span>)) |
| 2907 | + df.columns = [<span class="hljs-string">'Total Cases'</span>, <span class="hljs-string">'Bitcoin'</span>, <span class="hljs-string">'Gold'</span>, <span class="hljs-string">'Dow Jones'</span>] |
2913 | 2908 | figure = go.Figure()
|
2914 |
| - figure.add_traces(traces) |
| 2909 | + <span class="hljs-keyword">for</span> col_name <span class="hljs-keyword">in</span> df: |
| 2910 | + yaxis = <span class="hljs-string">'y1'</span> <span class="hljs-keyword">if</span> col_name == <span class="hljs-string">'Total Cases'</span> <span class="hljs-keyword">else</span> <span class="hljs-string">'y2'</span> |
| 2911 | + trace = go.Scatter(x=df.index, y=df[col_name], name=col_name, yaxis=yaxis) |
| 2912 | + figure.add_trace(trace) |
2915 | 2913 | figure.update_layout(
|
2916 | 2914 | yaxis1=dict(title=<span class="hljs-string">'Total Cases'</span>, rangemode=<span class="hljs-string">'tozero'</span>),
|
2917 | 2915 | yaxis2=dict(title=<span class="hljs-string">'%'</span>, rangemode=<span class="hljs-string">'tozero'</span>, overlaying=<span class="hljs-string">'y'</span>, side=<span class="hljs-string">'right'</span>),
|
|
0 commit comments