From 29976e932352aaf4bb81662b5540ddbb4b41c9cf Mon Sep 17 00:00:00 2001 From: 6c4b0fdbf8f14f2bf5b4f27e84287421 <6c4b0fdbf8f14f2bf5b4f27e84287421@app-learninglab.inria.fr> Date: Sun, 12 Mar 2023 16:59:50 +0000 Subject: [PATCH] no commit message --- .../influenza-like-illness-analysis.ipynb | 149 ++++++++++++------ 1 file changed, 102 insertions(+), 47 deletions(-) diff --git a/module3/exo1/influenza-like-illness-analysis.ipynb b/module3/exo1/influenza-like-illness-analysis.ipynb index 991ab68..1a48614 100644 --- a/module3/exo1/influenza-like-illness-analysis.ipynb +++ b/module3/exo1/influenza-like-illness-analysis.ipynb @@ -2475,45 +2475,26 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 20, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "1989-05-01/1989-05-07 1989-05-15/1989-05-21\n" - ] - }, - { - "ename": "TypeError", - "evalue": "index type not supported", + "ename": "HTTPError", + "evalue": "HTTP Error 404: Not Found", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 49\u001b[0m \u001b[0myearly_incidence\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSeries\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0myearly_incidence\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0myear\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 50\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 51\u001b[0;31m \u001b[0myearly_incidence\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstyle\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'*'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 52\u001b[0m \u001b[0myearly_incidence\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 53\u001b[0m \u001b[0myearly_incidence\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mxrot\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/opt/conda/lib/python3.6/site-packages/pandas/plotting/_core.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, kind, ax, figsize, use_index, title, grid, legend, style, logx, logy, loglog, xticks, yticks, xlim, ylim, rot, fontsize, colormap, table, yerr, xerr, label, secondary_y, **kwds)\u001b[0m\n\u001b[1;32m 2501\u001b[0m \u001b[0mcolormap\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcolormap\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtable\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtable\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0myerr\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0myerr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2502\u001b[0m \u001b[0mxerr\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mxerr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlabel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msecondary_y\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msecondary_y\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2503\u001b[0;31m **kwds)\n\u001b[0m\u001b[1;32m 2504\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__doc__\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplot_series\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__doc__\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2505\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/opt/conda/lib/python3.6/site-packages/pandas/plotting/_core.py\u001b[0m in \u001b[0;36mplot_series\u001b[0;34m(data, kind, ax, figsize, use_index, title, grid, legend, style, logx, logy, loglog, xticks, yticks, xlim, ylim, rot, fontsize, colormap, table, yerr, xerr, label, secondary_y, **kwds)\u001b[0m\n\u001b[1;32m 1925\u001b[0m \u001b[0myerr\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0myerr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mxerr\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mxerr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1926\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlabel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msecondary_y\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msecondary_y\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1927\u001b[0;31m **kwds)\n\u001b[0m\u001b[1;32m 1928\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1929\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/opt/conda/lib/python3.6/site-packages/pandas/plotting/_core.py\u001b[0m in \u001b[0;36m_plot\u001b[0;34m(data, x, y, subplots, ax, kind, **kwds)\u001b[0m\n\u001b[1;32m 1727\u001b[0m \u001b[0mplot_obj\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mklass\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msubplots\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msubplots\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkind\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkind\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1728\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1729\u001b[0;31m \u001b[0mplot_obj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgenerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1730\u001b[0m \u001b[0mplot_obj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdraw\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1731\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mplot_obj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/opt/conda/lib/python3.6/site-packages/pandas/plotting/_core.py\u001b[0m in \u001b[0;36mgenerate\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 250\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_compute_plot_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 251\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_setup_subplots\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 252\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_make_plot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 253\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_table\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 254\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_make_legend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/opt/conda/lib/python3.6/site-packages/pandas/plotting/_core.py\u001b[0m in \u001b[0;36m_make_plot\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 975\u001b[0m \u001b[0mstacking_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mstacking_id\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 976\u001b[0m \u001b[0mis_errorbar\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mis_errorbar\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 977\u001b[0;31m **kwds)\n\u001b[0m\u001b[1;32m 978\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_legend_handle\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnewlines\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 979\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/opt/conda/lib/python3.6/site-packages/pandas/plotting/_core.py\u001b[0m in \u001b[0;36m_ts_plot\u001b[0;34m(cls, ax, x, data, style, **kwds)\u001b[0m\n\u001b[1;32m 1016\u001b[0m \u001b[0mlines\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_plot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstyle\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mstyle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1017\u001b[0m \u001b[0;31m# set date formatter, locators and rescale limits\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1018\u001b[0;31m \u001b[0mformat_dateaxis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfreq\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1019\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mlines\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1020\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/opt/conda/lib/python3.6/site-packages/pandas/plotting/_timeseries.py\u001b[0m in \u001b[0;36mformat_dateaxis\u001b[0;34m(subplot, freq, index)\u001b[0m\n\u001b[1;32m 340\u001b[0m TimeSeries_TimedeltaFormatter())\n\u001b[1;32m 341\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 342\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'index type not supported'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 343\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 344\u001b[0m \u001b[0mpylab\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdraw_if_interactive\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: index type not supported" + "\u001b[0;31mHTTPError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;31m# If the local file doesn't exist, download the data and save to the local file\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexists\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlocal_data_file\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0murllib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0murlretrieve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlocal_data_file\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 14\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0;31m# Read the data from the local file into a Pandas DataFrame\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/conda/lib/python3.6/urllib/request.py\u001b[0m in \u001b[0;36murlretrieve\u001b[0;34m(url, filename, reporthook, data)\u001b[0m\n\u001b[1;32m 246\u001b[0m \u001b[0murl_type\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpath\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msplittype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 247\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 248\u001b[0;31m \u001b[0;32mwith\u001b[0m \u001b[0mcontextlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclosing\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murlopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mfp\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 249\u001b[0m \u001b[0mheaders\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minfo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 250\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/conda/lib/python3.6/urllib/request.py\u001b[0m in \u001b[0;36murlopen\u001b[0;34m(url, data, timeout, cafile, capath, cadefault, context)\u001b[0m\n\u001b[1;32m 221\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 222\u001b[0m \u001b[0mopener\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_opener\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 223\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mopener\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 224\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 225\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0minstall_opener\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mopener\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/conda/lib/python3.6/urllib/request.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(self, fullurl, data, timeout)\u001b[0m\n\u001b[1;32m 530\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mprocessor\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprocess_response\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprotocol\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 531\u001b[0m \u001b[0mmeth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprocessor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmeth_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 532\u001b[0;31m \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmeth\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreq\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 533\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 534\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/conda/lib/python3.6/urllib/request.py\u001b[0m in \u001b[0;36mhttp_response\u001b[0;34m(self, request, response)\u001b[0m\n\u001b[1;32m 640\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m200\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0mcode\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m300\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 641\u001b[0m response = self.parent.error(\n\u001b[0;32m--> 642\u001b[0;31m 'http', request, response, code, msg, hdrs)\n\u001b[0m\u001b[1;32m 643\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 644\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/conda/lib/python3.6/urllib/request.py\u001b[0m in \u001b[0;36merror\u001b[0;34m(self, proto, *args)\u001b[0m\n\u001b[1;32m 568\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhttp_err\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 569\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mdict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'default'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'http_error_default'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0morig_args\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 570\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call_chain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 571\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 572\u001b[0m \u001b[0;31m# XXX probably also want an abstract factory that knows when it makes\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/conda/lib/python3.6/urllib/request.py\u001b[0m in \u001b[0;36m_call_chain\u001b[0;34m(self, chain, kind, meth_name, *args)\u001b[0m\n\u001b[1;32m 502\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhandler\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mhandlers\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 503\u001b[0m \u001b[0mfunc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhandler\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmeth_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 504\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 505\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 506\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/conda/lib/python3.6/urllib/request.py\u001b[0m in \u001b[0;36mhttp_error_default\u001b[0;34m(self, req, fp, code, msg, hdrs)\u001b[0m\n\u001b[1;32m 648\u001b[0m \u001b[0;32mclass\u001b[0m \u001b[0mHTTPDefaultErrorHandler\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mBaseHandler\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 649\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mhttp_error_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreq\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmsg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhdrs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 650\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mHTTPError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfull_url\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmsg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhdrs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 651\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 652\u001b[0m \u001b[0;32mclass\u001b[0m \u001b[0mHTTPRedirectHandler\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mBaseHandler\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mHTTPError\u001b[0m: HTTP Error 404: Not Found" ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" } ], "source": [ @@ -2561,30 +2542,76 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, + "execution_count": 22, "metadata": {}, "outputs": [ { - "ename": "NameError", - "evalue": "name 'local_data_file' is not defined", + "ename": "HTTPError", + "evalue": "HTTP Error 404: Not Found", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# Read the data from the local file into a Pandas DataFrame\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mraw_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlocal_data_file\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mskiprows\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNameError\u001b[0m: name 'local_data_file' is not defined" + "\u001b[0;31mHTTPError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;31m# If the local file doesn't exist, download the data and save to the local file\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexists\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlocal_data_file\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0murllib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0murlretrieve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlocal_data_file\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 14\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0;31m# Read the data from the local file into a Pandas DataFrame\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/conda/lib/python3.6/urllib/request.py\u001b[0m in \u001b[0;36murlretrieve\u001b[0;34m(url, filename, reporthook, data)\u001b[0m\n\u001b[1;32m 246\u001b[0m \u001b[0murl_type\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpath\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msplittype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 247\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 248\u001b[0;31m \u001b[0;32mwith\u001b[0m \u001b[0mcontextlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclosing\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murlopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mfp\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 249\u001b[0m \u001b[0mheaders\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minfo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 250\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/conda/lib/python3.6/urllib/request.py\u001b[0m in \u001b[0;36murlopen\u001b[0;34m(url, data, timeout, cafile, capath, cadefault, context)\u001b[0m\n\u001b[1;32m 221\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 222\u001b[0m \u001b[0mopener\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_opener\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 223\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mopener\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 224\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 225\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0minstall_opener\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mopener\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/conda/lib/python3.6/urllib/request.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(self, fullurl, data, timeout)\u001b[0m\n\u001b[1;32m 530\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mprocessor\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprocess_response\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprotocol\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 531\u001b[0m \u001b[0mmeth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprocessor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmeth_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 532\u001b[0;31m \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmeth\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreq\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 533\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 534\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/conda/lib/python3.6/urllib/request.py\u001b[0m in \u001b[0;36mhttp_response\u001b[0;34m(self, request, response)\u001b[0m\n\u001b[1;32m 640\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m200\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0mcode\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m300\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 641\u001b[0m response = self.parent.error(\n\u001b[0;32m--> 642\u001b[0;31m 'http', request, response, code, msg, hdrs)\n\u001b[0m\u001b[1;32m 643\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 644\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/conda/lib/python3.6/urllib/request.py\u001b[0m in \u001b[0;36merror\u001b[0;34m(self, proto, *args)\u001b[0m\n\u001b[1;32m 568\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhttp_err\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 569\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mdict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'default'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'http_error_default'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0morig_args\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 570\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call_chain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 571\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 572\u001b[0m \u001b[0;31m# XXX probably also want an abstract factory that knows when it makes\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/conda/lib/python3.6/urllib/request.py\u001b[0m in \u001b[0;36m_call_chain\u001b[0;34m(self, chain, kind, meth_name, *args)\u001b[0m\n\u001b[1;32m 502\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhandler\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mhandlers\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 503\u001b[0m \u001b[0mfunc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhandler\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmeth_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 504\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 505\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 506\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/conda/lib/python3.6/urllib/request.py\u001b[0m in \u001b[0;36mhttp_error_default\u001b[0;34m(self, req, fp, code, msg, hdrs)\u001b[0m\n\u001b[1;32m 648\u001b[0m \u001b[0;32mclass\u001b[0m \u001b[0mHTTPDefaultErrorHandler\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mBaseHandler\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 649\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mhttp_error_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreq\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmsg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhdrs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 650\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mHTTPError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfull_url\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmsg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhdrs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 651\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 652\u001b[0m \u001b[0;32mclass\u001b[0m \u001b[0mHTTPRedirectHandler\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mBaseHandler\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mHTTPError\u001b[0m: HTTP Error 404: Not Found" ] } ], + "source": [ + "import os\n", + "import urllib.request\n", + "import pandas as pd\n", + "\n", + "# Define the URL for the data\n", + "url = 'https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction-to-machine-learning/main/Data/ml-basics/crime.csv'\n", + "\n", + "# Define the local filename\n", + "local_data_file = 'crime.csv'\n", + "\n", + "# If the local file doesn't exist, download the data and save to the local file\n", + "if not os.path.exists(local_data_file):\n", + " urllib.request.urlretrieve(url, local_data_file)\n", + "\n", + "# Read the data from the local file into a Pandas DataFrame\n", + "raw_data = pd.read_csv(local_data_file)\n", + "\n", + "# Drop the first column, which contains the crime codes\n", + "data = raw_data.drop(columns=['Offence Code'])\n", + "\n", + "# Convert the 'Reported Date' column to a Pandas datetime type\n", + "data['Reported Date'] = pd.to_datetime(data['Reported Date'], format='%d/%m/%Y')\n", + "\n", + "# Filter the data to include only the weeks of interest\n", + "data = data[(data['Reported Date'] >= '1989-05-01') & (data['Reported Date'] <= '1989-05-07') | \n", + " (data['Reported Date'] >= '1989-05-15') & (data['Reported Date'] <= '1989-05-21')]\n", + "\n", + "# Compute the weekly crime incidence\n", + "weekly_incidence = data.groupby(pd.Grouper(key='Reported Date', freq='W')).size()\n", + "\n", + "# Compute the yearly crime incidence\n", + "yearly_incidence = weekly_incidence.groupby(weekly_incidence.index.year).sum()\n", + "year = yearly_incidence.index.astype(str)\n", + "yearly_incidence.index = year\n", + "\n", + "# Plot the yearly crime incidence\n", + "yearly_incidence.plot(style='*')\n", + "yearly_incidence.sort_values()\n", + "yearly_incidence.hist(xrot=20)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "\n", "\n" @@ -2598,6 +2625,34 @@ "source": [ "\n" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { -- 2.18.1