Skip to content

Instantly share code, notes, and snippets.

@quizzicol
Created October 3, 2016 04:07
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save quizzicol/9477ec7f769d615412cc39e4dc5f642d to your computer and use it in GitHub Desktop.
Save quizzicol/9477ec7f769d615412cc39e4dc5f642d to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Aggregating by weekday"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"\n",
"plt.style.use('fivethirtyeight')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Create a sets of random data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a list of dates"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"DatetimeIndex(['2016-01-01', '2016-01-02', '2016-01-03', '2016-01-04',\n",
" '2016-01-05', '2016-01-06', '2016-01-07', '2016-01-08',\n",
" '2016-01-09', '2016-01-10',\n",
" ...\n",
" '2016-08-05', '2016-08-06', '2016-08-07', '2016-08-08',\n",
" '2016-08-09', '2016-08-10', '2016-08-11', '2016-08-12',\n",
" '2016-08-13', '2016-08-14'],\n",
" dtype='datetime64[ns]', length=227, freq='D')"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_dates = pd.date_range(start=pd.datetime(2016,1,1), end=pd.datetime(2016,8,14), \n",
" periods=None, freq='D', tz=None, normalize=False, name=None, closed=None)\n",
"test_dates"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a list of random numbers for each date"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[78.212019845377,\n",
" 0.8936315499196712,\n",
" 50.181887139145495,\n",
" 85.6107727201685,\n",
" 9.81952882786208,\n",
" 47.862440926905926,\n",
" 67.62011597473074,\n",
" 82.14646869650619,\n",
" 87.42355681196561,\n",
" 56.03330458832866]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import random\n",
"test_values = [100*random.random() for i in range(len(test_dates))]\n",
"test_values[:10]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Combine the dates and values into a dataframe"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Date</th>\n",
" <th>Sales</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2016-01-01</td>\n",
" <td>78.212020</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2016-01-02</td>\n",
" <td>0.893632</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2016-01-03</td>\n",
" <td>50.181887</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2016-01-04</td>\n",
" <td>85.610773</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2016-01-05</td>\n",
" <td>9.819529</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Date Sales\n",
"0 2016-01-01 78.212020\n",
"1 2016-01-02 0.893632\n",
"2 2016-01-03 50.181887\n",
"3 2016-01-04 85.610773\n",
"4 2016-01-05 9.819529"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.DataFrame(index=test_dates, data=test_values)\n",
"df.reset_index(inplace=True)\n",
"df.columns = ['Date', 'Sales']\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Add a columns showing what day of the week each day is"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Date</th>\n",
" <th>Sales</th>\n",
" <th>day_of_week</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2016-01-01</td>\n",
" <td>78.212020</td>\n",
" <td>Friday</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2016-01-02</td>\n",
" <td>0.893632</td>\n",
" <td>Saturday</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2016-01-03</td>\n",
" <td>50.181887</td>\n",
" <td>Sunday</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2016-01-04</td>\n",
" <td>85.610773</td>\n",
" <td>Monday</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2016-01-05</td>\n",
" <td>9.819529</td>\n",
" <td>Tuesday</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Date Sales day_of_week\n",
"0 2016-01-01 78.212020 Friday\n",
"1 2016-01-02 0.893632 Saturday\n",
"2 2016-01-03 50.181887 Sunday\n",
"3 2016-01-04 85.610773 Monday\n",
"4 2016-01-05 9.819529 Tuesday"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import calendar\n",
"df['day_of_week'] = df['Date'].apply(lambda x: x.weekday()) # get the weekday index, between 0 and 6\n",
"df['day_of_week'] = df['day_of_week'].apply(lambda x: calendar.day_name[x])\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Aggregate by day of week"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Sales</th>\n",
" </tr>\n",
" <tr>\n",
" <th>day_of_week</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Friday</th>\n",
" <td>1707.272991</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Monday</th>\n",
" <td>1533.572469</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Saturday</th>\n",
" <td>1811.806959</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Sunday</th>\n",
" <td>1674.531356</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Thursday</th>\n",
" <td>1522.397920</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Sales\n",
"day_of_week \n",
"Friday 1707.272991\n",
"Monday 1533.572469\n",
"Saturday 1811.806959\n",
"Sunday 1674.531356\n",
"Thursday 1522.397920"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = df.groupby('day_of_week').sum()\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we need to sort the rows in the order we want them.\n",
"\n",
"We could have done that by capturing the 'weekday' above, and sorting on that, but what if we want our week to start on a Wednesday?\n",
"\n",
"Instead, we define the order we want to sort the days by, create a new sorting id to sort by based on this, and then sort by that.\n"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"{'Friday': 5,\n",
" 'Monday': 1,\n",
" 'Saturday': 6,\n",
" 'Sunday': 0,\n",
" 'Thursday': 4,\n",
" 'Tuesday': 2,\n",
" 'Wednesday': 3}"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sorter = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']\n",
"sorterIndex = dict(zip(sorter,range(len(sorter))))\n",
"sorterIndex"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Map the day_of_week to the required sort index"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Sales</th>\n",
" <th>Day_id</th>\n",
" </tr>\n",
" <tr>\n",
" <th>day_of_week</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Friday</th>\n",
" <td>1707.272991</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Monday</th>\n",
" <td>1533.572469</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Saturday</th>\n",
" <td>1811.806959</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Sunday</th>\n",
" <td>1674.531356</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Thursday</th>\n",
" <td>1522.397920</td>\n",
" <td>4</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Sales Day_id\n",
"day_of_week \n",
"Friday 1707.272991 5\n",
"Monday 1533.572469 1\n",
"Saturday 1811.806959 6\n",
"Sunday 1674.531356 0\n",
"Thursday 1522.397920 4"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['Day_id'] = df.index\n",
"df['Day_id'] = df['Day_id'].map(sorterIndex)\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then we just sort by the Day_id"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Sales</th>\n",
" <th>Day_id</th>\n",
" </tr>\n",
" <tr>\n",
" <th>day_of_week</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Sunday</th>\n",
" <td>1674.531356</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Monday</th>\n",
" <td>1533.572469</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Tuesday</th>\n",
" <td>1770.257809</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Wednesday</th>\n",
" <td>1372.784445</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Thursday</th>\n",
" <td>1522.397920</td>\n",
" <td>4</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Sales Day_id\n",
"day_of_week \n",
"Sunday 1674.531356 0\n",
"Monday 1533.572469 1\n",
"Tuesday 1770.257809 2\n",
"Wednesday 1372.784445 3\n",
"Thursday 1522.397920 4"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.sort_values('Day_id', inplace=True)\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now if we plot the data, its in the order we want it."
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nak5Ojpo2bVoUJd70AgICVLdu3Wtez759uYVQzc2Lfi569PH1QT8XPfr4+qCfi15h9PHhw4cvO79I\n7oOam5urrKwsVahQQREREQoNDVVKSorb/KVLl6pRo0aSpOjoaJUoUcKtzc6dO5WZmem0AQAAwK2h\nUI6gDh48WO3atdMdd9yhnJwcjRo1SidOnFBCQoIkaeDAgRo7dqyqVq2qyMhIjR49WgEBAYqPj5ck\nlSpVSj179tSQIUMUHBysoKAgDRo0SLVq1VLLli0Lo0QAAADcIAoloO7cuVOdO3fWvn37FBwcrJiY\nGK1YsUKVKlWSJA0ZMkS5ubnq16+fDh48qPr16ys5OVl+fn7OOhITE+Xl5aVOnTrp5MmTatWqlaZO\nnSoPD4/CKBEAAAA3iEIJqDNnzrxim2HDhmnYsGGXnO/l5aXExEQlJiYWRkkAAAC4QRXJNagAAADA\n70VABQAAgFUIqAAAALAKARUAAABWIaACAADAKgRUAAAAWIWACgAAAKsQUAEAAGAVAioAAACsQkAF\nAACAVQioAAAAsAoBFQAAAFYhoAIAAMAqBFQAAABYhYAKAAAAqxBQAQAAYBUCKgAAAKxCQAUAAIBV\nCKgAAACwCgEVAAAAViGgAgAAwCoEVAAAAFiFgAoAAACrEFABAABgFQIqAAAArEJABQAAgFUIqAAA\nALAKARUAAABWIaACAADAKgRUAAAAWIWACgAAAKsQUAEAAGAVAioAAACsQkAFAACAVQioAAAAsAoB\nFQAAAFYhoAIAAMAqBFQAAABYhYAKAAAAqxBQAQAAYBUCKgAAAKxCQAUAAIBVCKgAAACwCgEVAAAA\nViGgAgAAwCoEVAAAAFiFgAoAAACrEFABAABgFQIqAAAArEJABQAAgFUIqAAAALAKARUAAABWIaAC\nAADAKgRUAAAAWIWACgAAAKsQUAEAAGAVAioAAACsQkAFAACAVQioAAAAsAoBFQAAAFYhoAIAAMAq\nBFQAAABYhYAKAAAAqxBQAQAAYBUCKgAAAKxCQAUAAIBVCKgAAACwCgEVAAAAViGgAgAAwCoEVAAA\nAFiFgAoAAACrEFABAABgFQIqAAAArEJABQAAgFUIqAAAALAKARUAAABWIaACAADAKgRUAAAAWIWA\nCgAAAKtYGVDfe+89Va5cWT4+Pqpbt65SU1OLuyQAAABcJ9YF1NmzZ2vgwIF66aWXtGrVKjVs2FBt\n2rTRzp07i7s0AAAAXAfWBdS33npLPXr0UI8ePVS1alW98847Kl++vCZMmFDcpQEAAOA6sCqgnj59\nWitXrlRcXJzb9AceeEBpaWnFVBUAAACuJw9jjCnuIs7bvXu3KlasqG+++UaNGzd2po8aNUozZsxQ\nZmamM+3w4cPFUSIAAAAKUWBgYL5pVh1BBQAAAKwKqLfffrs8PT2Vk5PjNj0nJ0ehoaHFVBUAAACu\npxLFXcBveXl5KTo6WikpKXrkkUec6SkpKXr00Ufd2l7scDAAAABufFYFVEl65plnlJCQoPvvv1+N\nGjXShAkTtHv3bvXp06e4SwMAAMB1YF1Afeyxx3TgwAGNGTNGu3fv1r333qsFCxaoUqVKxV0aAAAA\nrgOrrkE9r2/fvtqyZYtOnjyp77//Xo0aNSrukq5JQECApkyZUtxl3PRWrlwpl8ulHTt2FHcpt4Rd\nu3bJ5XLpu+++K+5SipUt+924ceMUERFRrDX8Htu3b5fL5VJGRkZxlyJJ2r9/v1wul7755pviLsUq\nlSpV0jvvvHPZNj4+PpoxY8Z1qghXcqNnDysDalHYt2+fnnrqKUVERMjb21uhoaGKi4vT//73v+Iu\n7abQrVs3uVwu9e7dO9+8oUOHyuVy6eGHHy7yOjw8PIr8Oa4nl8slT09PuVyufP88PT3Vo0ePYq3P\n1v7+5z//KX9/f505c8aZdvr0afn6+qpmzZpubTdv3iyXy6Wvv/76dz+fLf1gSx3nFXT/ta1u2+op\nbN27d8/32nh6emrNmjWXXGbVqlV68sknr2OV9rrWPLFkyRK5XC4dOHCgiCu9sVl3ir+o/PGPf1Ru\nbq4++ugj3XXXXdqzZ4+WLFmi/fv3F3dpNwUPDw/dcccd+vjjj/XOO+/Ix8dHknT27FlNnTpV4eHh\nxVzhjSk7O9v5/9y5c/Xkk08qOztb529ffL6fi4tFt1F2Exsbq5MnT+q7775Tw4YNJUnffvutSpcu\nrY0bN2r//v0qW7asJOmrr76St7f3DX+mxkYF2X8PHDhQZPvRmTNnVKLE1X/N2bpfF6a4uDhNmzbN\nbVtvv/32fO1Onz4tLy8v5/2Ca88Txhh5eHgUyn52/vW5Gd0SR1APHz6s1NRUvfrqq2revLkqVaqk\n6OhoPfPMM3rsscckSREREfp//+//uS0XGxurv/3tb87jiIgIjRkzRn379lVgYKAqVaqkN998022Z\nzZs3q3nz5vLx8VFUVJTmzZuXr57nn39e99xzj3x9fRUREaGhQ4fq1KlTks6d7vL09Mx3uutf//qX\ngoOD3Y4I2aZGjRqKjIzUxx9/7EybN2+efHx81Lx5c2eaMUajRo3SHXfcIW9vb9WsWVNffPGFM//8\nKb/PPvtMDzzwgPz8/FS9enV9+eWXbs+3cOFCRUVFycfHR82aNdOGDRvc5h84cECdO3dWpUqV5Ovr\nq3vvvVeTJk1y5k+dOlW33367Tp8+7bbcn//8Z3Xo0KEQeuTahYSEOP9Kly4tSQoODnamBQQE6Kef\nfpLL5dL69eud5X799Ve5XC7Nnz/fmbZjxw499thjKlOmjMqWLav27dtr27Ztzvxt27apXbt2CgoK\nkr+/v+6991795z//ceYvX75ctWvXlo+Pj+rVq5dvHz116pR69OihiIgI+fr6qmrVqnr77bed+Skp\nKfL29tbBgwfdlhs0aJBiYmIKpb/Oi4yMVPny5d2Oin799ddq1aqV6tatq8WLFzvTFy9erAYNGqhk\nyZI6ffq0hg4dqkqVKsnPz0/169dXcnKy27qvtN9NnjxZAQEB+uqrr1SjRg35+/urRYsW2r59u1u7\nuXPnqm7duvLx8dFdd92ll156yW1f/Oyzz3TffffJ19dXZcuWVWxsrPbu3evMf/3111W+fHmVKlVK\n3bp107Fjx9zWn56ertatWys4OFiBgYFq0qSJVqxY4czv2bOn2rVr57aMMUbh4eFur9u1KMj+e962\nbdsu+X6/2BGnCy8NON9mwYIFql+/vry9vZWcnKydO3eqffv2Klu2rPz8/FStWjW3z6jvv//eeR2i\no6P17bffum1DXl6eevXqpcqVK8vX11dVqlTRG2+84cxfunSpSpYsqT179rgt9+KLL6pWrVqF0ItF\n47bbbnN7LUJCQuRyudSkSRP1799fgwYNUkhIiPPZfeEp/o0bN6pp06by8fFRtWrVtHDhwnzPMXjw\nYFWtWlW+vr6qXLmynn/+eWcf37Jly0WP2k6YMEGhoaE6e/Zs0W38NShInpg+fbrq1aunUqVKqVy5\ncnrsscf0yy+/SDq337Zo0ULSuffCb88kXJg5pHNHu3979jE2NlZPPfWUBg8erJCQEOePGm3atOmm\nyx63RED19/eXv7+/vvjiC/3666/XtK63335bNWvW1A8//KChQ4dqyJAhzgeaMcYJNt9++62SkpI0\n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\nlBTn9Mv5X+8XvmY3uoyMDGVmZiogIMD5FxQUpBMnTmjz5s2SpIEDB+rFF19U48aNNXz4cK1evdpZ\nPisrS7Vr11bJkiWdaQ0aNMh3DdW7776runXrOqdvJ0yY4Nbf3bt315o1a7Rq1SpJ5/r7T3/6k/z9\n/Qt9m1u0aKGTJ09q+fLlWr58uUJCQlS5cmU1atRIW7Zs0Z49e/T111/Lz8/PuWTBGKNq1aq59dP8\n+fO1ZcsWpx+utN9J506f3n333c7jChUq6NSpUzp06JCkcyP/x4wZ4/Y8nTt31smTJ5WTk6P77rtP\nLVu2VPXq1fWnP/1J77//vvbt2+esLzMz84p17N27V3369FHVqlVVunRplSpVSnv37s23/58/Enjg\nwAHNmTOn2I76Xe79XlAeHh6Kjo52mzZgwACNGjVKDRs21Msvv+x2CjMrK0s1a9Z0u5b7Yvv1+++/\nr/vvv9/Zr9966y23fuzatas2b97sXELx0UcfqUOHDipTpsxV1X89NWvWTGvWrNHq1au1evVqffDB\nB868C/vwQllZWbrjjjvc/sJjTExMviPas2fPVuPGjZ3vumeffdat3zp27ChjjHMp0YcffqiGDRsq\nMjKyMDaxyFwpT2RkZKhDhw668847VapUKd1///3y8PAotDt9XPj63KzZ4+b6Fr6CkiVLqmXLlnrp\npZeUmpqqnj17asSIETp9+rRcLle+D6ULr02UlO9iZA8PD+Xl5RW4hhUrVig+Pl5t2rTRf//7X61a\ntUqjR492e64SJUooISFBSUlJOnv2rKZNm3ZDnSrq0aOHpkyZoqSkJPXs2bPAy1344XaxC7+vpq/f\neOMNvfXWWxo6dKi++uorrV69Wu3bt3c77VGzZk3Vrl1bkyZN0rp165Senp7vkgTbnd93f7v/Xrjv\n5uXlKSYmxu0LafXq1dqwYYOzvX/5y1+0ZcsWJSQkKDMzU/Xq1dPrr79e4DomT56s5557Tn369FFK\nSopWr16tXr16ufV3hQoV1KZNGyUlJSknJ0cLFy4ssn37zjvvVHh4uBYvXqzFixerWbNmkiRfX19F\nR0fr66+/1pIlS9S4cWN5enoqLy9PLpdL6enpbn2UmZnpdtlKQVx4Ouz8vn1+/83Ly3N+BJz/t3bt\nWm3YsEHBwcFyuVxKTk5WSkqK7rvvPn344YeKjIx0LjUoiISEBK1cuVKJiYlavny5Vq9erYoVK7q9\nHl26dNH27duVlpam6dOnKyQkRA888MBVbWthudz7/fwX7eX28fP8/PzcHvfo0UPbtm1Tjx49tHHj\nRjVs2FAjR44scF2zZ8/W008/rR49eig5OVmrV6/WU0895daPt99+ux5++GElJSXpwIED+uKLL6z/\nzD5/HWLlypVVuXJllS9f3pl3YR/+HqmpqXriiSfUtm1b57tu5MiRbv1WsmRJdenSRUlJSUV6uU9R\nuFSeOHLkiB588EH5+/tr2rRpSk9P18KFC2WMyXfK/UIFzSG/5/W5EbOHvRc0XgdRUVE6c+aMfv31\nVwUHB2v37t3OvNzcXGVlZalOnTpXtb5du3Zp165dzi+Zb7/91i1UpaWlKSwsTC+88IIz7bcDVc7r\n1auXqlWrpvfee0/Hjh3T448//ju2sHi0bNlSJUuW1IEDB9S+fXu3eQEBAapQoYKWLVum2NhYZ3pq\naqqqVatW4OeIiopyfuWdt3z5crfHy5YtU7t27ZxrfyRpw4YN+Y5q9O7dW6+//rr27t2rxo0bW//r\n/ULBwcGSpN27d6t69eqSpB9++MGtTZ06dTRv3jyFhIRc9sMtLCxMTz75pJ588kmNHDlS//znPzVk\nyBCnv387YnT58uVuPyqWLVumpk2but1qbOPGjfmeo3fv3urWrZuCg4MVERFRpKPnY2Nj9dVXX8kY\no65duzrTmzVrpq+++kqLFy/WoEGDJEm1a9eWMUa7d+92wuyFCrLfFUSdOnWUlZWlypUrX7Zd/fr1\nVb9+fb388suqXr26Zs+erRo1aigqKkorVqxQt27dLlnHsmXL9O677+rBBx+UdO661t9+xklSmTJl\n9Mc//lEffvihfvjhB7c+sklwcLDz2pwfTf7DDz8U+HZQFSpUUK9evdSrVy+9/vrreueddzRs2DBF\nRUVp8uTJOnnypHMU9WL7dUxMjP7yl7840zZt2pTvOXr37q0//elPioiIUPny5dWyZctr2WSrRUVF\naceOHcrOznaOoq5YscItXKWlpenOO+/Uc88950zbunVrvnX17t1bNWvW1Hvvvadff/013581v1Gc\nzxOrVq3Svn37NGbMGOfuNT/++KPbPnX+TNSFA8EuzCGStHr16ive3/hmzR63xBHUAwcOqGXLlpo+\nfbrWrl2rbdu26d///rfeeOMNtWrVyhllO336dC1ZskTr1q1Tz549r3oUYatWrVS1alV16dJFq1ev\n1vLly/XMM8+4HRmoUqWKdu3apRkzZmjr1q2aMGGCZs2alW9dVapUUePGjTV48GA9+uijRXIKtCit\nXbtWW7ZsuehRkcGDB+vNN9/UrFmztHHjRg0bNkypqakaPHhwgdfft29fbdu2TQMHDtSGDRv0ySef\naOLEiW5tqlSpov/9739atmyZsrKy1K9fv4t+QMbHxys7O1vvv//+DfPr/bdKly6tWrVqaezYsc6A\nmueff97tA7Fr164KCAhQhw4dlJqaqm3btmnJkiUaOHCgfv75Z0lS//79lZKSom3btikjI0MpKSlO\n4E1ISNDp06fVs2dPZWZmasGCBW4jmaVz/f3tt9/qyy+/dF7XC0dES9If/vAH+fj46O9///tVHWH/\nPWJjY7VixQp99913bneSaNasmWbNmqW9e/c6P5QiIyPVuXNndevWTZ9++qm2bt2qlStXaty4cc4p\nyILsd5fy2y/vYcOGacaMGRo+fLjWrVunn376SZ9++qmGDh0q6dyXy5gxY5Senq6ff/5Zc+bM0c6d\nO53XY8CAAZo8ebI++OADbdq0SWPHjs33BxOqVKmiadOmKTMzU99//73i4+N122235aurV69emj59\nutasWVPs99W9lLvvvluVKlXSiBEjtHHjRiUnJzuDO37rwqNP0rlLVxYtWqStW7dq1apVWrhwodOP\nnTt3lqenp7p3767169crJSVFf//7392Wr1KlijIyMrRw4UJt2rRJo0aNuuhN/OPi4lS2bFm98sor\nN9xZmKvVunVr3XXXXXriiSe0Zs0aLVu2TIMHD3Yb2FSlShXt2LFDs2bN0pYtW/SPf/xD//73v/Ot\nKyoqSvXr19eQIUP0+OOPy9fX93puylW7Up6oVq2abrvtNr377rvaunWr5s2bp2HDhrmtIzw8XB4e\nHpo3b5727dun48ePSzp3WdKCBQs0d+5cbdiwQYMGDXI+ny/nps0e1/+y1+vv119/NS+++KKpV6+e\nCQoKMn5+fqZKlSrm2WefNQcPHjTGGHPkyBHTuXNnU7p0aRMWFmYmTJhgYmNj3S5YjoiIyDeQ6sI2\nGzduNM2bNzfe3t6mSpUqZu7cuSYgIMDtQuUXXnjBhISEmICAAPPII4+Y999//6KDB6ZMmWJcLpdJ\nTU0t7C4pdBdeyH25+Xl5eWb06NHmjjvuMLfddpupWbOm+eKLL5y227ZtMy6Xyxn8cJ7L5TKffvqp\n83j+/PnmnnvuMT4+PqZx48ZmxowZboNVDh48aB555BFTqlQpU65cOTN06FDz17/+1cTGxuarr0eP\nHiYwMNBtsIRtLjXIxBhjfvzxR9OgQQPj5+dnateubZYsWWJcLpczSMoYY3bv3m0SEhJMSEiI8fHx\nMXfddZd58sknzeHDh40xxvTp08fcfffdxsfHx5QrV8506dLF7Nmzx1l+2bJlplatWsbb29vUqVPH\nzJkzx22QVG5urunWrZspU6aMCQoKMn379jUvv/yy26CI81544YV8gyyKws8//2xcLpcJDw93m37s\n2DHj5eVlypQpY/Ly8pzpZ86cMa+88oq56667zG233WbKly9v2rdvbzIyMpw2V9rvJk2aZAICAtye\n72KDIlJSUkzTpk2Nn5+fCQwMNPfff78ZP368MebcoIo2bdqY0NBQ4+3tbSIjI82bb77pts5XX33V\nlCtXzgQEBJg///nP5pVXXnEbJLVmzRoTExNjfH19zd13322mTZtmatSoYV555ZV8/XTXXXeZVq1a\nXWXvXp3LDZIqyPt9+fLlpnbt2sbX19c0bNjQzJ8/3225Sw086d+/v6lSpYrx8fExISEhJj4+3vzy\nyy/O/O+++85ER0cbb29vU6tWLfPf//7XbZDUqVOnTK9evUxQUJApU6aM6dWrlxk1atRFB6SNHDnS\neHp6Xnagpg0u93ndpEkT8/TTT+ebXqlSJWeQlDHG/PTTT6Zp06bG29vbVK1a1cyfP9/4+Pi4DZIa\nOnSoCQkJMaVKlTKPPvqoee+994yXl1e+dSclJRmXy2VWrFhRCFtXtAqSJz7++GPns7R+/fomOTk5\n38C70aNHmwoVKhhPT0/TvXt3Y4wxp0+fNv369TPBwcEmODjYjBgxwnTv3t3ttbowc5x3M2YPD2Nu\ngTsS36Bee+01ffTRR8rKyiruUm56Dz30kCpVqlTgo2G4Nj169ND+/fvdbvGF4pGbm6uKFStq/Pjx\n6tSpU3GXc0N76qmntHnzZi1atKi4S7mhjBkzRjNnztSPP/5Y3KVA9mSPW/oaVFsdP35c27Zt0zvv\nvKOXX365uMu5qR06dEjffPONUlJSLvtn/lA4jhw5olWrVmnmzJlasGBBcZdzSzPGaO/evUpMTJSv\nr+8Ne+2fDY4cOaJ169ZpypQp+uSTT4q7nBvG8ePHndP/o0aNKu5ybnnWZY9iPX6Li+rWrZvx9vY2\njz/+uJX347yZ3HnnnSYwMNC88cYbxV3KLSEmJsb4+/ubIUOGFHcpt7zz9xG94447zJdfflnc5dzQ\nmjdvbvz8/MyAAQOKu5QbyhNPPGF8fHxMfHy826U2KB62ZQ9O8QMAAMAqt8QofgAAANw4CKgAAACw\nCgEVAAAAViGgAgAAwCoEVAAAAFjl/wPkzJH/vP4/PAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f0dbb238cf8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(figsize=(10,6), facecolor='white')\n",
"\n",
"ax.bar(df.Day_id, df.Sales)\n",
"ax.set_xticks([x+0.4 for x in df.Day_id])\n",
"ax.set_xticklabels(df.index)\n",
"ax.set_axis_bgcolor('white')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [Root]",
"language": "python",
"name": "Python [Root]"
},
"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.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment