{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Version 1.0.3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Pandas basics " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hi! In this programming assignment you need to refresh your `pandas` knowledge. You will need to do several [`groupby`](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html)s and [`join`]()`s to solve the task. " ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import os\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline \n", "\n", "from grader import Grader" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": true }, "outputs": [], "source": [ "DATA_FOLDER = '../readonly/final_project_data/'\n", "\n", "transactions = pd.read_csv(os.path.join(DATA_FOLDER, 'sales_train.csv.gz'))\n", "items = pd.read_csv(os.path.join(DATA_FOLDER, 'items.csv'))\n", "item_categories = pd.read_csv(os.path.join(DATA_FOLDER, 'item_categories.csv'))\n", "shops = pd.read_csv(os.path.join(DATA_FOLDER, 'shops.csv'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The dataset we are going to use is taken from the competition, that serves as the final project for this course. You can find complete data description at the [competition web page](https://www.kaggle.com/c/competitive-data-science-final-project/data). To join the competition use [this link](https://www.kaggle.com/t/1ea93815dca248e99221df42ebde3540)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Grading" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will create a grader instace below and use it to collect your answers. When function `submit_tag` is called, grader will store your answer *locally*. The answers will *not* be submited to the platform immediately so you can call `submit_tag` function as many times as you need. \n", "\n", "When you are ready to push your answers to the platform you should fill your credentials and run `submit` function in the last paragraph of the assignment." ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": true }, "outputs": [], "source": [ "grader = Grader()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Task" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's start with a simple task. \n", "\n", "
    \n", "
  1. Print the shape of the loaded dataframes and use [`df.head`](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.head.html) function to print several rows. Examine the features you are given.
  2. \n", "
" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datedate_block_numshop_iditem_iditem_priceitem_cnt_day
002.01.201305922154999.001.0
103.01.20130252552899.001.0
205.01.20130252552899.00-1.0
306.01.201302525541709.051.0
415.01.201302525551099.001.0
510.01.20130252564349.001.0
602.01.20130252565549.001.0
704.01.20130252572239.001.0
811.01.20130252572299.001.0
903.01.20130252573299.003.0
1003.01.20130252574399.002.0
1105.01.20130252574399.001.0
1207.01.20130252574399.001.0
1308.01.20130252574399.002.0
1410.01.20130252574399.001.0
\n", "
" ], "text/plain": [ " date date_block_num shop_id item_id item_price item_cnt_day\n", "0 02.01.2013 0 59 22154 999.00 1.0\n", "1 03.01.2013 0 25 2552 899.00 1.0\n", "2 05.01.2013 0 25 2552 899.00 -1.0\n", "3 06.01.2013 0 25 2554 1709.05 1.0\n", "4 15.01.2013 0 25 2555 1099.00 1.0\n", "5 10.01.2013 0 25 2564 349.00 1.0\n", "6 02.01.2013 0 25 2565 549.00 1.0\n", "7 04.01.2013 0 25 2572 239.00 1.0\n", "8 11.01.2013 0 25 2572 299.00 1.0\n", "9 03.01.2013 0 25 2573 299.00 3.0\n", "10 03.01.2013 0 25 2574 399.00 2.0\n", "11 05.01.2013 0 25 2574 399.00 1.0\n", "12 07.01.2013 0 25 2574 399.00 1.0\n", "13 08.01.2013 0 25 2574 399.00 2.0\n", "14 10.01.2013 0 25 2574 399.00 1.0" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "transactions.head(15)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now use your `pandas` skills to get answers for the following questions. \n", "The first question is:\n", "\n", "1. ** What was the maximum total revenue among all the shops in September, 2014?** \n", "\n", "\n", "* Hereinafter *revenue* refers to total sales minus value of goods returned.\n", "\n", "*Hints:*\n", "\n", "* Sometimes items are returned, find such examples in the dataset. \n", "* It is handy to split `date` field into [`day`, `month`, `year`] components and use `df.year == 14` and `df.month == 9` in order to select target subset of dates.\n", "* You may work with `date` feature as with strings, or you may first convert it to `pd.datetime` type with `pd.to_datetime` function, but do not forget to set correct `format` argument." ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7982852.2\n", "Current answer for task max_revenue is: 7982852.2\n" ] } ], "source": [ "#transactions['date'] = pd.to_datetime(transactions['date'])\n", "#transactions = transactions.set_index(transactions['date'])\n", "#transactions = transactions.sort_index()\n", "#transactions.head()\n", "\n", "#sep_transacts = transactions['2014-09-01':'2014-09-30']\n", "#items_sold = sum(sep_transacts.item_price)\n", "#returned = []\n", "#for n in sep_transacts.item_cnt_day: \n", "# if n <0:\n", "# returned = returned.append(sep_transacts.item_price)\n", "#returned = sum(returned)\n", " \n", "#print(\"sold \" + items_sold)\n", "#print(\"returned \" + returned)\n", "\n", "trans = transactions[transactions['date'].str.endswith('09.2014')]\n", "max_revenue = (trans['item_price'] * trans['item_cnt_day']).groupby(trans['shop_id']).sum().max()\n", "print(max_revenue)\n", "#max_revenue = items_sold - returned\n", "grader.submit_tag('max_revenue', max_revenue)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Great! Let's move on and answer another question:\n", "\n", "
    \n", "
  1. What item category generated the highest revenue in summer 2014?
  2. \n", "
\n", "\n", "* Submit `id` of the category found.\n", " \n", "* Here we call \"summer\" the period from June to August.\n", "\n", "*Hints:*\n", "\n", "* Note, that for an object `x` of type `pd.Series`: `x.argmax()` returns **index** of the maximum element. `pd.Series` can have non-trivial index (not `[1, 2, 3, ... ]`)." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "20\n", "Current answer for task category_id_with_max_revenue is: 20\n" ] } ], "source": [ "# YOUR CODE GOES HERE\n", "trans = transactions[transactions['date'].str.match('.*0[6-8].2014$')]\n", "trans = trans[trans['item_cnt_day'] > 0]\n", "trans = pd.merge(trans, items, how='left', on='item_id')\n", "category_id_with_max_revenue = (trans['item_price'] * trans['item_cnt_day']).groupby(trans['item_category_id']).sum().argmax()\n", "\n", "print(category_id_with_max_revenue)\n", "grader.submit_tag('category_id_with_max_revenue', category_id_with_max_revenue)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
    \n", "
  1. How many items are there, such that their price stays constant (to the best of our knowledge) during the whole period of time?
  2. \n", "
\n", "\n", "* Let's assume, that the items are returned for the same price as they had been sold." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5926\n", "Current answer for task num_items_constant_price is: 5926\n" ] } ], "source": [ "# YOUR CODE GOES HERE\n", "num_items_constant_price = (transactions['item_price'].groupby(transactions['item_id']).nunique() == 1).sum()\n", "print(num_items_constant_price)\n", "grader.submit_tag('num_items_constant_price', num_items_constant_price)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Remember, the data can sometimes be noisy." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
    \n", "
  1. What was the variance of the number of sold items per day sequence for the shop with `shop_id = 25` in December, 2014? Do not count the items, that were sold but returned back later.
  2. \n", "
\n", "\n", "* Fill `total_num_items_sold` and `days` arrays, and plot the sequence with the code below.\n", "* Then compute variance. Remember, there can be differences in how you normalize variance (biased or unbiased estimate, see [link](https://math.stackexchange.com/questions/496627/the-difference-between-unbiased-biased-estimator-variance)). Compute ***unbiased*** estimate (use the right value for `ddof` argument in `pd.var` or `np.var`). \n", "* If there were no sales at a given day, ***do not*** impute missing value with zero, just ignore that day" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/opt/conda/lib/python3.6/site-packages/ipykernel_launcher.py:9: FutureWarning: to_datetime is deprecated. Use pd.to_datetime(...)\n", " if __name__ == '__main__':\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY8AAAEWCAYAAACe8xtsAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmYXGWd9vHv3Uv2dGffA0nYIpssQTYXFGUTQR1nhHEQ\nEUUYfdVX55qR0VcckRlnxl1HHBQGUIFhxAVwBWTRISABISwBsrB1EtKdrbuT9Fr1e/84p7orne5O\nV9JdVd25P9dVV516zvacqu761bMeRQRmZmaFqCh1BszMbPhx8DAzs4I5eJiZWcEcPMzMrGAOHmZm\nVjAHDzMzK5iDh+0VSftJ2iapMn19n6QPlTpf5ULSyZJWpu/RO4fwPKdIqhuq4/dxzl9LurCPdQsk\nhaSqYubJisfBYx8n6UVJLZKaJW2V9KCkSyUN6G8jIl6OiAkRkRnqvA5TXwS+k75HPy91ZgZTRJwZ\nETcU63ySZki6WdI6SY2S/lfS8XnrT5GUTQN17tFrcLO95+BhAO+IiInA/sCXgX8Ari1lhkbQL9b9\ngaf3ZMcR9B4MlgnAI8CxwBTgBuCXkibkbbMuDdS5R9GC277GwcO6RERjRNwOvBe4UNLhAJLeLunP\nkpokvSLpC7l9+qqekDRa0mZJR+SlzUhLOdN7nlvSB9Jfkl+XtBn4Qpr+QUkrJG2R9FtJ+6fp35P0\nlR7H+IWkT6XLcyTdJqlB0guSPp633Rck3SrpxrTE9bSkJXnrQ9KBea+vl/SlvNdnS3o8r6R2ZG/v\np6TVwCLgjvRX8Og0X7en780qSR/uka+fSPqRpCbgA70c8yxJz6T5Xivp73qs/7SkeknrJV2Ul16b\nXm+DpJckfS5Xusx777+d/qJ/VtKpvV1Tj3N1VVFKqpT0FUkbJa0B3r67/QsVEWsi4msRsT4iMhFx\nDTAKOGSwz2W75+Bhu4iIPwF1wBvSpO3A+4FJJF8Kl+2u/j4i2oBbgL/JSz4fuDsiGvrY7XhgDTAD\nuCo9xz8C7wamA38Abk63vQl4ryQBSJoMnAbckn4p3gE8AcwFTgU+Ken0vHOdk+ZvEnA78J3+ridH\n0jHAdcBHgKnAfwK3Sxrdy3twAPAyScluQvqe3Ezy3s4B3gP8c48v6nOBn6T5+nEvWbgW+EhaUjwc\n+H3eullAbXrNFwP/kb4vAN9O1y0C3kTyeV6Ut2/uvZ8GXAH8VNKUgbwnqQ8DZwNHA0vSa+uTpDvT\n4Nvb486BnFDSUSTBY1Ve8gxJG9IfDF+XNL6Aa7BCRIQf+/ADeBF4ay/pDwGf7WOfbwBfT5cXAAFU\npa/vAz6ULh8PvAJUpK+XAX/VxzE/ALzcI+3XwMV5ryuAHSRVQSL5Yn5juu7DwO/zztvzWJcD/5Uu\nf4EkiOXWHQq05L0O4MC819cDX0qXrwau7HHs54A37e79BeYDGWBi3vp/Aa7Py9cDu/m8XiYJXDU9\n0k8BWnKfQ5pWD5wAVAJtwKF56z4C3Jf33q8DlLf+T8AFu8lL/mf9e+DSvHWn5f9dDMHfbQ3wJHB5\nXtqs9LOsABYCDwD/Wez/qX3l4ZKH9WUusBlA0vGS7k2rPBqBS0l+ofYrIh4mKbW8SdJi4ECSX/l9\neaXH6/2Bb+Z+kab5ETA3km+LW0hKMwB/Tfcv9f2BOfm/ZklKMDPzjv1q3vIOYMwA2xj2Bz7d49jz\nSUoSuzMH2BwRzXlpL5G81zk934Oe/gI4C3hJ0v2STsxbtykiOvNe7yBpJ5hG8gv9pX7OuzZ9T/PX\nD+Sacub0yPtLfW24tySNJSlZPhQR/5JLj4hXI+KZiMhGxAvA37ObEpDtOQcP24Wk40i+WP6YJt1E\n8qU/PyJqge+RfIkPxA0kVVcXAD+JiNZ+tu05xfMrJFU0k/IeYyPiwXT9zcB70naQ44Hb8vZ7ocd+\nEyPirAHmeQcwLu/1rB55uqrHscdFxM3s3jpgiqSJeWn7AWvzXvc7zXVEPBIR55JU7f0cuHUA590I\ndJAEvr7OOzdXBZi3ft0Ajp2zniSI5u/fJyXdfLf18fh1P/uNJrnutSSlp/4EA/87tQI5eFgXSTWS\nzib5Rf+jiHgyXTWR5Bdzq6TXkfzKH6gfAu8iCSA3Fpil7wGXSzoszV+tpL/MrYyIPwMNwA+A30bE\n1nTVn4AmSf8gaWzamHt4GhQH4nHgr9P9ziBpI8j5PnBpWhqTpPFKOhRM7P1Q3SLiFeBB4F8kjUkb\n2i+m97aNXUgaJel9kmojogNoIqkG2915MyRB5ipJE9Ng+yngR3mbzQA+Lqk6fY9fA/xqIPlK3Zru\nPy9tZ/nMbvJ0ZuzcKyr/cWZv+0iqJmkPagHeHxHZHutPUTLuSJLmk/Qc/EUB12AFcPAwSHoDNZP8\nqv4s8DV2bkz9W+CL6TafZ2C/dgGIiDrgMZJfgX8oJFMR8TPgX0kawZuAp4CeXyw3A28lKR3l9ssA\n7wCOAl4g+eX9A5IG44H4RLr/VuB9JL90c8deRtK+8h1gC0lj7QcKuKzzSdqJ1gE/A66IiLsK2P8C\n4MX0/biUnTsk9Of/kFQhriEpUd5E0vCf8zBwEMl7dRXwnojYVEC+vg/8lqSTwmPATwvYd6BOImmU\nPw3YmldSyXXsOAZYSnKdD5L8vXy81yPZXtPO1Zxmg0/SdST97z9X6rzYriR9gKTh+/WlzosNHx6E\nZENK0gKSrrZHlzYnZjaYXG1lQ0bSlSRVB/+e9n6xYaafRu037H5vG8lcbWVmZgVzycPMzAo2Yts8\npk2bFgsWLCh1NszMho1HH310Y0TsMvdcb0Zs8FiwYAHLli0rdTbMzIYNSQOeGcDVVmZmVrAhCx6S\n5qfzIa1QMuX1J9L0KZLuUnJ3tbtys36mo0K/pWSa6uXp7KW5Y12Ybr9SvrmLmVnJDWXJoxP4dES8\nhmRmz49KOpRk2oJ7IuIg4B66pzE4k2SE60HAJSSzl6JkWugrSOYueh1whbqnmTYzsxIYsuARyQ1b\nHkuXm4EVJJPtnUsyWR7pc+6+EOcCN0biIWCSpNnA6cBdEbE5IrYAdwFnDFW+zcxs94rS5pGOMj6a\nZP6cmRGxHpIAQzIhGySBJX9K57o0ra90MzMrkSEPHkruL3wb8MmIaOpv017S+ppSudeRjZIukbRM\n0rKGhr5uVmdmZntrSINHOoXybcCPIyI3y+aGtDqK9Lk+Ta9j5/sBzCOZebSv9F1ExDURsSQilkyf\nPqCuymZmtgeGsreVSO63vCIivpa36nYg12PqQrrn278deH/a6+oEoDGt1votcJqkyeq+T/Vvhyrf\nZmbD0aZtbfzmqfVFO99QljxOJrn3wFskPZ4+ziK5QcvbJK0E3pa+huTGM2tI7o/wfZJ7SBARm4Er\ngUfSxxfTNDMzS/30sbVc9uPHaGnf7f3BBsWQjTCPiD/S9y0gT+1l+wA+2sexrmPnG9eYmVme9kyW\nCMgUabJbjzA3MxsBMtkkaGQdPMzMbKBywaNYd9lw8DAzGwFyJY5i3aPJwcPMbATorrYqzvkcPMzM\nRoCMSx5mZlaoTMYlDzMzK5BLHmZmVrBsrrdVkc7n4GFmNgLkSh4e52FmZgOWySbPbvMwM7MBy1Vb\nZYsUPRw8zMxGgGLNaZXj4GFmNgJkPbeVmZkVqtMjzM3MrFAe52FmZgXLuuRhZmaF6p6S3SUPMzMb\noGy45GFmZgXqKnkUaYKSIQsekq6TVC/pqby0/5b0ePp4UdLjafoCSS15676Xt8+xkp6UtErStyT1\ndV90M7N9VjqpLtlscc5XNYTHvh74DnBjLiEi3ptblvRVoDFv+9URcVQvx7kauAR4CPgVcAbw6yHI\nr5nZsDVixnlExAPA5t7WpaWHvwJu7u8YkmYDNRGxNJJWoBuBdw52Xs3MhrvOYhU5UqVq83gDsCEi\nVualLZT0Z0n3S3pDmjYXqMvbpi5N65WkSyQtk7SsoaFh8HNtZlamsl0TIw7zksdunM/OpY71wH4R\ncTTwKeAmSTVAb+0bfb4zEXFNRCyJiCXTp08f1AybmZWzTJF7Ww1lm0evJFUB7waOzaVFRBvQli4/\nKmk1cDBJSWNe3u7zgHXFy62Z2fCQGSltHv14K/BsRHRVR0maLqkyXV4EHASsiYj1QLOkE9J2kvcD\nvyhBns3Mylq2a3qS4pxvKLvq3gwsBQ6RVCfp4nTVeezaUP5GYLmkJ4CfAJdGRK6x/TLgB8AqYDXu\naWVmtotijzAfsmqriDi/j/QP9JJ2G3BbH9svAw4f1MyZmY0wGc9tZWZmhcp6Vl0zMyuUSx5mZlYw\nz6prZmYFK/Y4DwcPM7MRIDfCfNjPqmtmZsXjNg8zMytYd7WVSx5mZjZAuSnZi1Rr5eBhZjYSuORh\nZmYFc5uHmZkVbF+YVdfMzAZZ9yDB4pzPwcPMbATw3FZmZlYwt3mYmVlBIoLunroueZiZ2QDklzZc\n8jAzswHJ5EUMt3mYmdmA5HfPHfa9rSRdJ6le0lN5aV+QtFbS4+njrLx1l0taJek5SafnpZ+Rpq2S\n9Jmhyq+Z2XCVX/IYCeM8rgfO6CX96xFxVPr4FYCkQ4HzgMPSfb4rqVJSJfAfwJnAocD56bZmZpbq\n3Cl4FOecVUN14Ih4QNKCAW5+LnBLRLQBL0haBbwuXbcqItYASLol3faZQc6umdmwlR1hJY++fEzS\n8rRaa3KaNhd4JW+bujStr/ReSbpE0jJJyxoaGgY732ZmZSmTHzCGe5tHH64GDgCOAtYDX03T1cu2\n0U96ryLimohYEhFLpk+fvrd5NTMbFkpR8hiyaqveRMSG3LKk7wN3pi/rgPl5m84D1qXLfaWbmRk7\nlzxG5DgPSbPzXr4LyPXEuh04T9JoSQuBg4A/AY8AB0laKGkUSaP67cXMs5lZudtpnEeR6q2GrOQh\n6WbgFGCapDrgCuAUSUeRVD29CHwEICKelnQrSUN4J/DRiMikx/kY8FugErguIp4eqjybmQ1H2Wze\n8gjobXV+L8nX9rP9VcBVvaT/CvjVIGbNzGxEyYRHmJuZWYEyeUWPbJGKHg4eZmbDXCav2qpItVYO\nHmZmw12mBCPMHTzMzIa5rNs8zMysUDtPyV6cczp4mJkNczsPEnTJw8zMBiDrNg8zMyvUSLufh5mZ\nFUGmWA0deRw8zMyGuZ1KHh4kaGZmA+FxHmZmVrCdxnkUaYy5g4eZ2TCXKcGsug4eZmbD3M6DBF3y\nMDOzAch6kKCZmRXK05OYmVnBsuV4D3NJn5BUo8S1kh6TdFoxMmdmZrvXmSnPNo8PRkQTcBowHbgI\n+PLudpJ0naR6SU/lpf27pGclLZf0M0mT0vQFklokPZ4+vpe3z7GSnpS0StK3JKngqzQzG8F2ug1t\nkc45kOCR+7I+C/iviHgiL60/1wNn9Ei7Czg8Io4Engcuz1u3OiKOSh+X5qVfDVwCHJQ+eh7TzGyf\nli3TEeaPSvodSfD4raSJQHY3+xARDwCbe6T9LiI605cPAfP6O4ak2UBNRCyNpCx2I/DOAeTZzGyf\nkSnHNg/gYuAzwHERsQMYRVJ1tbc+CPw67/VCSX+WdL+kN6Rpc4G6vG3q0rReSbpE0jJJyxoaGgYh\ni2Zm5S9bgll1q3a3QURkJXUCb5SUv/3yPT2ppM8CncCP06T1wH4RsUnSscDPJR1G79Vjfb4zEXEN\ncA3AkiVLij/NpJlZCWSKVdzIs9vgIek64EjgabqrqwL46Z6cUNKFwNnAqWlVFBHRBrSly49KWg0c\nTFLSyK/amges25PzmpmNVLnOVpUVKp+SB3BCRBw6GCeTdAbwD8Cb0iqwXPp0YHNEZCQtImkYXxMR\nmyU1SzoBeBh4P/DtwciLmdlIkau2qipi8BhIm8dSSQUHD0k3A0uBQyTVSboY+A4wEbirR5fcNwLL\nJT0B/AS4NCJyje2XAT8AVgGr2bmdxMxsn9eZFzyKNcJ8ICWPG0gCyKskVUsCIu1u26eIOL+X5Gv7\n2PY24LY+1i0DDh9APs3M9km50kZVZUXRelsNJHhcB1wAPMkAuuiamVlx5RrMqytVtBHmAwkeL0fE\n7UOeEzMz2yO54FFZZtVWz0q6CbiDtEcUQETsUW8rMzMbXNkIJKhUefW2GksSNPInQ9zjrrpmZja4\nMtmgUkJS+bR5RMRgjCY3M7MhkomgokJIZTSrrqSDJd2Tmx1X0pGSPjf0WTMzs4HIZoOqClEhldWs\nut8nmf22AyAilgPnDWWmzMxs4DLZpL2jQuV1G9pxEfGnHmmdvW5pZmZFl8lmqUhLHuU0q+5GSQeQ\nTkgo6T0kExmamVkZyERQWSEoYpvHQHpbfZRkptrFktYCLwDvG9JcmZnZgGWyUKG0zaNceluRTEXy\nVknjgYqIaJa0cKgzZmZmA5PNBpUVlF2bx20AEbE9IprTtJ8MXZbMzKwQmUjHeVAGgwQlLQYOA2ol\nvTtvVQ0wZqgzZmZmA5PN5o/zKM45+6u2OoTkpk2TgHfkpTcDHx7KTJmZ2cDlGsyL2duqz+AREb8A\nfiHpxIhYWpzsmJlZoTLZJHgUc4R5f9VWfx8R/wb8taRd7s0RER8f0pyZmdmA5Oa2KuYI8/6qrVak\nz8uKkREzM9szuZJHMXtb9VdtdUf6fENRcmJmZnskG0FFkWfVHUhX3T0m6TpJ9blJFdO0KZLukrQy\nfZ6cpkvStyStkrRc0jF5+1yYbr9S0oVDmWczs+GmFG0eQxo8gOuBM3qkfQa4JyIOAu5JXwOcCRyU\nPi4BroYk2ABXAMcDrwOuyAUcMzODTNA1t1WxuuoOafCIiAeAzT2SzwVyVWE3AO/MS78xEg8BkyTN\nBk4H7oqIzRGxBbiLXQOSmdk+K5sNKlXcEea7nZ4knYrk/wAL8rePiHP28JwzI2J9eoz1kmak6XOB\nV/K2q0vT+krvLa+XkJRa2G+//fYwe2Zmw0tXtVU5jDDP83PgWpJ7mGeHMC/qJS36Sd81MeIakkkc\nWbJkSbF6rJmZlVRukGBEeYwwz2mNiG8N4jk3SJqdljpmA/Vpeh0wP2+7ecC6NP2UHun3DWJ+zMyG\ntWw2qK6uIJtNSiHFMJA2j29KukLSiZKOyT324py3A7keUxcCv8hLf3/a6+oEoDGt3votcJqkyWlD\n+WlpmpmZAZ3ZpKtuRUUZtXkARwAXAG+hu9oq0tf9knQzSalhmqQ6kl5TXwZulXQx8DLwl+nmvwLO\nAlYBO4CLACJis6QrgUfS7b4YET0b4c3M9lnZXLVVpryCx7uARRHRXujBI2KXaU1Sp/aybZDceKq3\n41wHXFfo+c3M9gW56UkyiqJNTzKQaqsnSGbWNTOzMpRJp2Qvi1l188wEnpX0CNCWS9yLrrpmZjaI\nsrmbQZXDrLp5rhjyXJiZ2R7rnhixjO5hHhH3FyMjZma2Z7Jd05OUUYO5pGa6B+WNAqqB7RFRM5QZ\nMzOzgclkg6qK4s6qO5CSx8T815LeSTJBoZmZlYFMOs5DlPGsuhHxcwYwxsPMzIojafOgvNo8JL07\n72UFsIQ+5pYyM7Piy81tVW4jzN+Rt9wJvEgyfbqZmZWBbFe1VRnNqhsRFxUjI2ZmtmdyJQ+peNVC\nfQYPSZ/vZ7+IiCuHID9mZlagXIN5ubR5bO8lbTxwMTAVcPAwMysD2bx7mJe82ioivppbljQR+ATJ\nTLe3AF/taz8zMyuuTCTjPMql5IGkKcCngPeR3G/8mPQ+4mZmViZyEyOWRclD0r8D7ya5resREbGt\nKDkyM7OC5KZkL2bJo79Bgp8G5gCfA9ZJakofzZKaipM9MzPrT0R0zW0lyqDkEREFjz43M7Piys1l\nVU4lDzMzK3OZNHpUVlDUEeZFDx6SDpH0eN6jSdInJX1B0tq89LPy9rlc0ipJz0k6vdh5NjMrV7lg\nUVEhoIxm1R1sEfEccBSApEpgLfAzkm7AX4+Ir+RvL+lQ4DzgMJI2mLslHRwRmaJm3MysDHWVPCS+\neO5h/NM5hxXlvKWutjoVWB0RL/WzzbnALRHRFhEvAKvwlPBmZkAyxgOgskJUV1Ywqqo4X+ulDh7n\nATfnvf6YpOWSrpM0OU2bC7ySt01dmrYLSZdIWiZpWUNDw9Dk2MysTHRmspz9rT8CSfAoppIFD0mj\ngHOA/0mTrgYOIKnSWk/3KPbe3pFea/Ui4pqIWBIRS6ZPnz7IOTYzKy+bd7Tz8uYdwD4UPIAzgcci\nYgNARGyIiExEZIHv0101VQfMz9tvHrCuqDk1MytDza2dXcsV2neCx/nkVVlJmp237l3AU+ny7cB5\nkkZLWggcBPypaLk0MytTTS0dXcvFLnkUvbcVgKRxwNuAj+Ql/5uko0iqpF7MrYuIpyXdCjxDcjOq\nj7qnlZkZNOYHjyKXPEoSPCJiB8m07vlpF/Sz/VXAVUOdLzOz4SQ/eFTsQ20eZma2F5ry2jyKNbI8\nx8HDzGyYym/z2LK9vajndvAwMxum8oPHJgcPMzMbiPw2j2kTRhX13CVpMDczs73X1NrBgTMm8E/n\nHMbxC6cU9dwOHmZmw1RjSwe1Y6s5+cBpRT+3q63MzIapxpYOasaUpgzg4GFmNkw1tXRSO7a6JOd2\n8DAzG6YaWzqocfAwM7OBymaDptYOJo0rbi+rHAcPM7NhqLm1kwhcbWVmZn3LZIPIm4Jka0syKHCS\ng4eZmfVmR3snR3/xd/zumQ1daVt3JAMEJ41z8DAzs15s2tZOU2snL27c3pWWG13uaiszM+vV9vZk\n9tyWju5bGW1tccnDzMz6sb0tCRr5waNxR9LmUTvWva3MzKwX29uSkkdre17wcLWVmZn1Jxc8dqq2\n2tHBuFGVjKoqzdd4yYKHpBclPSnpcUnL0rQpku6StDJ9npymS9K3JK2StFzSMaXKt5lZsW1vz1Vb\nZbvStrZ0lKybLpS+5PHmiDgqIpakrz8D3BMRBwH3pK8BzgQOSh+XAFcXPadmZiXSVfJo777tbGNL\nB7UlGl0OpQ8ePZ0L3JAu3wC8My/9xkg8BEySNLsUGTQzK7Zee1vtaKd2bOnuqlHK4BHA7yQ9KumS\nNG1mRKwHSJ9npOlzgVfy9q1L03Yi6RJJyyQta2hoGMKsm5kVT3fJozt4bGhqY2bNmFJlqaQ3gzo5\nItZJmgHcJenZfrZVL2mxS0LENcA1AEuWLNllvZnZcNTdVTdp88hmg1cbW5lVW7rgUbKSR0SsS5/r\ngZ8BrwM25Kqj0uf6dPM6YH7e7vOAdcXLrZlZ6XR11U2rrTbvaKc9k2VO7diS5akkwUPSeEkTc8vA\nacBTwO3AhelmFwK/SJdvB96f9ro6AWjMVW+ZmY10XW0eabXVq42tACUteZSq2mom8DNJuTzcFBG/\nkfQIcKuki4GXgb9Mt/8VcBawCtgBXFT8LJuZlUau2mpHGkTWbW0BYPa+FjwiYg3w2l7SNwGn9pIe\nwEeLkDUzs7LTXW2VtHm82lT6kke5ddU1M9unNbZ07HTfDoBtafBoz2TpzGRZt7WV6koxbfzoUmQR\ncPAwMysbW7a3c/w/383dK+p3St+R10W3tTPL+sYWZtaMoaKit46oxeHgYWZWJjY0t9LakeWlTdt3\nSt/e1kkuTrS0Z3hl8w7mTS5dTytw8DAzKxvNrUn1VFM6Yy5ARNDU2sG0CUkVVWtHhrotLcyfPK4k\necxx8DAzKxPNrUnQaGrtnsOqqbWTjkx0lTS27GinvrmN+VMcPMzMjN5LHpu2tQEwLy1prNywDYD5\nU1xtZWZmdJc4mlrzgsf25I6BuWDxfH1z8trVVmZmBnnVVi3d1Va5ksf+U8cD8My6JgBXW5mZWaK5\nl5LHxm1JyeO18yYB8MiLmxldVcH0CaUb4wGlnVXXrCy1d2Z57tVm2jozzKwZw4ya0Yyuqix1tmwf\n0F3yyG/zSILHounjmTi6iua2ThbPmljSMR7g4GH7uI5MlpUbtvHk2q0sr2vkybWNPLu+mfZMdqft\npowfxcyaMcyqGc2s2jHMrBmTvk6fa8cweVw16XxtZnuku+SRV221vY3asdVUV1Ywb8o4VqxvYtH0\n8aXKYhcHD9tnZLLBqvptLK/bypNrG1le18iK9U20dSaBYuLoKo6YV8tFJy/giHm1TBhdRX1TG682\ntfJqUysbGpPnJ9c2dlUl5BtVVcHMmtHMnDiGmbVJYJlV0708s2Y0M2vGMKbapRjrXS54bGvrpDOT\npaqygk3b2pk6Ibnd7PzJY1mxvomF0xw8zIZENhus2bi9u0RR18jT65q6buM5flQlh82t5YIT9ueI\nebUcOW8S+08ZN+CqgPbOLA3b2ni1sZUNTa3Jc3N3gHlmXRO/X1G/021DcyaNq+4qscysGc3rD5rO\nWYfPoqrSTZD7uua8to5tbZ1MGjeKjdvauuaw2i9tJF80bUJJ8pfPwcOGvYjgpU07WL62kSfrkmDx\n9LqmrsnkxlRXcNicWt573HyOnFfLkfNqWThtApV7UWc8qqqCuZPGMndS333tI4Lmts6ugJILNBvS\n0syGplaeWtvIrcvq+MqUcXzkTYv4i2PmuWSyD2vOHxzYkgSPVzbv4LiFU4DuHlYLXW1lVpiIoG5L\nC8vrGlm+ditPpu0UuX+6UVUVHDq7hncdPTctUdRy4PQJJflVL4maMdXUjKnmoJkTe90mmw3uWrGB\n7963ms/+7Cm+ftdKLn79Qv7mhP2YOKa6yDm2Umtu7WTimCqaWztpau1g07Y21jW2cvicWgDOOHwW\nL23a0fW6lBw8bFhoau3gP36/iluXvcKWHUnRvrpSLJ5VwzteO4cj59ZyxLxaDp45kephVP1TUSFO\nP2wWpx06k6VrNnH1fav51988y3fvW8UFJ+zPRScvZPrE0nbJtOJ4adN2tuxoZ8HU8TyzvoktO9rZ\nmI7xOHxuEixm1ozh8+84tJTZ7OLgYWUtkw1ueeRlvva759m8o52zDp/NiQdM5ch5tRwya+KI6UIr\niZMOmMZJB0zjybpGrr5/FVffv5pr//gCf7VkPpe8cVHJB4XZ4NvQ1ModT6zjjifW8URdIwBvWTyD\nZ9Y3Ud/UxvrG5I6Bh82tKWU2e+XgYWXrf1dt5Mo7n+HZV5t53YIpXH/2oRwxr/TF9aF2xLxavvu+\nY1nTsI3dYBkHAAAP/UlEQVT/vH8NtzzyMjf96WXeceRsLj3lABbPKr8vEhu4rTva+fVTr/KLx9fy\n8AubiYDD59bwj2ct5uwj51A7tprv3LuK+uY2nn21mf2njqOmDKswix48JM0HbgRmAVngmoj4pqQv\nAB8GGtJN/zEifpXuczlwMZABPh4Rvy12vq14Xti4nat+uYK7V2xg3uSxfPd9x3Dm4bP2uTEUi6ZP\n4F/fcyT/920Hc+0f1/Djh1/m54+v49TFM7jslANYsmBKqbNoA7S9rZO7V2zg9sfX8cDKBjoywaJp\n4/nEqQfxjtfO4YDpO/eemjC6ivrmVhqa25hZU7pbzfanFCWPTuDTEfGYpInAo5LuStd9PSK+kr+x\npEOB84DDgDnA3ZIOjohd+0DasNbY0sG371nJDUtfZFRlBX9/xiF88OSF+3zvo1m1Y/js2w/lo28+\nkBuXvsR//e8LvOd7S3ndgilcdsoBnHLI9H0usA4HbZ0Z7n+ugdufWMfdKzbQ2pFldu0YLjp5Iee8\ndg6Hzanp83ObMXE09U1tbNrezsEzS98ttzdFDx4RsR5Yny43S1oBzO1nl3OBWyKiDXhB0irgdcDS\nIc+sFUVnJsvNj7zC1+96ni072vmrY+fz6dMPZsbE8vzFVSqTxo3i46cexIfesJD/fuQVvv/AGi66\n/hEWz5rIZaccwNuPmO2xIiWWyQZLV2/i9ifW8punXqWptZMp40fxnmPncc5r57Jk/8kDGks0o2Y0\n9c2tbNrWxtRFU4uQ88KVtM1D0gLgaOBh4GTgY5LeDywjKZ1sIQksD+XtVkcfwUbSJcAlAPvtt9+Q\n5dsGzx9WNnDlnc/w/IZtHL9wCv/v7EO7epZY78aNquKikxfyvuP35/Yn1vG9+1fziVse56u/e55L\n3riI9xzrsSLFFBE89vJW7nhiHXcuX8/GbW1MGF3FaYfN5JzXzuHkA6cV3ANwxsQxPPrSFrbs6Oga\nXV5uShY8JE0AbgM+GRFNkq4GrgQiff4q8EGgtzAdvR0zIq4BrgFYsmRJr9tYeVjdsI1//uUK7nm2\nnv2mjON7f3MMpx+277Vr7I1RVRW859h5vPvouV1jRT7386f4xt0eK1IMz77axC8eT3pK1W1pYVRV\nBW85ZAbnHjWHNy+esVcBfGbNaNZuTXpaTS3x7Ll9KUnwkFRNEjh+HBE/BYiIDXnrvw/cmb6sA+bn\n7T4PWFekrNoga9zRwTfvWcmNS19kTHUll5+5mA+cvGDEdLktBY8VKZ6XNm3njifWcfsT63h+wzYq\nK8TJB07jk289mNMOmzlovaLyq2ynjXfJAwAlPy2vBVZExNfy0men7SEA7wKeSpdvB26S9DWSBvOD\ngD8VMcs2CDoyWW56+GW+fvfzNLV08N7j9uNTbzvYX2qDyGNFBl9EsLphG/c+28CdT67niVe2AnDc\ngslcee5hnHnEbKYNQckgf9bcKQ4eXU4GLgCelPR4mvaPwPmSjiKpknoR+AhARDwt6VbgGZKeWh91\nT6vh5b7n6vnSL1ewqn4bJy6ayv87+1AOneOxCkOpt7EiP3zoJaorRVVFBVWVYlRl8lxVUZGkV1ZQ\nXZkuV+Re59bnbVMhqiqVplXstG11esyaMdUct2AKB8+cMOyqIne0d7J09Sbue66Be5+rp25LUn10\n6OwaLj9zMWe/dk6/c5oNhiX7d3fDLtdqK0WMzKaBJUuWxLJly0qdjaLKZIP65lbWbW1h7dZW6pta\nqR1bzfwp45g3eSyzasYUtTfOqvpmvvTLFdz3XAP7Tx3HZ896DW87dOaw+zIZCV5tbOVnf15LU2sH\nnZksHZmgM5ulozPoyGbpzL3OBB2Z5HVHJktnNnnuyASdO73ufZuepo4fxQkHTOXERVM56YCpLJw2\nviw//xc2bue+5+q597kGHlqzifbOLONGVXLSAdN48+LpnHLIjCEPGD0t+MwvAXj8829j0rjilD4k\nPRoRSwayrUeYDyNNrR2s29rSFRxyy8kjmbk1k+37x0BlhZhdO4Z5k8cyb/I45k8ely6PZd6Uccyq\nGbNXM83mbNnezjfvWckPH3qJcdWVfPas1/D+k/Z3u0YJzaodw2WnHDCk54gIMtmgMxs0NLexdM0m\nlq5OHr9cntRIz6wZzUkHTOPERVM58YCpJatGa+3I8PALm7n32Xrue66eFzftAJLqogtO2J83HzKD\n4xZOLunf7OJZE3n21eayHF0OLnmUjY5Mllcb04DQmASD/MCwbmsLzW2dO+1TVSFmTxrD7NpkavA5\nk8YwZ9JY5qRThc+cOIYtO9qp29JC3ZYdXc+vpM8bmtp6PV53UOl+nj9lLDMm9h9cOjJZfvTQS3zj\n7pU0t3Zw/uuSdo1yLXZbcUQEL2zcztI1m3hw9SYeWr2JTduTm2nNmzyWkw5IAsmJi6Yxq3boxva8\nsnlHV+niwdUbae3IMqa6ghMXTeXNi2dwysEz2G9q+bQJNbV2ULe5pahVvIWUPBw8hkAmGzS3dtDY\n0kFTSyeNLelyV1ryvHVHB+vTQLGhuZWeH8WU8aOY009wmDZh9F6VFNo6M6zb2toVWF7ZvGOnQFPf\nvHNwqa4UcyalJZVJSWDJVYlt3t7Ol3/zLGsatvP6A6fxubNf4zmYrFcRwcr6bTy4aiNL12zioTWb\naUzv2b1o2vgkkBwwlRMWTd2rxui2zgzLXtzCvc/Wc+9z9axu2A4kN1R6y+IZnHLIdE5YNNVjYvI4\neLD3waO1I9P1Jd/UWyDosa6xpZOmNL1nCaGnqgpRO7aa2nHVzK5NgkMSELqDw5zasYwdVdo/6taO\nDOu2tnSVVJLA0r3c0CO4LJo2ns++/TW8ZfGMsqzXtvKUyQYr1jclVVxrNvHwmk1sb0/6xBwyc2J3\nMFk4ldpx/VfhrNva0tXQ/eCqjWxvzzCqsoLjF03hzYckAaNc213KgYMHexY8IoKTv/x7Nm5vpz29\nr3Vfxo2qpHZscqOf2rHV1IytpmZsVRIUeqR3paXrx1ZXjog/3taOTFcwae3I8JbFMxlV5ekxbO90\nZLI8ubaRpas38dCaTTzy4mZaO7JIcNicmq42k+MWTmF0VQWPvrSFe5+r575nG3huQzMAcyeNTRq6\nD57BSQdOZdwoN+8OhIMHe17y+OIdz1Bdpd6//MdUdaUNpxsOmQ1nbZ0ZnnilkQdXb2Tp6k38+eWt\ntGeyVFaIMVUVbG/PUF0pjlvQXbo4cMbw6yJcDhw8GH4N5mY2MC3tGR57eQsPrt5IY0sHrz9wOicf\nONVTsQwCd9U1sxFr7KhKTj5wGicfOK3UWdmnue7FzMwK5uBhZmYFc/AwM7OCOXiYmVnBHDzMzKxg\nDh5mZlYwBw8zMyuYg4eZmRVsxI4wl9QAvFTCLEwDNpbw/INpJF1Lzki7ppF2PTDyrmk4XM/+ETF9\nIBuO2OBRapKWDXSYf7kbSdeSM9KuaaRdD4y8axpp1+NqKzMzK5iDh5mZFczBY+hcU+oMDKKRdC05\nI+2aRtr1wMi7phF1PW7zMDOzgrnkYWZmBXPwMDOzgjl4pCTNl3SvpBWSnpb0iTR9iqS7JK1Mnyen\n6YslLZXUJunvejlepaQ/S7qzn3NemB53paQL07Rxkn4p6dk0H18ertfSY/3tkp4q9FrK8ZokjZJ0\njaTn08/pL4b59Zwv6UlJyyX9RtIe3WWpRNf0G0lbe24jaaGkh9Nz/rekUcP8en4s6TlJT0m6TlLp\nb5sYEX4k7T6zgWPS5YnA88ChwL8Bn0nTPwP8a7o8AzgOuAr4u16O9yngJuDOPs43BViTPk9OlycD\n44A3p9uMAv4AnDkcryVv/bvT/Z8a7p9Puu6fgC+lyxXAtOF6PSR3E63PXUN6/i8Mh88o3eZU4B09\ntwFuBc5Ll78HXDbMr+csQOnj5j25nsF+uOSRioj1EfFYutwMrADmAucCN6Sb3QC8M92mPiIeATp6\nHkvSPODtwA/6OeXpwF0RsTkitgB3AWdExI6IuDc9RzvwGDBvOF5Luv8Ekn+aLxVyDeV8TcAHgX9J\nz5ONiIJHDZfR9eS+kMZLElADrCv0ekp0TUTEPUBzj30FvAX4Sc9zDsfrSdN/FSngTxT4nTAUHDx6\nIWkBcDTwMDAzItZD8sdE8utid74B/D2Q7WebucArea/r0rT8fEwi+RVyzwCzvosyuJYrga8COwrJ\nd39KeU3pZwJwpaTHJP2PpJmFXcHOSnk9EdEBXAY8SRI0DgWuLewKdlWka+rLVGBrRHSmr3f53ypU\nia8nPx/VwAXAb/bmOIPBwaOH9JfybcAnI6JpD/Y/G6iPiEd3t2kvaV39piVVkRRPvxURawrNR3qM\nkl6LpKOAAyPiZ4Weu588lfrzqSL51fe/EXEMsBT4SqH5yMtPqT+japLgcTQwB1gOXF5oPnrkqVjX\n1Ocheknb4zEJZXA9+b4LPBARfxiEY+0VB4886T/SbcCPI+KnafIGSbPT9bNJ6of7czJwjqQXgVuA\nt0j6kaTjJT2ePs4h+TU0P2+/eexcXXANsDIivjGMr+VE4Nh0/z8CB0u6b0+up4yuaRNJKSoXEP8H\nOGYYX89RABGxOq0SuRU4aU+upwTX1JeNwKT0Bxjs+r813K4nl5crgOkk1cClV+pGl3J5kPxauRH4\nRo/0f2fnxrF/67H+C/TSOJauO4X+GzBfIGm0nJwuT0nXfYnkD7ZiuF9L3jYL2LsG87K5JtIvgHT5\nA8D/DNfrISltrAemp9tdCXx1OHxG/W1DEtTzG8z/dphfz4eAB4Gxe/LZDMWj5BkolwfwepKi7XLg\n8fRxFkn96T3AyvQ59wUyi+TXXBOwNV2uKeQPhaThdVX6uChNm5fmY0VePj40HK+lx/oF7F3wKJtr\nAvYHHkjzcg+w3zC/nkvTv7flwB3A1GH0Gf0BaABa0v1PT9MXkTQsryIJJKOH+fV0Aqvz8vH5Pf1f\nGqyHpycxM7OCuc3DzMwK5uBhZmYFc/AwM7OCOXiYmVnBHDzMzKxgVbvfxMwGSlKGZKqPapLulTeQ\njBPYq2kpzMqNg4fZ4GqJiKMAJM0gmUW1FriipLkyG2SutjIbIhFRD1wCfEyJBZL+kE6o+JikkwAk\n/VDSubn90ns37Ha6CrNS8iBBs0EkaVtETOiRtgVYTDLVdjYiWiUdBNwcEUskvQn4vxHxTkm1JCOI\nD4ruWWHNyo6rrcyGXm6W12rgO+lswxngYICIuF/Sf6TVXO8GbnPgsHLn4GE2hCQtIgkU9STtHhuA\n15JUGbfmbfpD4H3AeSRzUJmVNQcPsyEiaTrJjK7fiYhIq6TqIiKr5B7ilXmbX08ykd+rEfF08XNr\nVhgHD7PBNVbS43R31f0h8LV03XeB2yT9JXAvsD23U0RskLQC+HmR82u2R9xgblYGJI0jGR9yTEQ0\nljo/ZrvjrrpmJSbprcCzwLcdOGy4cMnDzMwK5pKHmZkVzMHDzMwK5uBhZmYFc/AwM7OCOXiYmVnB\n/j/T+0ufNWKDwwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "117167.702299\n", "Current answer for task total_num_items_sold_var is: 117167.702299\n" ] } ], "source": [ "shop_id = 25\n", "\n", "shop_id = 25\n", "\n", "trans = transactions[transactions['shop_id'] == shop_id]\n", "trans = trans[trans['date'].str.endswith('12.2014')]\n", "trans = trans['item_cnt_day'].groupby(trans['date']).sum()\n", "total_num_items_sold = trans.values\n", "days = trans.index.to_datetime()\n", "\n", "total_num_items_sold_var = trans.var()\n", "\n", "# Plot it\n", "plt.plot(days, total_num_items_sold)\n", "plt.ylabel('Num items')\n", "plt.xlabel('Day')\n", "plt.title(\"Daily revenue for shop_id = 25\")\n", "plt.show()\n", "\n", "print(total_num_items_sold_var)\n", "grader.submit_tag('total_num_items_sold_var', total_num_items_sold_var)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Authorization & Submission\n", "To submit assignment to Cousera platform, please, enter your e-mail and token into the variables below. You can generate token on the programming assignment page. *Note:* Token expires 30 minutes after generation." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "STUDENT_EMAIL = carlosesva@outlook.com\n", "STUDENT_TOKEN = YTDNjxpYo94Psil5\n", "grader.status()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "grader.submit(STUDENT_EMAIL, STUDENT_TOKEN)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Well done! :)" ] } ], "metadata": { "hw_version": "1.0.0", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.2" } }, "nbformat": 4, "nbformat_minor": 2 }