{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Etalumis SC 2019"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "edison_scaling_dir='/project/projectdirs/dasrepo/etalumis/SC19/data/scaling/edison_logs/'\n",
    "cori_scaling_dir='/project/projectdirs/dasrepo/etalumis/SC19/data/scaling/cori_logs/'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Edison Scaling"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "edisonlog_list=['train-log-12622746-1-64',\n",
    "          'train-log-12618213-64-64',\n",
    "          'train-log-12618375-128-64',\n",
    "          'train-log-12618433-256-64',\n",
    "          'train-log-12620969-512-64',\n",
    "          'train-log-12655512-1024-64']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "dfedison_list=[]\n",
    "for log in edisonlog_list:\n",
    "    dfedison_list.append(pd.read_csv(edison_scaling_dir+log))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def moving_average(data, wsize):\n",
    "    if(len(data)<wsize):\n",
    "        return data.mean()\n",
    "    else:\n",
    "        steps=len(data)-wsize\n",
    "        ma=[]\n",
    "        for i in range(steps):\n",
    "            ma.append(data[i:wsize+i].mean())\n",
    "        return ma"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "edison_mean=[]\n",
    "edison_std=[]\n",
    "edison_scaling=[]\n",
    "edison_nodes=[]\n",
    "edison_ideal=[]\n",
    "edison_ideal_std=[]\n",
    "edison_peak=[]\n",
    "edison_10iter_avg=[]\n",
    "edison_10iter_std=[]\n",
    "edison_ma=[]\n",
    "edison_scaling2=[]\n",
    "for idx,de in enumerate(dfedison_list):\n",
    "    edison_mean.append(de[' traces_per_second'][1:].mean())\n",
    "    edison_ma.append(moving_average(de[' traces_per_second'][1:], 10))\n",
    "    edison_std.append(de[' traces_per_second'][1:].std())\n",
    "    edison_peak.append(de[' traces_per_second'][1:].max())\n",
    "    temp= np.asarray(de[' traces_per_second'][1:])\n",
    "    \n",
    "    edison_10iter_avg.append(temp[temp.argsort()[-10:]].mean())\n",
    "    edison_10iter_std.append(temp[temp.argsort()[-10:]].std())\n",
    "    if (idx==0):\n",
    "        edison_scaling.append(1)\n",
    "        edison_nodes.append(1)\n",
    "        edison_ideal.append(np.mean(edison_ma[0]))\n",
    "        edison_ideal_std.append(np.std(edison_ma[0]))\n",
    "        edison_scaling2.append(1)\n",
    "    else:\n",
    "        edison_scaling.append(np.mean(edison_ma[-1])/np.mean(edison_ma[0])/np.power(2,5+idx))\n",
    "        edison_nodes.append(np.power(2,5+idx))\n",
    "        edison_ideal.append(np.mean(edison_ma[0])*np.power(2,5+idx))\n",
    "        edison_ideal_std.append(np.std(edison_ma[0])*np.power(2,5+idx))\n",
    "        edison_scaling2.append(edison_mean[-1]/edison_mean[0]/np.power(2,5+idx))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.62412403476241141,\n",
       " 39.94393822479433,\n",
       " 79.88787644958866,\n",
       " 159.77575289917732,\n",
       " 319.55150579835464,\n",
       " 639.10301159670928]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "edison_ideal_std"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best:28.00, mean:26.84, std:0.62\n",
      "best:1479.92, mean:1415.65, std:46.65\n",
      "best:2890.83, mean:2807.21, std:49.95\n",
      "best:5873.26, mean:5513.15, std:159.56\n",
      "best:11650.51, mean:10886.75, std:309.32\n",
      "best:23053.91, mean:21693.43, std:733.39\n"
     ]
    }
   ],
   "source": [
    "edison_ma_max=[]\n",
    "edison_ma_mean=[]\n",
    "edison_ma_std=[]\n",
    "for x in edison_ma:\n",
    "    edison_ma_max.append(np.max(x))\n",
    "    edison_ma_mean.append(np.mean(x))\n",
    "    edison_ma_std.append(np.std(x))\n",
    "    print ('best:%.2f, mean:%.2f, std:%.2f'%(np.max(x),np.mean(x), np.std(x)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([29.405100344248371,\n",
       "  1784.810861747633,\n",
       "  3601.947998628817,\n",
       "  6861.7816010689367,\n",
       "  13495.696002026729,\n",
       "  28430.453556895263],\n",
       " [26.843991266393505,\n",
       "  1718.0154410491843,\n",
       "  3436.0308820983687,\n",
       "  6872.0617641967374,\n",
       "  13744.123528393475,\n",
       "  27488.24705678695])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "edison_peak, edison_ideal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "942.20650010831378"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "edison_peak[-1]-edison_ideal[-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "28430.453556895263"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "edison_peak[-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([   1,   64,  128,  256,  512, 1024])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array(edison_nodes)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "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": [
    "fig, ax1 = plt.subplots()\n",
    "color = 'tab:green'\n",
    "ax1.set_xlabel('Number of Nodes')\n",
    "ax1.set_ylabel('Throughput: Traces/Sec')\n",
    "ax1.errorbar(edison_nodes, edison_mean, yerr=edison_std,fmt='-*', ecolor='cornflowerblue', capthick=5,color='cornflowerblue', label='Average')\n",
    "ax1.errorbar(edison_nodes, edison_ideal,yerr=edison_ideal_std, linestyle='--',fmt='-*',color='black',label='Ideal')\n",
    "#ax1.plot(edison_nodes, np.array(edison_ideal) - np.array(edison_ideal_std),linestyle='--',color='black',label='Ideal')\n",
    "#ax1.plot(edison_nodes, np.array(edison_ideal) + np.array(edison_ideal_std),linestyle='--',color='black')\n",
    "plt.fill_between(np.array(edison_nodes), np.array(edison_ideal) - np.array(edison_ideal_std), np.array(edison_ideal) + np.array(edison_ideal_std), color='gray', alpha=0.5)\n",
    "#ax1.plot(edison_nodes, edison_ma_mean,linestyle=':',marker='o',color='cyan',label='MA_Mean')\n",
    "ax1.plot(edison_nodes, edison_peak,linestyle=':',marker='o',color='goldenrod',label='Peak')\n",
    "ax1.set_xticks(edison_nodes)\n",
    "\n",
    "ax1.set_title('Weak Scaling on Edison')\n",
    "fig.legend(loc=1, bbox_to_anchor=(0.878,0.38))\n",
    "fig.savefig('scaling_edison_2019_idealerr.pdf')\n",
    "#print ('Best 10 Iterations Average:',np.round(edison_10iter_avg,2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Cori Scaling"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "#https://docs.google.com/spreadsheets/d/1wMInU0OV6IwK0Z020_4s8C2t8Wzhe4k2j3UTNMa3np8/edit#gid=0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "corilog_list=[\n",
    "          'train_loss_log_15Mdata_BZPT-64-Nodes-1-LR-10_scaling-20069909',     # jialin's run\n",
    "          'train_loss_log_15Mdata_BZPT-64-Nodes-64-LR-10_scaling-19985650',    # jialin's run\n",
    "          'train_loss_log_15Mdata_BZPT-64-Nodes-128-LR-10_scaling-19939809',   # jialin's run\n",
    "          'train_loss_log_15Mdata_BZPT-64-Nodes-256-LR-10_scaling-20039395',   # jialin's run\n",
    "          'train_loss_log_15Mdata_BZPT-64-Nodes-512-LR-10_scaling-19969337',   # jialin's run\n",
    "          #'train_loss_log_15Mdata_BZPT-64-Nodes-1024-LR-10_scaling-19969341'] # jialin's run\n",
    "          'train_loss_log_15Mdata_BZPT-64-Nodes-1024-LR-10_scaling-19931889'] # reservation run"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "dfcori_list=[]\n",
    "for log in corilog_list:\n",
    "    dfcori_list.append(pd.read_csv(cori_scaling_dir+log))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "cori_mean=[]\n",
    "cori_std=[]\n",
    "cori_scaling=[]\n",
    "cori_nodes=[]\n",
    "cori_ideal=[]\n",
    "cori_ideal_std=[]\n",
    "cori_peak=[]\n",
    "cori_10iter_avg=[]\n",
    "cori_10iter_std=[]\n",
    "cori_ma=[]\n",
    "cori_scaling2=[]\n",
    "for idx,de in enumerate(dfcori_list):\n",
    "    cori_mean.append(de[' traces_per_second'][1:].mean())\n",
    "    cori_ma.append(moving_average(de[' traces_per_second'][1:], 10))\n",
    "    cori_std.append(de[' traces_per_second'][1:].std())\n",
    "    cori_peak.append(de[' traces_per_second'][1:].max())\n",
    "    temp= np.asarray(de[' traces_per_second'][1:])\n",
    "    cori_10iter_avg.append(temp[temp.argsort()[-10:]].mean())\n",
    "    cori_10iter_std.append(temp[temp.argsort()[-10:]].std())\n",
    "\n",
    "    if (idx==0):\n",
    "        cori_scaling.append(1)\n",
    "        cori_nodes.append(1)\n",
    "        cori_ideal.append(np.mean(cori_ma[0]))\n",
    "        cori_ideal_std.append(np.std(cori_ma[0]))\n",
    "        cori_scaling2.append(1)\n",
    "    else:\n",
    "        cori_scaling.append(np.mean(cori_ma[-1])/np.mean(cori_ma[0])/np.power(2,5+idx))\n",
    "        cori_scaling2.append((cori_mean[-1])/(cori_mean[0])/np.power(2,5+idx))\n",
    "        cori_nodes.append(np.power(2,5+idx))\n",
    "        cori_ideal.append(np.mean(cori_ma[0])*np.power(2,5+idx))\n",
    "        cori_ideal_std.append(np.std(cori_ma[0])*np.power(2,5+idx))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best:64.95, mean:59.97,std:1.61\n",
      "best:2927.44, mean:2202.82,std:243.38\n",
      "best:5992.85, mean:5264.68,std:456.47\n",
      "best:10797.43, mean:7070.99,std:1727.11\n",
      "best:18103.93, mean:14579.42,std:1060.22\n",
      "best:32175.93, mean:30471.45,std:1817.22\n"
     ]
    }
   ],
   "source": [
    "cori_ma_max=[]\n",
    "cori_ma_mean=[]\n",
    "cori_ma_std=[]\n",
    "for x in cori_ma:\n",
    "    cori_ma_max.append(np.max(x))\n",
    "    cori_ma_mean.append(np.mean(x))\n",
    "    cori_ma_std.append(np.std(x))\n",
    "    print ('best:%.2f, mean:%.2f,std:%.2f'%(np.max(x),np.mean(x),np.std(x)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "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": [
    "fig, ax1 = plt.subplots()\n",
    "color = 'tab:green'\n",
    "ax1.set_xlabel('Number of Nodes')\n",
    "ax1.set_ylabel('Throughput: Traces/Sec')\n",
    "ax1.errorbar(cori_nodes, cori_mean, yerr=cori_std,fmt='-*', capthick=5,color='cornflowerblue', label='Average')\n",
    "ax1.errorbar(cori_nodes, cori_ideal,yerr=cori_ideal_std, linestyle='--',fmt='-*',color='black',label='Ideal')\n",
    "#ax1.plot(cori_nodes, np.array(cori_ideal) - np.array(cori_ideal_std),linestyle='--',color='black',label='Ideal')\n",
    "#ax1.plot(cori_nodes, np.array(cori_ideal) + np.array(cori_ideal_std),linestyle='--',color='black')\n",
    "plt.fill_between(np.array(cori_nodes), np.array(cori_ideal) - np.array(cori_ideal_std), np.array(cori_ideal) + np.array(cori_ideal_std), color='gray', alpha=0.5)\n",
    "#ax1.plot(cori_nodes, cori_ma_mean,linestyle=':',marker='o',color='cyan',label='MA_Mean')\n",
    "ax1.plot(cori_nodes, cori_peak,linestyle=':',marker='o',color='goldenrod',label='Peak')\n",
    "#ax1.plot(cori_nodes, cori_peak,linestyle=':',marker='o',color='cyan',label='Peak')\n",
    "ax1.set_xticks(cori_nodes)\n",
    "#fig.tight_layout()\n",
    "#ax1.tick_params(axis='y', labelcolor=color)\n",
    "ax1.set_title('Weak Scaling on Cori')\n",
    "fig.legend(loc=1, bbox_to_anchor=(0.878,0.38))\n",
    "fig.savefig('scaling_cori_2019_idealerr.pdf')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Cori/Edison Peak"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 238,
   "metadata": {},
   "outputs": [],
   "source": [
    "df=pd.DataFrame([edison_peak,cori_peak],columns=edison_nodes,index=['Edison','Cori'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 239,
   "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>1</th>\n",
       "      <th>64</th>\n",
       "      <th>128</th>\n",
       "      <th>256</th>\n",
       "      <th>512</th>\n",
       "      <th>1024</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Edison</th>\n",
       "      <td>29.41</td>\n",
       "      <td>1784.81</td>\n",
       "      <td>3601.95</td>\n",
       "      <td>6861.78</td>\n",
       "      <td>13495.70</td>\n",
       "      <td>28430.45</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Cori</th>\n",
       "      <td>73.48</td>\n",
       "      <td>3488.45</td>\n",
       "      <td>7545.99</td>\n",
       "      <td>12772.02</td>\n",
       "      <td>25699.65</td>\n",
       "      <td>42291.67</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         1        64       128       256       512       1024\n",
       "Edison  29.41  1784.81  3601.95   6861.78  13495.70  28430.45\n",
       "Cori    73.48  3488.45  7545.99  12772.02  25699.65  42291.67"
      ]
     },
     "execution_count": 239,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.round(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Cori/Edison Scaling Efficiency based on Moving Average"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "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>1</th>\n",
       "      <th>64</th>\n",
       "      <th>128</th>\n",
       "      <th>256</th>\n",
       "      <th>512</th>\n",
       "      <th>1024</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Edison</th>\n",
       "      <td>1</td>\n",
       "      <td>0.82</td>\n",
       "      <td>0.82</td>\n",
       "      <td>0.80</td>\n",
       "      <td>0.79</td>\n",
       "      <td>0.79</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Cori</th>\n",
       "      <td>1</td>\n",
       "      <td>0.57</td>\n",
       "      <td>0.69</td>\n",
       "      <td>0.46</td>\n",
       "      <td>0.47</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        1     64    128   256   512   1024\n",
       "Edison     1  0.82  0.82  0.80  0.79  0.79\n",
       "Cori       1  0.57  0.69  0.46  0.47  0.50"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_scale=pd.DataFrame([edison_scaling,cori_scaling],columns=edison_nodes,index=['Edison','Cori'])\n",
    "df_scale.round(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "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>1</th>\n",
       "      <th>64</th>\n",
       "      <th>128</th>\n",
       "      <th>256</th>\n",
       "      <th>512</th>\n",
       "      <th>1024</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Edison</th>\n",
       "      <td>1</td>\n",
       "      <td>0.82</td>\n",
       "      <td>0.82</td>\n",
       "      <td>0.80</td>\n",
       "      <td>0.79</td>\n",
       "      <td>0.79</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Cori</th>\n",
       "      <td>1</td>\n",
       "      <td>0.57</td>\n",
       "      <td>0.68</td>\n",
       "      <td>0.47</td>\n",
       "      <td>0.48</td>\n",
       "      <td>0.45</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        1     64    128   256   512   1024\n",
       "Edison     1  0.82  0.82  0.80  0.79  0.79\n",
       "Cori       1  0.57  0.68  0.47  0.48  0.45"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_scale2=pd.DataFrame([edison_scaling2,cori_scaling2],columns=edison_nodes,index=['Edison','Cori'])\n",
    "df_scale2.round(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[26.843991266393505,\n",
       " 1415.6510107888851,\n",
       " 2807.2097275336123,\n",
       " 5513.1522909917785,\n",
       " 10886.752891666818,\n",
       " 21693.431596917882]"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "edison_ma_mean"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[59.970573380041486,\n",
       " 2202.8151422568944,\n",
       " 5264.6844724019957,\n",
       " 7070.9879654137039,\n",
       " 14579.423887575209,\n",
       " 30471.445598204333]"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cori_ma_mean"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[26.752324969838813,\n",
       " 1405.8592677033926,\n",
       " 2793.9250927911476,\n",
       " 5505.668449209967,\n",
       " 10856.927356400114,\n",
       " 21606.668544622516]"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "edison_mean"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[59.92973198650772,\n",
       " 2205.31981936756,\n",
       " 5231.555427189584,\n",
       " 7142.730153330926,\n",
       " 14790.595648397464,\n",
       " 27895.81288124105]"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cori_mean"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[64.947028542435504,\n",
       " 2927.4435788663104,\n",
       " 5992.8481051584877,\n",
       " 10797.432875395065,\n",
       " 18103.925483690578,\n",
       " 32175.931612265565]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cori_ma_max"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[27.995872076208776,\n",
       " 1479.917704750964,\n",
       " 2890.8257855834445,\n",
       " 5873.2554528922656,\n",
       " 11650.50992392795,\n",
       " 23053.9131453675]"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "edison_ma_max"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[29.405100344248371,\n",
       " 1784.810861747633,\n",
       " 3601.947998628817,\n",
       " 6861.7816010689367,\n",
       " 13495.696002026729,\n",
       " 28430.453556895263]"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "edison_peak"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[73.484709725829291,\n",
       " 3488.4548492429808,\n",
       " 7545.9943758195168,\n",
       " 12772.021168410938,\n",
       " 25699.647753203721,\n",
       " 42291.66747861707]"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cori_peak\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
