<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Matt Spence</title>
<link>https://www.mattspence.com/posts/</link>
<atom:link href="https://www.mattspence.com/posts/index.xml" rel="self" type="application/rss+xml"/>
<description>This is Matt Spence&#39;s personal landing page and occasional blog</description>
<generator>quarto-1.8.26</generator>
<lastBuildDate>Sat, 04 Mar 2023 00:00:00 GMT</lastBuildDate>
<item>
  <title>Revisiting Opening Day Win-Loss Statistics</title>
  <dc:creator>Matthew Spence</dc:creator>
  <link>https://www.mattspence.com/posts/2023/03/opening-day-revisited/</link>
  <description><![CDATA[ 





<p>I wanted to revisit my <a href="../../../../posts/2015/04/opening-day/index.html">earlier post</a> about opening day win-loss statistics to update the numbers with eight additional years of data and also to fix the a few issues that I didn’t have the skills to address back in 2015.</p>
<p>First, my old script had separate entries for the two teams that renamed themselves during the period — the Los Angeles (California) Angels and the Miami (Florida) Marlins. I wanted those combined, no question. I also wondered about what to do with a franchise that renamed itself and moved. Should the Expos and the Nationals really get combined into a single franchise record?</p>
<p>My first attempts to fix the former and keep the Nats/Expos apart were unsuccessful. I combined the renamed teams by creating the win-loss records by <code>team_id</code> (as before), but then merging those with the historical franchise ID (<code>hist_franchise_id</code>, as before) <em>and</em> bringing over the <code>current_team_id</code> as well.</p>
<div class="cell" data-execution_count="1">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> os, requests, zipfile, io</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> IPython.display <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> HTML, Markdown</span>
<span id="cb1-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#from itables import show</span></span>
<span id="cb1-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb1-5"></span>
<span id="cb1-6">DATADIR <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> os.path.join(os.getenv(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MY_PROJECT_DIR"</span>), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"data"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gl"</span>)</span>
<span id="cb1-7">YEARSTART, YEAREND <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1980</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2022</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># will add +1 to YEAREND for range()</span></span>
<span id="cb1-8"></span>
<span id="cb1-9"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">not</span> os.path.exists(DATADIR):</span>
<span id="cb1-10">    os.makedirs(DATADIR)</span>
<span id="cb1-11"></span>
<span id="cb1-12"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">not</span> os.path.exists(os.path.join(DATADIR,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"CurrentNames.csv"</span>)):</span>
<span id="cb1-13">    r <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> requests.get(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://www.retrosheet.org/CurrentNames.csv"</span>)</span>
<span id="cb1-14">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">with</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">open</span>(os.path.join(DATADIR,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"CurrentNames.csv"</span>),<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"w"</span>) <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> f:</span>
<span id="cb1-15">        f.write(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"current_team_id,hist_franchise_id,league,division,location,nickname,alt_nickname,first_used,last_used,city,state</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb1-16">        f.write(r.text)</span>
<span id="cb1-17"></span>
<span id="cb1-18"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> year <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(YEARSTART,YEAREND<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>): </span>
<span id="cb1-19">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">not</span> os.path.exists(os.path.join(DATADIR,<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"gl</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>year<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">.txt"</span>)):</span>
<span id="cb1-20">        zip_file_url <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"https://www.retrosheet.org/gamelogs/gl</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>year<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">.zip"</span></span>
<span id="cb1-21">        r <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> requests.get(zip_file_url)</span>
<span id="cb1-22">        z <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> zipfile.ZipFile(io.BytesIO(r.content))</span>
<span id="cb1-23">        z.extractall(path<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>DATADIR)</span>
<span id="cb1-24"></span>
<span id="cb1-25">fields <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'date'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'visit_team_id'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'visit_team_league'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'visit_game_number'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'home_team_id'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'home_team_league'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'home_game_number'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'visit_final_score'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'home_final_score'</span>]</span>
<span id="cb1-26">cols <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>]</span>
<span id="cb1-27"></span>
<span id="cb1-28"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> assign_outcome(row):</span>
<span id="cb1-29">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> row.final_score<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span>row.opponent_final_score:</span>
<span id="cb1-30">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'W'</span></span>
<span id="cb1-31">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">elif</span> row.final_score<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;</span>row.opponent_final_score:</span>
<span id="cb1-32">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'L'</span></span>
<span id="cb1-33">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span>:</span>
<span id="cb1-34">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'T'</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2000's opening of Reds vs Brewers ended in an official tie</span></span>
<span id="cb1-35"></span>
<span id="cb1-36"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> read_in_data(year):</span>
<span id="cb1-37">    dat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.read_csv(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>DATADIR<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">/gl</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>year<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">.txt"</span>, header<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>,names<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>fields, usecols<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cols, parse_dates<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'date'</span>])</span>
<span id="cb1-38">    v <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> dat.loc[dat.visit_game_number<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,].rename(columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: x.replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'visit_'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">''</span>)).rename(columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: x.replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'home_'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'opponent_'</span>))</span>
<span id="cb1-39">    h <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> dat.loc[dat.home_game_number<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,].rename(columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: x.replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'home_'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">''</span>)).rename(columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: x.replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'visit_'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'opponent_'</span>))</span>
<span id="cb1-40">    games <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.concat([v,h], ignore_index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb1-41">    games[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'outcome'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> games.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">apply</span>(assign_outcome,axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb1-42">    games[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'season'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> year</span>
<span id="cb1-43">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> games</span>
<span id="cb1-44"></span>
<span id="cb1-45">teamnames <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.read_csv(os.path.join(DATADIR,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'CurrentNames.csv'</span>), parse_dates<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'first_used'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'last_used'</span>]) </span>
<span id="cb1-46"></span>
<span id="cb1-47">dflist <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb1-48"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> year <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(YEARSTART,YEAREND<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>):</span>
<span id="cb1-49">    g <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> read_in_data(year)</span>
<span id="cb1-50">    dflist.append(g)</span>
<span id="cb1-51">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># df = pd.concat([df,g], ignore_index=True)</span></span>
<span id="cb1-52"></span>
<span id="cb1-53">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.concat(dflist, ignore_index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, sort<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb1-54"></span>
<span id="cb1-55"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># def f(group):</span></span>
<span id="cb1-56"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#     return pd.DataFrame({'count': group.value_counts(),</span></span>
<span id="cb1-57"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#                          'total': group.size})</span></span>
<span id="cb1-58"></span>
<span id="cb1-59">winpct <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (df.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'team_id'</span>).<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">apply</span>(<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: x.outcome.value_counts()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>x.outcome.size, include_groups<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>).<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>)[:,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"W"</span>].sort_values(ascending<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb1-60"></span>
<span id="cb1-61">wlcnt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> df.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'team_id'</span>).<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">apply</span>(<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: x.outcome.value_counts(), include_groups<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>).unstack(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb1-62"></span>
<span id="cb1-63"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># drop any team name that was last_used before the start of our analysis. </span></span>
<span id="cb1-64"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># "Drop duplicates" by current_team_id and hist_franchise_id will get rid of divisional changes (e.g. Pirates moving from NL E to NL C in 1994) and minor name changes (TBA Devil Rays --&gt; Rays; Anaheim Angles --&gt; LA Angels)</span></span>
<span id="cb1-65">pctteams <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> teamnames[(teamnames[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'last_used'</span>].dt.year<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span>YEARSTART)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|</span>(teamnames[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'last_used'</span>].isna())].drop_duplicates(subset<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'current_team_id'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'hist_franchise_id'</span>], keep<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"last"</span>) </span>
<span id="cb1-66"></span>
<span id="cb1-67">wlcntteam <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.merge(wlcnt, pctteams[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'current_team_id'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'hist_franchise_id'</span>]], left_index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, right_on<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'hist_franchise_id'</span>, how<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"left"</span>).groupby([<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'current_team_id'</span>])[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'W'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'L'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'T'</span>]].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>()</span>
<span id="cb1-68"></span>
<span id="cb1-69">finaltable <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.merge(wlcntteam, pctteams, left_index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, right_on<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'hist_franchise_id'</span>, how<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"left"</span>).assign(Team <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: x[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'location'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">" "</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> x[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'nickname'</span>], WnPct <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(x[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'W'</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>(x[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'W'</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span>x[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'L'</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span>x[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'T'</span>]), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>)).rename(columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>{<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'W'</span>:<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Wins'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'L'</span>:<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Losses'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'T'</span>:<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Ties'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'WnPct'</span>:<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Win (%)'</span>})[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Team'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Wins'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Losses'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Ties'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Win (%)'</span>]].sort_values(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Win (%)"</span>, ascending<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb1-70"></span>
<span id="cb1-71">HTML(finaltable.to_html(index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>))  </span></code></pre></div></div>
</details>
<div id="tbl-openingday-winpct" class="cell quarto-float quarto-figure quarto-figure-center anchored" data-execution_count="1">
<figure class="quarto-float quarto-float-tbl figure">
<figcaption class="quarto-float-caption-top quarto-float-caption quarto-float-tbl" id="tbl-openingday-winpct-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Table&nbsp;1: Opening Day Records, 1980 – 2022
</figcaption>
<div aria-describedby="tbl-openingday-winpct-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<div class="cell-output cell-output-display" data-execution_count="1">
<table class="dataframe do-not-create-environment cell caption-top table table-sm table-striped small" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th">Team</th>
<th data-quarto-table-cell-role="th">Wins</th>
<th data-quarto-table-cell-role="th">Losses</th>
<th data-quarto-table-cell-role="th">Ties</th>
<th data-quarto-table-cell-role="th">Win (%)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>New York Mets</td>
<td>31.0</td>
<td>12.0</td>
<td>0.0</td>
<td>72.1</td>
</tr>
<tr class="even">
<td>Baltimore Orioles</td>
<td>28.0</td>
<td>15.0</td>
<td>0.0</td>
<td>65.1</td>
</tr>
<tr class="odd">
<td>Seattle Mariners</td>
<td>26.0</td>
<td>17.0</td>
<td>0.0</td>
<td>60.5</td>
</tr>
<tr class="even">
<td>Chicago White Sox</td>
<td>25.0</td>
<td>18.0</td>
<td>0.0</td>
<td>58.1</td>
</tr>
<tr class="odd">
<td>Los Angeles Dodgers</td>
<td>25.0</td>
<td>18.0</td>
<td>0.0</td>
<td>58.1</td>
</tr>
<tr class="even">
<td>Detroit Tigers</td>
<td>25.0</td>
<td>18.0</td>
<td>0.0</td>
<td>58.1</td>
</tr>
<tr class="odd">
<td>Cincinnati Reds</td>
<td>24.0</td>
<td>18.0</td>
<td>1.0</td>
<td>55.8</td>
</tr>
<tr class="even">
<td>St. Louis Cardinals</td>
<td>23.0</td>
<td>20.0</td>
<td>0.0</td>
<td>53.5</td>
</tr>
<tr class="odd">
<td>New York Yankees</td>
<td>23.0</td>
<td>20.0</td>
<td>0.0</td>
<td>53.5</td>
</tr>
<tr class="even">
<td>Toronto Blue Jays</td>
<td>23.0</td>
<td>20.0</td>
<td>0.0</td>
<td>53.5</td>
</tr>
<tr class="odd">
<td>San Francisco Giants</td>
<td>23.0</td>
<td>20.0</td>
<td>0.0</td>
<td>53.5</td>
</tr>
<tr class="even">
<td>Houston Astros</td>
<td>23.0</td>
<td>20.0</td>
<td>0.0</td>
<td>53.5</td>
</tr>
<tr class="odd">
<td>Colorado Rockies</td>
<td>16.0</td>
<td>14.0</td>
<td>0.0</td>
<td>53.3</td>
</tr>
<tr class="even">
<td>Tampa Bay Rays</td>
<td>13.0</td>
<td>12.0</td>
<td>0.0</td>
<td>52.0</td>
</tr>
<tr class="odd">
<td>Arizona Diamondbacks</td>
<td>13.0</td>
<td>12.0</td>
<td>0.0</td>
<td>52.0</td>
</tr>
<tr class="even">
<td>Atlanta Braves</td>
<td>22.0</td>
<td>21.0</td>
<td>0.0</td>
<td>51.2</td>
</tr>
<tr class="odd">
<td>Milwaukee Brewers</td>
<td>22.0</td>
<td>20.0</td>
<td>1.0</td>
<td>51.2</td>
</tr>
<tr class="even">
<td>Chicago Cubs</td>
<td>21.0</td>
<td>22.0</td>
<td>0.0</td>
<td>48.8</td>
</tr>
<tr class="odd">
<td>Pittsburgh Pirates</td>
<td>20.0</td>
<td>23.0</td>
<td>0.0</td>
<td>46.5</td>
</tr>
<tr class="even">
<td>Los Angeles Angels</td>
<td>20.0</td>
<td>23.0</td>
<td>0.0</td>
<td>46.5</td>
</tr>
<tr class="odd">
<td>Boston Red Sox</td>
<td>20.0</td>
<td>23.0</td>
<td>0.0</td>
<td>46.5</td>
</tr>
<tr class="even">
<td>Washington Nationals</td>
<td>20.0</td>
<td>23.0</td>
<td>0.0</td>
<td>46.5</td>
</tr>
<tr class="odd">
<td>Texas Rangers</td>
<td>19.0</td>
<td>24.0</td>
<td>0.0</td>
<td>44.2</td>
</tr>
<tr class="even">
<td>Miami Marlins</td>
<td>12.0</td>
<td>18.0</td>
<td>0.0</td>
<td>40.0</td>
</tr>
<tr class="odd">
<td>Philadelphia Phillies</td>
<td>17.0</td>
<td>26.0</td>
<td>0.0</td>
<td>39.5</td>
</tr>
<tr class="even">
<td>Oakland Athletics</td>
<td>17.0</td>
<td>26.0</td>
<td>0.0</td>
<td>39.5</td>
</tr>
<tr class="odd">
<td>San Diego Padres</td>
<td>17.0</td>
<td>26.0</td>
<td>0.0</td>
<td>39.5</td>
</tr>
<tr class="even">
<td>Minnesota Twins</td>
<td>17.0</td>
<td>26.0</td>
<td>0.0</td>
<td>39.5</td>
</tr>
<tr class="odd">
<td>Cleveland Indians</td>
<td>16.0</td>
<td>27.0</td>
<td>0.0</td>
<td>37.2</td>
</tr>
<tr class="even">
<td>Kansas City Royals</td>
<td>15.0</td>
<td>28.0</td>
<td>0.0</td>
<td>34.9</td>
</tr>
</tbody>
</table>
</div>
</div>
</figure>
</div>
</div>
<div class="cell" data-execution_count="2">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1">wlcntteam_bycity <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.merge(wlcnt, pctteams[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'current_team_id'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'hist_franchise_id'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'city'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'state'</span>]], left_index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, right_on<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'hist_franchise_id'</span>, how<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"left"</span>).groupby([<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'current_team_id'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'city'</span>])[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'W'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'L'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'T'</span>]].<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>().reset_index()</span>
<span id="cb2-2"></span>
<span id="cb2-3">wlcntteam_bycity.loc[wlcntteam_bycity[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'city'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Montreal"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"current_team_id"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MON"</span></span>
<span id="cb2-4"></span>
<span id="cb2-5">finaltable_exposfix <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.merge(wlcntteam_bycity, pctteams, left_on<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'current_team_id'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'city'</span>], right_on<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'hist_franchise_id'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'city'</span>], how<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"left"</span>).assign(Team <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: x[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'location'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">" "</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> x[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'nickname'</span>], WnPct <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(x[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'W'</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>(x[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'W'</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span>x[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'L'</span>]<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span>x[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'T'</span>]), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>)).rename(columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>{<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'W'</span>:<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Wins'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'L'</span>:<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Losses'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'T'</span>:<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Ties'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'WnPct'</span>:<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Win (%)'</span>})[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Team'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Wins'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Losses'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Ties'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Win (%)'</span>]].sort_values(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Win (%)"</span>, ascending<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb2-6"></span>
<span id="cb2-7">HTML(finaltable_exposfix.to_html(index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>))  </span></code></pre></div></div>
</details>
<div id="tbl-openingday-winpct-exposfix" class="cell quarto-float quarto-figure quarto-figure-center anchored" data-execution_count="2">
<figure class="quarto-float quarto-float-tbl figure">
<figcaption class="quarto-float-caption-top quarto-float-caption quarto-float-tbl" id="tbl-openingday-winpct-exposfix-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Table&nbsp;2: Opening Day Records, 1980 – 2022, Expos and Nationals separated
</figcaption>
<div aria-describedby="tbl-openingday-winpct-exposfix-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<div class="cell-output cell-output-display" data-execution_count="2">
<table class="dataframe do-not-create-environment cell caption-top table table-sm table-striped small" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th">Team</th>
<th data-quarto-table-cell-role="th">Wins</th>
<th data-quarto-table-cell-role="th">Losses</th>
<th data-quarto-table-cell-role="th">Ties</th>
<th data-quarto-table-cell-role="th">Win (%)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>New York Mets</td>
<td>31.0</td>
<td>12.0</td>
<td>0.0</td>
<td>72.1</td>
</tr>
<tr class="even">
<td>Baltimore Orioles</td>
<td>28.0</td>
<td>15.0</td>
<td>0.0</td>
<td>65.1</td>
</tr>
<tr class="odd">
<td>Seattle Mariners</td>
<td>26.0</td>
<td>17.0</td>
<td>0.0</td>
<td>60.5</td>
</tr>
<tr class="even">
<td>Chicago White Sox</td>
<td>25.0</td>
<td>18.0</td>
<td>0.0</td>
<td>58.1</td>
</tr>
<tr class="odd">
<td>Los Angeles Dodgers</td>
<td>25.0</td>
<td>18.0</td>
<td>0.0</td>
<td>58.1</td>
</tr>
<tr class="even">
<td>Detroit Tigers</td>
<td>25.0</td>
<td>18.0</td>
<td>0.0</td>
<td>58.1</td>
</tr>
<tr class="odd">
<td>Cincinnati Reds</td>
<td>24.0</td>
<td>18.0</td>
<td>1.0</td>
<td>55.8</td>
</tr>
<tr class="even">
<td>Toronto Blue Jays</td>
<td>23.0</td>
<td>20.0</td>
<td>0.0</td>
<td>53.5</td>
</tr>
<tr class="odd">
<td>Houston Astros</td>
<td>23.0</td>
<td>20.0</td>
<td>0.0</td>
<td>53.5</td>
</tr>
<tr class="even">
<td>St. Louis Cardinals</td>
<td>23.0</td>
<td>20.0</td>
<td>0.0</td>
<td>53.5</td>
</tr>
<tr class="odd">
<td>San Francisco Giants</td>
<td>23.0</td>
<td>20.0</td>
<td>0.0</td>
<td>53.5</td>
</tr>
<tr class="even">
<td>New York Yankees</td>
<td>23.0</td>
<td>20.0</td>
<td>0.0</td>
<td>53.5</td>
</tr>
<tr class="odd">
<td>Colorado Rockies</td>
<td>16.0</td>
<td>14.0</td>
<td>0.0</td>
<td>53.3</td>
</tr>
<tr class="even">
<td>Tampa Bay Rays</td>
<td>13.0</td>
<td>12.0</td>
<td>0.0</td>
<td>52.0</td>
</tr>
<tr class="odd">
<td>Arizona Diamondbacks</td>
<td>13.0</td>
<td>12.0</td>
<td>0.0</td>
<td>52.0</td>
</tr>
<tr class="even">
<td>Atlanta Braves</td>
<td>22.0</td>
<td>21.0</td>
<td>0.0</td>
<td>51.2</td>
</tr>
<tr class="odd">
<td>Milwaukee Brewers</td>
<td>22.0</td>
<td>20.0</td>
<td>1.0</td>
<td>51.2</td>
</tr>
<tr class="even">
<td>Chicago Cubs</td>
<td>21.0</td>
<td>22.0</td>
<td>0.0</td>
<td>48.8</td>
</tr>
<tr class="odd">
<td>Montreal Expos</td>
<td>12.0</td>
<td>13.0</td>
<td>0.0</td>
<td>48.0</td>
</tr>
<tr class="even">
<td>Pittsburgh Pirates</td>
<td>20.0</td>
<td>23.0</td>
<td>0.0</td>
<td>46.5</td>
</tr>
<tr class="odd">
<td>Los Angeles Angels</td>
<td>20.0</td>
<td>23.0</td>
<td>0.0</td>
<td>46.5</td>
</tr>
<tr class="even">
<td>Boston Red Sox</td>
<td>20.0</td>
<td>23.0</td>
<td>0.0</td>
<td>46.5</td>
</tr>
<tr class="odd">
<td>Washington Nationals</td>
<td>8.0</td>
<td>10.0</td>
<td>0.0</td>
<td>44.4</td>
</tr>
<tr class="even">
<td>Texas Rangers</td>
<td>19.0</td>
<td>24.0</td>
<td>0.0</td>
<td>44.2</td>
</tr>
<tr class="odd">
<td>Miami Marlins</td>
<td>12.0</td>
<td>18.0</td>
<td>0.0</td>
<td>40.0</td>
</tr>
<tr class="even">
<td>Philadelphia Phillies</td>
<td>17.0</td>
<td>26.0</td>
<td>0.0</td>
<td>39.5</td>
</tr>
<tr class="odd">
<td>San Diego Padres</td>
<td>17.0</td>
<td>26.0</td>
<td>0.0</td>
<td>39.5</td>
</tr>
<tr class="even">
<td>Oakland Athletics</td>
<td>17.0</td>
<td>26.0</td>
<td>0.0</td>
<td>39.5</td>
</tr>
<tr class="odd">
<td>Minnesota Twins</td>
<td>17.0</td>
<td>26.0</td>
<td>0.0</td>
<td>39.5</td>
</tr>
<tr class="even">
<td>Cleveland Indians</td>
<td>16.0</td>
<td>27.0</td>
<td>0.0</td>
<td>37.2</td>
</tr>
<tr class="odd">
<td>Kansas City Royals</td>
<td>15.0</td>
<td>28.0</td>
<td>0.0</td>
<td>34.9</td>
</tr>
</tbody>
</table>
</div>
</div>
</figure>
</div>
</div>


<!-- -->


 ]]></description>
  <category>baseball</category>
  <category>code</category>
  <guid>https://www.mattspence.com/posts/2023/03/opening-day-revisited/</guid>
  <pubDate>Sat, 04 Mar 2023 00:00:00 GMT</pubDate>
  <media:content url="https://www.mattspence.com/posts/2023/03/opening-day-revisited/patrick_corbin.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Opening Day</title>
  <dc:creator>Matthew Spence</dc:creator>
  <link>https://www.mattspence.com/posts/2015/04/opening-day/</link>
  <description><![CDATA[ 





<p>In honor of Opening Day (and the Nats’ loss), I wanted to see which teams have had the most success on opening day.</p>
<p>It’s…the Mets (?)</p>
<div class="cell" data-execution_count="1">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> os, requests, zipfile, io</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> IPython.display <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> HTML<span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#, Markdown</span></span>
<span id="cb1-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#from itables import show</span></span>
<span id="cb1-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb1-5"></span>
<span id="cb1-6">DATADIR <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> os.path.join(os.getenv(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MY_PROJECT_DIR"</span>), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"data"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gl"</span>) <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># This is not how I coded </span></span>
<span id="cb1-7"></span>
<span id="cb1-8"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">not</span> os.path.exists(DATADIR):</span>
<span id="cb1-9">    os.makedirs(DATADIR)</span>
<span id="cb1-10"></span>
<span id="cb1-11">DOWNLOADFROMRS <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span></span>
<span id="cb1-12"></span>
<span id="cb1-13"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> DOWNLOADFROMRS:</span>
<span id="cb1-14">    r <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> requests.get(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://www.retrosheet.org/CurrentNames.csv"</span>)</span>
<span id="cb1-15">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">with</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">open</span>(os.path.join(DATADIR,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"CurrentNames.csv"</span>),<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"w"</span>) <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> f:</span>
<span id="cb1-16">        f.write(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"current_team_id,hist_franchise_id,league,division,location,nickname,alt_nickname,first_used,last_used,city,state</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb1-17">        f.write(r.text)</span>
<span id="cb1-18"></span>
<span id="cb1-19"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""</span></span>
<span id="cb1-20"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">From https://www.retrosheet.org/Nickname.htm:</span></span>
<span id="cb1-21"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">The fields are:</span></span>
<span id="cb1-22"></span>
<span id="cb1-23"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">Current franchise ID</span></span>
<span id="cb1-24"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">Franchise ID (may the same as current one) for earlier data</span></span>
<span id="cb1-25"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">League</span></span>
<span id="cb1-26"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">Division (blank before divisional play)</span></span>
<span id="cb1-27"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">Location name (e.g. Brooklyn, Texas)</span></span>
<span id="cb1-28"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">Nickname</span></span>
<span id="cb1-29"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">Alternate nicknames (blank if none for the period)</span></span>
<span id="cb1-30"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">Date of the first game with this combination</span></span>
<span id="cb1-31"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">Date of the last game with combination (blank if current one)</span></span>
<span id="cb1-32"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">City</span></span>
<span id="cb1-33"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">State</span></span>
<span id="cb1-34"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""</span></span>
<span id="cb1-35"></span>
<span id="cb1-36"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> DOWNLOADFROMRS:</span>
<span id="cb1-37">    r <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> requests.get(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://www.retrosheet.org/gamelogs/glfields.txt"</span>)</span>
<span id="cb1-38">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">with</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">open</span>(os.path.join(DATADIR, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"glfields.txt"</span>),<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"w"</span>) <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> f:</span>
<span id="cb1-39">        f.write(r.text)</span>
<span id="cb1-40"></span>
<span id="cb1-41"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> DOWNLOADFROMRS:</span>
<span id="cb1-42">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> y <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1980</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2015</span>):</span>
<span id="cb1-43">        zip_file_url <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"https://www.retrosheet.org/gamelogs/gl</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>y<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">.zip"</span></span>
<span id="cb1-44">        r <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> requests.get(zip_file_url)</span>
<span id="cb1-45">        z <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> zipfile.ZipFile(io.BytesIO(r.content))</span>
<span id="cb1-46">        z.extractall(path<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>DATADIR)</span>
<span id="cb1-47"></span>
<span id="cb1-48">fields <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'date'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'visit_team_id'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'visit_team_league'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'visit_game_number'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'home_team_id'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'home_team_league'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'home_game_number'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'visit_final_score'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'home_final_score'</span>]</span>
<span id="cb1-49">cols <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>]</span>
<span id="cb1-50"></span>
<span id="cb1-51">namefields <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'current_team_id'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'hist_franchise_id'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'league'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'division'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'location'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'nickname'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'alt_nickname'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'first_used'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'last_used'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'city'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'state'</span>]</span>
<span id="cb1-52"></span>
<span id="cb1-53"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> assign_outcome(row):</span>
<span id="cb1-54">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> row.final_score<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span>row.opponent_final_score:</span>
<span id="cb1-55">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'W'</span></span>
<span id="cb1-56">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">elif</span> row.final_score<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;</span>row.opponent_final_score:</span>
<span id="cb1-57">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'L'</span></span>
<span id="cb1-58"></span>
<span id="cb1-59"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> read_in_data(year):</span>
<span id="cb1-60">    dat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.read_csv(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>DATADIR<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">/GL</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>year<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">.txt"</span>, header<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>,names<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>fields, usecols<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cols, parse_dates<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'date'</span>])</span>
<span id="cb1-61">    v <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> dat.loc[dat.visit_game_number<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,].rename(columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: x.replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'visit_'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">''</span>)).rename(columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: x.replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'home_'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'opponent_'</span>))</span>
<span id="cb1-62">    h <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> dat.loc[dat.home_game_number<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,].rename(columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: x.replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'home_'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">''</span>)).rename(columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: x.replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'visit_'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'opponent_'</span>))</span>
<span id="cb1-63">    games <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.concat([v,h], ignore_index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb1-64">    games[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'outcome'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> games.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">apply</span>(assign_outcome,axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb1-65">    games[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'season'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> year</span>
<span id="cb1-66">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> games</span>
<span id="cb1-67"></span>
<span id="cb1-68">teamnames <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.read_csv(os.path.join(DATADIR,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'CurrentNames.csv'</span>), parse_dates<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'first_used'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'last_used'</span>]) </span>
<span id="cb1-69"></span>
<span id="cb1-70">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.DataFrame()</span>
<span id="cb1-71"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> year <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1980</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2015</span>):</span>
<span id="cb1-72">    g <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> read_in_data(year)</span>
<span id="cb1-73">    df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.concat([df,g], ignore_index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb1-74"></span>
<span id="cb1-75">teamsgrouped <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> df.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'team_id'</span>)</span>
<span id="cb1-76"></span>
<span id="cb1-77">pct <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> teamsgrouped.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">apply</span>(<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: x.outcome.value_counts()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>x.outcome.size).<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span></span>
<span id="cb1-78">pct <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pct.unstack(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb1-79">pct <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pct.sort_values(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'W'</span>, ascending<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>) <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">## decent answer here, but let's merge in team names</span></span>
<span id="cb1-80"></span>
<span id="cb1-81">pctteamids <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">list</span>(pct.index.values)</span>
<span id="cb1-82">pctteams <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> teamnames[teamnames.hist_franchise_id.isin(pctteamids)].sort_values(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'last_used'</span>).drop_duplicates(subset<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'hist_franchise_id'</span>,keep<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"last"</span>)</span>
<span id="cb1-83"></span>
<span id="cb1-84">finaltable <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pct.merge(pctteams, left_index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, right_on<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'hist_franchise_id'</span>, how<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"left"</span>).reset_index().assign(Team <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: x[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'location'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">" "</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> x[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'nickname'</span>]).rename(columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>{<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'W'</span>:<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Wins'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'L'</span>:<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Losses'</span>})[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Team'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Wins'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'Losses'</span>]]</span>
<span id="cb1-85"></span>
<span id="cb1-86">HTML(finaltable.to_html(index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>))  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># alternative to using the itables package</span></span>
<span id="cb1-87"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># with pd.option_context("display.float_format", "{:,.1f}%".format):</span></span>
<span id="cb1-88"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#     show(finaltable, dom="lrtp", lengthMenu = [5,10,len(finaltable)]) #paging=False to show full table</span></span></code></pre></div></div>
</details>
<div id="tbl-openingday-winpct" class="cell quarto-float quarto-figure quarto-figure-center anchored" data-execution_count="1">
<figure class="quarto-float quarto-float-tbl figure">
<figcaption class="quarto-float-caption-top quarto-float-caption quarto-float-tbl" id="tbl-openingday-winpct-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Table&nbsp;1: Opening Day Records, 1980 – 2014
</figcaption>
<div aria-describedby="tbl-openingday-winpct-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<div class="cell-output cell-output-display" data-execution_count="1">
<table class="dataframe do-not-create-environment cell caption-top table table-sm table-striped small" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th">Team</th>
<th data-quarto-table-cell-role="th">Wins</th>
<th data-quarto-table-cell-role="th">Losses</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>New York Mets</td>
<td>71.4</td>
<td>28.6</td>
</tr>
<tr class="even">
<td>Baltimore Orioles</td>
<td>65.7</td>
<td>34.3</td>
</tr>
<tr class="odd">
<td>Chicago White Sox</td>
<td>65.7</td>
<td>34.3</td>
</tr>
<tr class="even">
<td>Los Angeles Angels</td>
<td>61.1</td>
<td>38.9</td>
</tr>
<tr class="odd">
<td>Seattle Mariners</td>
<td>60.0</td>
<td>40.0</td>
</tr>
<tr class="even">
<td>Arizona Diamondbacks</td>
<td>58.8</td>
<td>41.2</td>
</tr>
<tr class="odd">
<td>Atlanta Braves</td>
<td>57.1</td>
<td>42.9</td>
</tr>
<tr class="even">
<td>Los Angeles Dodgers</td>
<td>54.3</td>
<td>45.7</td>
</tr>
<tr class="odd">
<td>San Francisco Giants</td>
<td>54.3</td>
<td>45.7</td>
</tr>
<tr class="even">
<td>New York Yankees</td>
<td>54.3</td>
<td>45.7</td>
</tr>
<tr class="odd">
<td>Cincinnati Reds</td>
<td>54.3</td>
<td>42.9</td>
</tr>
<tr class="even">
<td>Milwaukee Brewers</td>
<td>54.3</td>
<td>42.9</td>
</tr>
<tr class="odd">
<td>Detroit Tigers</td>
<td>54.3</td>
<td>45.7</td>
</tr>
<tr class="even">
<td>Tampa Bay Rays</td>
<td>52.9</td>
<td>47.1</td>
</tr>
<tr class="odd">
<td>Florida Marlins</td>
<td>52.6</td>
<td>47.4</td>
</tr>
<tr class="even">
<td>Toronto Blue Jays</td>
<td>51.4</td>
<td>48.6</td>
</tr>
<tr class="odd">
<td>St. Louis Cardinals</td>
<td>51.4</td>
<td>48.6</td>
</tr>
<tr class="even">
<td>Colorado Rockies</td>
<td>50.0</td>
<td>50.0</td>
</tr>
<tr class="odd">
<td>Texas Rangers</td>
<td>48.6</td>
<td>51.4</td>
</tr>
<tr class="even">
<td>Pittsburgh Pirates</td>
<td>48.6</td>
<td>51.4</td>
</tr>
<tr class="odd">
<td>Montreal Expos</td>
<td>48.0</td>
<td>52.0</td>
</tr>
<tr class="even">
<td>California Angels</td>
<td>47.1</td>
<td>52.9</td>
</tr>
<tr class="odd">
<td>Chicago Cubs</td>
<td>45.7</td>
<td>54.3</td>
</tr>
<tr class="even">
<td>Boston Red Sox</td>
<td>45.7</td>
<td>54.3</td>
</tr>
<tr class="odd">
<td>Houston Astros</td>
<td>42.9</td>
<td>57.1</td>
</tr>
<tr class="even">
<td>Washington Nationals</td>
<td>40.0</td>
<td>60.0</td>
</tr>
<tr class="odd">
<td>San Diego Padres</td>
<td>40.0</td>
<td>60.0</td>
</tr>
<tr class="even">
<td>Minnesota Twins</td>
<td>40.0</td>
<td>60.0</td>
</tr>
<tr class="odd">
<td>Cleveland Indians</td>
<td>40.0</td>
<td>60.0</td>
</tr>
<tr class="even">
<td>Philadelphia Phillies</td>
<td>37.1</td>
<td>62.9</td>
</tr>
<tr class="odd">
<td>Oakland Athletics</td>
<td>37.1</td>
<td>62.9</td>
</tr>
<tr class="even">
<td>Miami Marlins</td>
<td>33.3</td>
<td>66.7</td>
</tr>
<tr class="odd">
<td>Kansas City Royals</td>
<td>28.6</td>
<td>71.4</td>
</tr>
</tbody>
</table>
</div>
</div>
</figure>
</div>
</div>
<p>Here’s how I did it:</p>
<p>I downloaded<sup>1</sup> game logs from 1980 – 2014 from <a href="http://www.retrosheet.org/gamelogs/index.html">RetroSheet</a> and wrote the following script to analyze them. The key was changing the “dyadic” structure of the raw game logs (one row contains information about the two teams playing the game) into one that had one row for each team. I did this in the <code>read_in_data</code> function:</p>
<div class="cell" data-execution_count="2">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> read_in_data(year):</span>
<span id="cb2-2">    dat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.read_csv(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>DATADIR<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">/GL</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>year<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">.txt"</span>, header<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>,names<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>fields, usecols<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>cols, parse_dates<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'date'</span>])</span>
<span id="cb2-3">    v <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> dat.loc[dat.visit_game_number<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,].rename(columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: x.replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'visit_'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">''</span>)).rename(columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: x.replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'home_'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'opponent_'</span>))</span>
<span id="cb2-4">    h <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> dat.loc[dat.home_game_number<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,].rename(columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: x.replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'home_'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">''</span>)).rename(columns<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> x: x.replace(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'visit_'</span>,<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'opponent_'</span>))</span>
<span id="cb2-5">    games <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.concat([v,h], ignore_index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb2-6">    games[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'outcome'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> games.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">apply</span>(assign_outcome,axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb2-7">    games[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'season'</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> year</span>
<span id="cb2-8">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> games</span></code></pre></div></div>
</div>
<p>Here’s an example of one year’s worth of gamelog data once it’s been run through <code>read_in_data</code>. 2014 was a bit of an odd season, since the <a href="https://www.mlb.com/schedule/2014-03-22">Dodgers and the Diamondbacks started their seasons on March 22</a> by <a href="https://sabr.org/gamesproj/game/march-22-2014-opening-day-down-under-as-dodgers-defeat-diamondbacks/">playing three exhibition games in Syndey, Australia</a>. Each team went on to be another team’s opening day opponent – the Dodgers faced the Padres and the Diamondbacks went up against the Giants.</p>
<div class="cell page-columns page-full" data-execution_count="3">
<div class="cell-output cell-output-display column-page" data-execution_count="2">
<table class="dataframe caption-top table table-sm table-striped small" data-border="1">
<thead>
<tr class="header">
<th data-quarto-table-cell-role="th">date</th>
<th data-quarto-table-cell-role="th">team_id</th>
<th data-quarto-table-cell-role="th">game_number</th>
<th data-quarto-table-cell-role="th">opponent_team_id</th>
<th data-quarto-table-cell-role="th">opponent_game_number</th>
<th data-quarto-table-cell-role="th">final_score</th>
<th data-quarto-table-cell-role="th">opponent_final_score</th>
<th data-quarto-table-cell-role="th">outcome</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>2014-03-22</td>
<td>LAN</td>
<td>1</td>
<td>ARI</td>
<td>1</td>
<td>3</td>
<td>1</td>
<td>W</td>
</tr>
<tr class="even">
<td>2014-03-22</td>
<td>ARI</td>
<td>1</td>
<td>LAN</td>
<td>1</td>
<td>1</td>
<td>3</td>
<td>L</td>
</tr>
<tr class="odd">
<td>2014-03-30</td>
<td>SDN</td>
<td>1</td>
<td>LAN</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>W</td>
</tr>
<tr class="even">
<td>2014-03-31</td>
<td>MIA</td>
<td>1</td>
<td>COL</td>
<td>1</td>
<td>10</td>
<td>1</td>
<td>W</td>
</tr>
<tr class="odd">
<td>2014-03-31</td>
<td>CIN</td>
<td>1</td>
<td>SLN</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>L</td>
</tr>
<tr class="even">
<td>2014-03-31</td>
<td>TEX</td>
<td>1</td>
<td>PHI</td>
<td>1</td>
<td>10</td>
<td>14</td>
<td>L</td>
</tr>
<tr class="odd">
<td>2014-03-31</td>
<td>TBA</td>
<td>1</td>
<td>TOR</td>
<td>1</td>
<td>9</td>
<td>2</td>
<td>W</td>
</tr>
<tr class="even">
<td>2014-03-31</td>
<td>OAK</td>
<td>1</td>
<td>CLE</td>
<td>1</td>
<td>0</td>
<td>2</td>
<td>L</td>
</tr>
<tr class="odd">
<td>2014-03-31</td>
<td>DET</td>
<td>1</td>
<td>KCA</td>
<td>1</td>
<td>4</td>
<td>3</td>
<td>W</td>
</tr>
<tr class="even">
<td>2014-03-31</td>
<td>CHA</td>
<td>1</td>
<td>MIN</td>
<td>1</td>
<td>5</td>
<td>3</td>
<td>W</td>
</tr>
<tr class="odd">
<td>2014-03-31</td>
<td>BAL</td>
<td>1</td>
<td>BOS</td>
<td>1</td>
<td>2</td>
<td>1</td>
<td>W</td>
</tr>
<tr class="even">
<td>2014-03-31</td>
<td>ANA</td>
<td>1</td>
<td>SEA</td>
<td>1</td>
<td>3</td>
<td>10</td>
<td>L</td>
</tr>
<tr class="odd">
<td>2014-03-31</td>
<td>PIT</td>
<td>1</td>
<td>CHN</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>W</td>
</tr>
<tr class="even">
<td>2014-03-31</td>
<td>CHN</td>
<td>1</td>
<td>PIT</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>L</td>
</tr>
<tr class="odd">
<td>2014-03-31</td>
<td>WAS</td>
<td>1</td>
<td>NYN</td>
<td>1</td>
<td>9</td>
<td>7</td>
<td>W</td>
</tr>
<tr class="even">
<td>2014-03-31</td>
<td>ATL</td>
<td>1</td>
<td>MIL</td>
<td>1</td>
<td>0</td>
<td>2</td>
<td>L</td>
</tr>
<tr class="odd">
<td>2014-03-31</td>
<td>COL</td>
<td>1</td>
<td>MIA</td>
<td>1</td>
<td>1</td>
<td>10</td>
<td>L</td>
</tr>
<tr class="even">
<td>2014-03-31</td>
<td>SLN</td>
<td>1</td>
<td>CIN</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>W</td>
</tr>
<tr class="odd">
<td>2014-03-31</td>
<td>SFN</td>
<td>1</td>
<td>ARI</td>
<td>3</td>
<td>9</td>
<td>8</td>
<td>W</td>
</tr>
<tr class="even">
<td>2014-03-31</td>
<td>PHI</td>
<td>1</td>
<td>TEX</td>
<td>1</td>
<td>14</td>
<td>10</td>
<td>W</td>
</tr>
<tr class="odd">
<td>2014-03-31</td>
<td>TOR</td>
<td>1</td>
<td>TBA</td>
<td>1</td>
<td>2</td>
<td>9</td>
<td>L</td>
</tr>
<tr class="even">
<td>2014-03-31</td>
<td>CLE</td>
<td>1</td>
<td>OAK</td>
<td>1</td>
<td>2</td>
<td>0</td>
<td>W</td>
</tr>
<tr class="odd">
<td>2014-03-31</td>
<td>KCA</td>
<td>1</td>
<td>DET</td>
<td>1</td>
<td>3</td>
<td>4</td>
<td>L</td>
</tr>
<tr class="even">
<td>2014-03-31</td>
<td>MIN</td>
<td>1</td>
<td>CHA</td>
<td>1</td>
<td>3</td>
<td>5</td>
<td>L</td>
</tr>
<tr class="odd">
<td>2014-03-31</td>
<td>BOS</td>
<td>1</td>
<td>BAL</td>
<td>1</td>
<td>1</td>
<td>2</td>
<td>L</td>
</tr>
<tr class="even">
<td>2014-03-31</td>
<td>SEA</td>
<td>1</td>
<td>ANA</td>
<td>1</td>
<td>10</td>
<td>3</td>
<td>W</td>
</tr>
<tr class="odd">
<td>2014-03-31</td>
<td>MIL</td>
<td>1</td>
<td>ATL</td>
<td>1</td>
<td>2</td>
<td>0</td>
<td>W</td>
</tr>
<tr class="even">
<td>2014-03-31</td>
<td>NYN</td>
<td>1</td>
<td>WAS</td>
<td>1</td>
<td>7</td>
<td>9</td>
<td>L</td>
</tr>
<tr class="odd">
<td>2014-04-01</td>
<td>NYA</td>
<td>1</td>
<td>HOU</td>
<td>1</td>
<td>2</td>
<td>6</td>
<td>L</td>
</tr>
<tr class="even">
<td>2014-04-01</td>
<td>HOU</td>
<td>1</td>
<td>NYA</td>
<td>1</td>
<td>6</td>
<td>2</td>
<td>W</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>The results table includes two teams that have renamed themselves (the Angels and the Marlins), and one that moved and changed names (Expos). I’d like to update my script to deal with these, but should I really lump the Expos in with the Nats?</p>
<p>Also, I was relieved to see the Dodgers and the Giants were tied, at least.</p>


<!-- -->



<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>I did this manually back in 2015, but as I was porting this to the new site, I wrote a script to automatically download and unzip the files.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>baseball</category>
  <category>code</category>
  <guid>https://www.mattspence.com/posts/2015/04/opening-day/</guid>
  <pubDate>Thu, 09 Apr 2015 00:00:00 GMT</pubDate>
  <media:content url="https://www.mattspence.com/posts/2015/04/opening-day/max-scherzer-031215.jpg" medium="image" type="image/jpeg"/>
</item>
</channel>
</rss>
