Skip to content

Commit 472e308

Browse files
committed
Datetime, Plotly, update_plots.py and updated plots
1 parent bc70a3b commit 472e308

File tree

7 files changed

+10893
-2778
lines changed

7 files changed

+10893
-2778
lines changed

README.md

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -598,12 +598,11 @@ from dateutil.tz import UTC, tzlocal, gettz, datetime_exists, resolve_imaginary
598598
<D> = date(year, month, day)
599599
<T> = time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, fold=0)
600600
<DT> = datetime(year, month, day, hour=0, minute=0, second=0, ...)
601-
<TD> = timedelta(days=0, seconds=0, microseconds=0, milliseconds=0,
602-
minutes=0, hours=0, weeks=0)
601+
<TD> = timedelta(weeks=0, days=0, hours=0, minutes=0, seconds=0, ...)
603602
```
604603
* **Use `'<D/DT>.weekday()'` to get the day of the week (Mon == 0).**
605604
* **`'fold=1'` means the second pass in case of time jumping back for one hour.**
606-
* **`'<DTa> = resolve_imaginary(<DTa>)'` fixes DTs that fall into the missing hour.**
605+
* **TD converts and normalizes args to ±days, seconds (< 86,400) and microseconds (< 1M).**
607606

608607
### Now
609608
```python
@@ -3390,7 +3389,7 @@ continents = pd.read_csv('https://gist.githubusercontent.com/stevewithington/20a
33903389
df = pd.merge(covid, continents, left_on='iso_code', right_on='Three_Letter_Country_Code')
33913390
df = df.groupby(['Continent_Name', 'date']).sum().reset_index()
33923391
df['Total Deaths per Million'] = df.total_deaths * 1e6 / df.population
3393-
df = df[('2020-03-14' < df.date) & (df.date < '2020-11-25')]
3392+
df = df[df.date > '2020-03-14']
33943393
df = df.rename({'date': 'Date', 'Continent_Name': 'Continent'}, axis='columns')
33953394
line(df, x='Date', y='Total Deaths per Million', color='Continent').show()
33963395
```
@@ -3414,23 +3413,23 @@ def scrape_data():
34143413
return df[df.location == 'World'].set_index('date').total_cases
34153414
def scrape_yahoo(slug):
34163415
url = f'https://query1.finance.yahoo.com/v7/finance/download/{slug}' + \
3417-
'?period1=1579651200&period2=1608850800&interval=1d&events=history'
3416+
'?period1=1579651200&period2=9999999999&interval=1d&events=history'
34183417
df = pd.read_csv(url, usecols=['Date', 'Close'])
34193418
return df.set_index('Date').Close
3420-
return scrape_covid(), scrape_yahoo('BTC-USD'), scrape_yahoo('GC=F'), scrape_yahoo('^DJI')
3419+
out = scrape_covid(), scrape_yahoo('BTC-USD'), scrape_yahoo('GC=F'), scrape_yahoo('^DJI')
3420+
return map(pd.Series.rename, out, ['Total Cases', 'Bitcoin', 'Gold', 'Dow Jones'])
34213421

34223422
def wrangle_data(covid, bitcoin, gold, dow):
3423-
df = pd.concat([bitcoin, gold, dow], axis=1)
3424-
df = df.sort_index().interpolate()
3425-
df = df.rolling(10, min_periods=1, center=True).mean()
3426-
df = df.loc['2020-02-23':'2020-11-25']
3427-
df = (df / df.iloc[0]) * 100
3428-
return pd.concat([covid, df], axis=1, join='inner')
3423+
df = pd.concat([bitcoin, gold, dow], axis=1) # Joins columns on dates.
3424+
df = df.sort_index().interpolate() # Sorts by date and interpolates NaN-s.
3425+
df = df.loc['2020-02-23':] # Discards rows before '2020-02-23'.
3426+
df = (df / df.iloc[0]) * 100 # Calculates percentages relative to day 1.
3427+
df = df.join(covid) # Adds column with covid cases.
3428+
return df.sort_values(df.index[-1], axis=1) # Sorts columns by last day's value.
34293429

34303430
def display_data(df):
3431-
df.columns = ['Total Cases', 'Bitcoin', 'Gold', 'Dow Jones']
34323431
figure = go.Figure()
3433-
for col_name in df:
3432+
for col_name in reversed(df.columns):
34343433
yaxis = 'y1' if col_name == 'Total Cases' else 'y2'
34353434
trace = go.Scatter(x=df.index, y=df[col_name], name=col_name, yaxis=yaxis)
34363435
figure.add_trace(trace)

index.html

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050

5151
<body>
5252
<header>
53-
<aside>December 17, 2021</aside>
53+
<aside>December 21, 2021</aside>
5454
<a href="https://gto76.github.io" rel="author">Jure Šorn</a>
5555
</header>
5656

@@ -524,14 +524,13 @@
524524
<div><h3 id="constructors">Constructors</h3><pre><code class="python language-python apache hljs">&lt;D&gt; = date(year, month, day)
525525
&lt;T&gt; = time(hour=<span class="hljs-number">0</span>, minute=<span class="hljs-number">0</span>, second=<span class="hljs-number">0</span>, microsecond=<span class="hljs-number">0</span>, tzinfo=<span class="hljs-keyword">None</span>, fold=<span class="hljs-number">0</span>)
526526
&lt;DT&gt; = datetime(year, month, day, hour=<span class="hljs-number">0</span>, minute=<span class="hljs-number">0</span>, second=<span class="hljs-number">0</span>, ...)
527-
&lt;TD&gt; = timedelta(days=<span class="hljs-number">0</span>, seconds=<span class="hljs-number">0</span>, microseconds=<span class="hljs-number">0</span>, milliseconds=<span class="hljs-number">0</span>,
528-
minutes=<span class="hljs-number">0</span>, hours=<span class="hljs-number">0</span>, weeks=<span class="hljs-number">0</span>)
527+
&lt;TD&gt; = timedelta(weeks=<span class="hljs-number">0</span>, days=<span class="hljs-number">0</span>, hours=<span class="hljs-number">0</span>, minutes=<span class="hljs-number">0</span>, seconds=<span class="hljs-number">0</span>, ...)
529528
</code></pre></div>
530529

531530
<ul>
532531
<li><strong>Use <code class="python hljs"><span class="hljs-string">'&lt;D/DT&gt;.weekday()'</span></code> to get the day of the week (Mon == 0).</strong></li>
533532
<li><strong><code class="python hljs"><span class="hljs-string">'fold=1'</span></code> means the second pass in case of time jumping back for one hour.</strong></li>
534-
<li><strong><code class="python hljs"><span class="hljs-string">'&lt;DTa&gt; = resolve_imaginary(&lt;DTa&gt;)'</span></code> fixes DTs that fall into the missing hour.</strong></li>
533+
<li><strong>TD converts and normalizes args to ±days, seconds (&lt; 86,400) and microseconds (&lt; 1M).</strong></li>
535534
</ul>
536535
<div><h3 id="now">Now</h3><pre><code class="python language-python hljs">&lt;D/DTn&gt; = D/DT.today() <span class="hljs-comment"># Current local date or naive datetime.</span>
537536
&lt;DTn&gt; = DT.utcnow() <span class="hljs-comment"># Naive datetime from current UTC time.</span>
@@ -2740,7 +2739,7 @@
27402739
df = pd.merge(covid, continents, left_on=<span class="hljs-string">'iso_code'</span>, right_on=<span class="hljs-string">'Three_Letter_Country_Code'</span>)
27412740
df = df.groupby([<span class="hljs-string">'Continent_Name'</span>, <span class="hljs-string">'date'</span>]).sum().reset_index()
27422741
df[<span class="hljs-string">'Total Deaths per Million'</span>] = df.total_deaths * <span class="hljs-number">1e6</span> / df.population
2743-
df = df[(<span class="hljs-string">'2020-03-14'</span> &lt; df.date) &amp; (df.date &lt; <span class="hljs-string">'2020-11-25'</span>)]
2742+
df = df[df.date &gt; <span class="hljs-string">'2020-03-14'</span>]
27442743
df = df.rename({<span class="hljs-string">'date'</span>: <span class="hljs-string">'Date'</span>, <span class="hljs-string">'Continent_Name'</span>: <span class="hljs-string">'Continent'</span>}, axis=<span class="hljs-string">'columns'</span>)
27452744
line(df, x=<span class="hljs-string">'Date'</span>, y=<span class="hljs-string">'Total Deaths per Million'</span>, color=<span class="hljs-string">'Continent'</span>).show()
27462745
</code></pre></div>
@@ -2760,23 +2759,23 @@
27602759
<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
27612760
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">scrape_yahoo</span><span class="hljs-params">(slug)</span>:</span>
27622761
url = <span class="hljs-string">f'https://query1.finance.yahoo.com/v7/finance/download/<span class="hljs-subst">{slug}</span>'</span> + \
2763-
<span class="hljs-string">'?period1=1579651200&amp;period2=1608850800&amp;interval=1d&amp;events=history'</span>
2762+
<span class="hljs-string">'?period1=1579651200&amp;period2=9999999999&amp;interval=1d&amp;events=history'</span>
27642763
df = pd.read_csv(url, usecols=[<span class="hljs-string">'Date'</span>, <span class="hljs-string">'Close'</span>])
27652764
<span class="hljs-keyword">return</span> df.set_index(<span class="hljs-string">'Date'</span>).Close
2766-
<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>)
2765+
out = 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>)
2766+
<span class="hljs-keyword">return</span> map(pd.Series.rename, out, [<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>])
27672767

27682768
<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>
2769-
df = pd.concat([bitcoin, gold, dow], axis=<span class="hljs-number">1</span>)
2770-
df = df.sort_index().interpolate()
2771-
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()
2772-
df = df.loc[<span class="hljs-string">'2020-02-23'</span>:<span class="hljs-string">'2020-11-25'</span>]
2773-
df = (df / df.iloc[<span class="hljs-number">0</span>]) * <span class="hljs-number">100</span>
2774-
<span class="hljs-keyword">return</span> pd.concat([covid, df], axis=<span class="hljs-number">1</span>, join=<span class="hljs-string">'inner'</span>)
2769+
df = pd.concat([bitcoin, gold, dow], axis=<span class="hljs-number">1</span>) <span class="hljs-comment"># Joins columns on dates.</span>
2770+
df = df.sort_index().interpolate() <span class="hljs-comment"># Sorts by date and interpolates NaN-s.</span>
2771+
df = df.loc[<span class="hljs-string">'2020-02-23'</span>:] <span class="hljs-comment"># Discards rows before '2020-02-23'.</span>
2772+
df = (df / df.iloc[<span class="hljs-number">0</span>]) * <span class="hljs-number">100</span> <span class="hljs-comment"># Calculates percentages relative to day 1.</span>
2773+
df = df.join(covid) <span class="hljs-comment"># Adds column with covid cases.</span>
2774+
<span class="hljs-keyword">return</span> df.sort_values(df.index[<span class="hljs-number">-1</span>], axis=<span class="hljs-number">1</span>) <span class="hljs-comment"># Sorts columns by last day's value.</span>
27752775

27762776
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">display_data</span><span class="hljs-params">(df)</span>:</span>
2777-
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>]
27782777
figure = go.Figure()
2779-
<span class="hljs-keyword">for</span> col_name <span class="hljs-keyword">in</span> df:
2778+
<span class="hljs-keyword">for</span> col_name <span class="hljs-keyword">in</span> reversed(df.columns):
27802779
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>
27812780
trace = go.Scatter(x=df.index, y=df[col_name], name=col_name, yaxis=yaxis)
27822781
figure.add_trace(trace)
@@ -2870,7 +2869,7 @@
28702869

28712870

28722871
<footer>
2873-
<aside>December 17, 2021</aside>
2872+
<aside>December 21, 2021</aside>
28742873
<a href="https://gto76.github.io" rel="author">Jure Šorn</a>
28752874
</footer>
28762875

0 commit comments

Comments
 (0)