Skip to content

Instantly share code, notes, and snippets.

@psychemedia
Last active November 20, 2019 18:01
Show Gist options
  • Save psychemedia/65e267fc6d7492bfe0af142ff4fda8d8 to your computer and use it in GitHub Desktop.
Save psychemedia/65e267fc6d7492bfe0af142ff4fda8d8 to your computer and use it in GitHub Desktop.
Example of scatter plot based on median values by hour from datetimes
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Simple Timeseries Plots in `pandas`\n",
"\n",
"Using a dummy dataset..."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, let's create a function to generate a random datetime between two datetimes:"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"datetime.datetime(2019, 1, 29, 20, 40, 17)"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#https://stackoverflow.com/a/553448/454773\n",
"from random import randrange\n",
"from datetime import timedelta\n",
"from datetime import datetime\n",
"\n",
"def random_datetime(start=datetime.strptime('1/1/2019 1:30 PM','%d/%m/%Y %I:%M %p'),\n",
" end=datetime.strptime('31/1/2019 4:50 AM', '%d/%m/%Y %I:%M %p')):\n",
" \"\"\"\n",
" This function will return a random datetime between two datetime \n",
" objects.\n",
" \"\"\"\n",
" delta = end - start\n",
" int_delta = (delta.days * 24 * 60 * 60) + delta.seconds\n",
" random_second = randrange(int_delta)\n",
" return start + timedelta(seconds=random_second)\n",
"\n",
"random_datetime()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can createa dummy dataframe with a couple of columns of random data:"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>val1</th>\n",
" <th>datetime</th>\n",
" <th>val2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>0</td>\n",
" <td>0.231440</td>\n",
" <td>2019-01-02 07:55:19</td>\n",
" <td>0.291342</td>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>0.266321</td>\n",
" <td>2019-01-22 01:14:58</td>\n",
" <td>0.009075</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>0.952032</td>\n",
" <td>2019-01-09 08:51:14</td>\n",
" <td>1.428048</td>\n",
" </tr>\n",
" <tr>\n",
" <td>3</td>\n",
" <td>0.643093</td>\n",
" <td>2019-01-12 09:13:53</td>\n",
" <td>1.097828</td>\n",
" </tr>\n",
" <tr>\n",
" <td>4</td>\n",
" <td>0.354115</td>\n",
" <td>2019-01-07 10:05:28</td>\n",
" <td>0.660788</td>\n",
" </tr>\n",
" <tr>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <td>995</td>\n",
" <td>0.042920</td>\n",
" <td>2019-01-17 18:38:57</td>\n",
" <td>0.042920</td>\n",
" </tr>\n",
" <tr>\n",
" <td>996</td>\n",
" <td>0.208727</td>\n",
" <td>2019-01-30 04:19:08</td>\n",
" <td>0.104364</td>\n",
" </tr>\n",
" <tr>\n",
" <td>997</td>\n",
" <td>0.249041</td>\n",
" <td>2019-01-02 03:52:03</td>\n",
" <td>0.072942</td>\n",
" </tr>\n",
" <tr>\n",
" <td>998</td>\n",
" <td>0.484270</td>\n",
" <td>2019-01-07 17:22:07</td>\n",
" <td>0.609609</td>\n",
" </tr>\n",
" <tr>\n",
" <td>999</td>\n",
" <td>0.765707</td>\n",
" <td>2019-01-03 03:24:35</td>\n",
" <td>0.224270</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1000 rows × 3 columns</p>\n",
"</div>"
],
"text/plain": [
" val1 datetime val2\n",
"0 0.231440 2019-01-02 07:55:19 0.291342\n",
"1 0.266321 2019-01-22 01:14:58 0.009075\n",
"2 0.952032 2019-01-09 08:51:14 1.428048\n",
"3 0.643093 2019-01-12 09:13:53 1.097828\n",
"4 0.354115 2019-01-07 10:05:28 0.660788\n",
".. ... ... ...\n",
"995 0.042920 2019-01-17 18:38:57 0.042920\n",
"996 0.208727 2019-01-30 04:19:08 0.104364\n",
"997 0.249041 2019-01-02 03:52:03 0.072942\n",
"998 0.484270 2019-01-07 17:22:07 0.609609\n",
"999 0.765707 2019-01-03 03:24:35 0.224270\n",
"\n",
"[1000 rows x 3 columns]"
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"\n",
"numsamples = 1000\n",
"\n",
"df=pd.DataFrame({'val1':np.random.rand(numsamples)})\n",
"df['datetime']= [random_datetime() for i in range(numsamples)]\n",
"#Add some periodicity to the second column of random numbers...\n",
"df['val2']=df.apply(lambda x: x['val1']*(1+np.sin(2*np.pi*(x['datetime'].hour-6)/24)), axis=1)\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>val1</th>\n",
" <th>val2</th>\n",
" </tr>\n",
" <tr>\n",
" <th>datetime</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>0</td>\n",
" <td>0.401714</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>0.611881</td>\n",
" <td>0.020849</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>0.552599</td>\n",
" <td>0.074034</td>\n",
" </tr>\n",
" <tr>\n",
" <td>3</td>\n",
" <td>0.539660</td>\n",
" <td>0.158063</td>\n",
" </tr>\n",
" <tr>\n",
" <td>4</td>\n",
" <td>0.441285</td>\n",
" <td>0.220642</td>\n",
" </tr>\n",
" <tr>\n",
" <td>5</td>\n",
" <td>0.557000</td>\n",
" <td>0.412838</td>\n",
" </tr>\n",
" <tr>\n",
" <td>6</td>\n",
" <td>0.588485</td>\n",
" <td>0.588485</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7</td>\n",
" <td>0.471580</td>\n",
" <td>0.593633</td>\n",
" </tr>\n",
" <tr>\n",
" <td>8</td>\n",
" <td>0.509826</td>\n",
" <td>0.764738</td>\n",
" </tr>\n",
" <tr>\n",
" <td>9</td>\n",
" <td>0.498654</td>\n",
" <td>0.851255</td>\n",
" </tr>\n",
" <tr>\n",
" <td>10</td>\n",
" <td>0.366607</td>\n",
" <td>0.684097</td>\n",
" </tr>\n",
" <tr>\n",
" <td>11</td>\n",
" <td>0.431500</td>\n",
" <td>0.848297</td>\n",
" </tr>\n",
" <tr>\n",
" <td>12</td>\n",
" <td>0.379588</td>\n",
" <td>0.759176</td>\n",
" </tr>\n",
" <tr>\n",
" <td>13</td>\n",
" <td>0.523362</td>\n",
" <td>1.028892</td>\n",
" </tr>\n",
" <tr>\n",
" <td>14</td>\n",
" <td>0.436434</td>\n",
" <td>0.814397</td>\n",
" </tr>\n",
" <tr>\n",
" <td>15</td>\n",
" <td>0.413217</td>\n",
" <td>0.705405</td>\n",
" </tr>\n",
" <tr>\n",
" <td>16</td>\n",
" <td>0.329830</td>\n",
" <td>0.494745</td>\n",
" </tr>\n",
" <tr>\n",
" <td>17</td>\n",
" <td>0.686149</td>\n",
" <td>0.863737</td>\n",
" </tr>\n",
" <tr>\n",
" <td>18</td>\n",
" <td>0.514521</td>\n",
" <td>0.514521</td>\n",
" </tr>\n",
" <tr>\n",
" <td>19</td>\n",
" <td>0.485645</td>\n",
" <td>0.359951</td>\n",
" </tr>\n",
" <tr>\n",
" <td>20</td>\n",
" <td>0.472008</td>\n",
" <td>0.236004</td>\n",
" </tr>\n",
" <tr>\n",
" <td>21</td>\n",
" <td>0.496440</td>\n",
" <td>0.145404</td>\n",
" </tr>\n",
" <tr>\n",
" <td>22</td>\n",
" <td>0.566665</td>\n",
" <td>0.075919</td>\n",
" </tr>\n",
" <tr>\n",
" <td>23</td>\n",
" <td>0.535262</td>\n",
" <td>0.018239</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" val1 val2\n",
"datetime \n",
"0 0.401714 0.000000\n",
"1 0.611881 0.020849\n",
"2 0.552599 0.074034\n",
"3 0.539660 0.158063\n",
"4 0.441285 0.220642\n",
"5 0.557000 0.412838\n",
"6 0.588485 0.588485\n",
"7 0.471580 0.593633\n",
"8 0.509826 0.764738\n",
"9 0.498654 0.851255\n",
"10 0.366607 0.684097\n",
"11 0.431500 0.848297\n",
"12 0.379588 0.759176\n",
"13 0.523362 1.028892\n",
"14 0.436434 0.814397\n",
"15 0.413217 0.705405\n",
"16 0.329830 0.494745\n",
"17 0.686149 0.863737\n",
"18 0.514521 0.514521\n",
"19 0.485645 0.359951\n",
"20 0.472008 0.236004\n",
"21 0.496440 0.145404\n",
"22 0.566665 0.075919\n",
"23 0.535262 0.018239"
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# median value by hour\n",
"df.groupby([df['datetime'].dt.hour]).median()"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x11ff5d890>"
]
},
"execution_count": 67,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"ax = df.groupby([df['datetime'].dt.hour]).median().reset_index().plot(kind='scatter',\n",
" x='datetime',y='val1')\n",
"\n",
"df.groupby([df['datetime'].dt.hour]).median().reset_index().plot(kind='scatter',\n",
" x='datetime',y='val2', color='red', ax=ax)"
]
}
],
"metadata": {
"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.7.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment