{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This is for making the power function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import sys"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "sys.path.insert(0, '/Users/joel/src/thundr/tracker')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from tracker import db"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from datetime import datetime"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Engine(postgres://joel:***@localhost:5432/test)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "db.setup_session()\n",
    "db.Session.get_bind()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "test_data = [[0, 1], [1, 4], [3, 20], [8, 30]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df = pd.DataFrame(test_data).set_index(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x10ffb4160>"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df.plot(kind='bar')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Reindex along a monotonic index and interpolate, linear"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = df.reindex(range(0, 9))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x11033e780>"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n/1+YZfsUNXayfGSPM8kvbB96+6dOmm1j3m0+ZXswybDt90iakjnhJlL9Du+XdL/tOWpM662U9CVJ\nLS9iNQk2SPqhGidZfl7SrbZ3SbpQjeniKTHtp1wkyfYsNeYTx34o+niSwzVm2ifpDyX97OhFkv4j\nyXjvKiY703cl/WWSJ8eMzZa0UdKnkxxXQ6bjk/x6nPEFkhYleWaqM42T5TJJFyW5scYMu9X4A2c1\npoEuSrLX9omSHkmyrIZMJ0n6R0l/oMZVA89TY6fqx5KuS/LUVGeqcv0gyblNlh3ZeZhytk+XpCQ/\nsX2ypI9I+u8kj01ZhplQ6NOR7Q2SvpHkkXGWfSvJp2rI1K/GFMdL4yy7KMm/T3UmdMf2CZIWJvmv\nGjP8tqSlaryLGUmyr64sVZ73JHmuzgzTFYUOAIWYCR+KAgDaQKEDQCEodBzzbK+w/aztF2yvqTsP\n0Cnm0HFMs32cpOfUOHN1RI0vblmZZEetwYAOsIeOY91ySS8k2ZXkDTWOGb685kxARyh0HOsW6/9O\nWJMae+mLm6wLTGsUOgAUgkLHsW6PpDPGPO6vxoAZh0LHse5xSWfZXjrmmtZHX14XmBHqviARUKvq\n0rCrJd2nxoWVNibZXnMsoCMctggAhWDKBQAKQaEDQCEodAAoBIUOAIWg0AGgEBQ6ABSCQgeAQvwP\nycs2CTfHnYgAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df.plot(kind='bar')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df['interpolated'] = df.interpolate(method='linear')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x10f93d390>"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEGCAYAAABiq/5QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAGHNJREFUeJzt3X+QVeWd5/H3R0R7VUIQOo7SkmZ3\n1EQtBNKiIlrgD4KaqJngSmtFHXR6nNKIZqo27KR2wMRNZbOZ6KqTodjIYLbUWI46mvgLNDIKCUqL\niPzwByFMbCTIDwWRGES/+8c9OJf2Xvp6z6VvN8/nVXWrz3me55zzpVs/ffq5556jiMDMzNKxX70L\nMDOz7uXgNzNLjIPfzCwxDn4zs8Q4+M3MEuPgNzNLjIPfzCwxDn4zs8Q4+M3MErN/vQsoZdCgQdHc\n3FzvMszMeo0XXnhhY0Q0VjK2RwZ/c3Mz7e3t9S7DzKzXkPTvlY71VI+ZWWIc/GZmiXHwm5klpkfO\n8ZfywQcf0NHRwfvvv1/vUpLU0NBAU1MTffv2rXcpZpZTrwn+jo4O+vXrR3NzM5LqXU5SIoJNmzbR\n0dHB0KFD612OmeXU5VSPpCMlPS1phaTlkqZk7YdKmivp9ezrgDLbX56NeV3S5dUW+v777zNw4ECH\nfh1IYuDAgf5ry2wfUckc/07gbyPiWOBk4BpJxwJTgaci4ijgqWx9N5IOBaYBJwGjgGnlfkFUwqFf\nP/7em+07ugz+iFgXEYuz5XeBlcBg4ALgzmzYncCFJTb/MjA3IjZHxNvAXGBCLQo3M7PqfKo5fknN\nwAjgOeCwiFiXdf0BOKzEJoOBN4rWO7K2UvtuA9oAhgwZ0mUtzVMfqbDqyqz5wXldjpk8eTK//OUv\n+dznPseyZctqenwz27dUmlFrGi7petD0LTmr2V3Fl3NKOgS4H7g+IrYW90Xhie25ntoeETMjoiUi\nWhobK/rUcbe74oorePzxx+tdhplZLhUFv6S+FEL/roh4IGteL+nwrP9w4K0Sm64Fjixab8raeqXT\nTz+dQw89tN5lmJnlUslVPQLuAFZGxI+Luh4Gdl2lcznwUInNnwDGSxqQvak7PmszM7M6qeSM/1Tg\nG8AZkpZkr3OBHwBnS3odOCtbR1KLpJ8CRMRm4HvAouz13azNzMzqpMs3dyNiPlDuWr4zS4xvB64q\nWp8FzKq2QDMzqy3fq8fMLDG95pYNnVVy+WWttba2Mm/ePDZu3EhTUxM33ngjV155ZbfXYWaWR68N\n/nq455576l2CmVlunuoxM0uMg9/MLDEOfjOzxDj4zcwS4+A3M0uMg9/MLDG993LO6f1rvL+ub3s6\nevRofv3rX+9xzC233EJbWxsHHXRQrSorafbs2bS3t3P77beXHTNv3jwOOOAARo8e/an23dzcTHt7\nO4MGDcpbppn1QD7j/xS6Cn0oBP/27ds/1X4//PDDakvao3nz5lVUs5mlxcH/KRxyyCFAIVDHjh3L\nxIkT+cIXvsCll15KRHDrrbfy5ptvMm7cOMaNGwfAnDlzOOWUUxg5ciQXXXQR27ZtAwpn1d/+9rcZ\nOXIk9913H2PHjmXKlCkMHz6c448/nueffx6AzZs3c+GFFzJs2DBOPvlkli5d+om6fvGLX3DSSScx\nYsQIzjrrLNavX8+aNWuYMWMGN998M8OHD+fZZ59lw4YNfP3rX+fEE0/kxBNPZMGCBQBs2rSJ8ePH\nc9xxx3HVVVdReLyCme2rHPxVevHFF7nllltYsWIFq1evZsGCBVx33XUcccQRPP300zz99NNs3LiR\nm266iSeffJLFixfT0tLCj3/8H3e2HjhwIIsXL2bSpEkAbN++nSVLlvCTn/yEyZMnAzBt2jRGjBjB\n0qVL+f73v89ll132iVrGjBnDwoULefHFF5k0aRI//OEPaW5u5uqrr+aGG25gyZIlnHbaaUyZMoUb\nbriBRYsWcf/993PVVYV76d14442MGTOG5cuX87WvfY3f//733fAdNLN66b1z/HU2atQompqaABg+\nfDhr1qxhzJgxu41ZuHAhK1as4NRTTwVgx44dnHLKKR/3X3zxxbuNb21tBQoPfNm6dSvvvPMO8+fP\n5/777wfgjDPOYNOmTWzdutsD0Ojo6ODiiy9m3bp17Nixg6FDh5as+cknn2TFihUfr2/dupVt27bx\nzDPP8MADhefrnHfeeQwYMOBTfz/MrPdw8FfpwAMP/Hi5T58+7Ny58xNjIoKzzz677D1+Dj744N3W\nC8+8Kb9ezje/+U2+9a1vcf755zNv3jymT59ectxHH33EwoULaWhoqGi/ZrZv8lRPjfXr1493330X\ngJNPPpkFCxawatUqAN577z1ee+21stvee++9AMyfP5/+/fvTv39/TjvtNO666y6g8N7CoEGD+Mxn\nPrPbdlu2bGHw4MIz7O+8886StQCMHz+e22677eP1JUuWAIW/MO6++24AHnvsMd5+++3q/vFmPd30\n/l2/EtB7z/hr/NT5Wmlra2PChAkfz/XPnj2b1tZW/vSnPwFw0003cfTRR5fctqGhgREjRvDBBx8w\na1bh2TXTp09n8uTJDBs2jIMOOmi3YN9l+vTpXHTRRQwYMIAzzjiD3/3udwB89atfZeLEiTz00EPc\ndttt3HrrrVxzzTUMGzaMnTt3cvrppzNjxgymTZtGa2srxx13HKNHj2bIkCF76btjZj2BurqCQ9Is\n4CvAWxFxfNZ2L3BMNuSzwDsRMbzEtmuAd4EPgZ0R0VJJUS0tLdHe3r5b28qVK/niF79Yyea90tix\nY/nRj35ES0tF36K62Nd/BpaASs7oa3RS2Tz1kYrGrWm4pOtBFdQk6YVKM7aSM/7ZwO3Az3Y1RMTH\n70pK+gdgT1WNi4iNlRRjZmZ7XyXP3H1GUnOpPhXeffyvwBm1LSs98+bNq3cJZpaIvG/ungasj4jX\ny/QHMEfSC5La9rQjSW2S2iW1b9iwofTO/MGiuvH33mzfkTf4W4E9PY9wTESMBM4BrpF0ermBETEz\nIloioqWxsfET/Q0NDWzatMkBVAcRwaZNm3wZqNk+ouqreiTtD/wF8KVyYyJibfb1LUkPAqOAZ6o5\nXlNTEx0dHZT7a8D2roaGho8/sGZmvVueyznPAl6JiI5SnZIOBvaLiHez5fHAd6s9WN++fct+ItXM\nzCrX5VSPpHuA3wDHSOqQdGXWNYlO0zySjpD0aLZ6GDBf0kvA88AjEfF47Uo3M7NqVHJVT2uZ9itK\ntL0JnJstrwZOyFmfmZnVmG/ZYGaWGAe/mVliHPxmZolx8JuZJcbBb2aWGAe/mVliHPxmZolx8JuZ\nJcbBb2aWGAe/mVlieu8zd82s56r0oeU99NnZ+zqf8ZuZJcbBb2aWGAe/mVliHPxmZolx8JuZJcbB\nb2aWmEoevThL0luSlhW1TZe0VtKS7HVumW0nSHpV0ipJU2tZuJmZVaeSM/7ZwIQS7TdHxPDs9Wjn\nTkl9gH8EzgGOBVolHZunWDMzy6/L4I+IZ4DNVex7FLAqIlZHxA7g58AFVezHzMxqKM8c/7WSlmZT\nQQNK9A8G3iha78jaSpLUJqldUvuGDRtylGVmZntSbfD/E/BfgOHAOuAf8hYSETMjoiUiWhobG/Pu\nzszMyqgq+CNifUR8GBEfAf+XwrROZ2uBI4vWm7I2MzOro6qCX9LhRatfA5aVGLYIOErSUEkHAJOA\nh6s5npmZ1U6Xd+eUdA8wFhgkqQOYBoyVNBwIYA3w19nYI4CfRsS5EbFT0rXAE0AfYFZELN8r/woz\nM6tYl8EfEa0lmu8oM/ZN4Nyi9UeBT1zqaWZm9eNP7pqZJcbBb2aWGAe/mVliHPxmZonxM3fNertK\nnm/rZ9taEZ/xm5klxsFvZpYYB7+ZWWIc/GZmiXHwm5klxsFvZpYYB7+ZWWIc/GZmiXHwm5klxsFv\nZpYYB7+ZWWIc/GZmieky+CXNkvSWpGVFbf9b0iuSlkp6UNJny2y7RtLLkpZIaq9l4WZmVp1Kzvhn\nAxM6tc0Fjo+IYcBrwH/fw/bjImJ4RLRUV6KZmdVSl8EfEc8Amzu1zYmIndnqQqBpL9RmZmZ7QS3m\n+CcDj5XpC2COpBckte1pJ5LaJLVLat+wYUMNyjIzs1JyBb+k7wA7gbvKDBkTESOBc4BrJJ1ebl8R\nMTMiWiKipbGxMU9ZZma2B1UHv6QrgK8Al0ZElBoTEWuzr28BDwKjqj2emZnVRlXBL2kC8N+A8yNi\ne5kxB0vqt2sZGA8sKzXWzMy6TyWXc94D/AY4RlKHpCuB24F+wNzsUs0Z2dgjJD2abXoYMF/SS8Dz\nwCMR8fhe+VeYmVnFunzYekS0lmi+o8zYN4Fzs+XVwAm5qjPrafxgc9sH+JO7ZmaJcfCbmSXGwW9m\nlhgHv5lZYhz8ZmaJcfCbmSXGwW9mlhgHv5lZYhz8ZmaJcfCbmSXGwW9mlhgHv5lZYhz8ZmaJcfCb\nmSXGwW9mlhgHv5lZYhz8ZmaJqSj4Jc2S9JakZUVth0qaK+n17OuAMtteno15XdLltSrczMyqU+kZ\n/2xgQqe2qcBTEXEU8FS2vhtJhwLTgJOAUcC0cr8gzMyse1QU/BHxDLC5U/MFwJ3Z8p3AhSU2/TIw\nNyI2R8TbwFw++QvEzMy6UZcPW9+DwyJiXbb8B+CwEmMGA28UrXdkbZ8gqQ1oAxgyZEiOsqyna576\nSEXj1jRc0vUgP9jc7FOryZu7ERFA5NzHzIhoiYiWxsbGWpRlZmYl5An+9ZIOB8i+vlVizFrgyKL1\npqzNzMzqJE/wPwzsukrncuChEmOeAMZLGpC9qTs+azMzszqp9HLOe4DfAMdI6pB0JfAD4GxJrwNn\nZetIapH0U4CI2Ax8D1iUvb6btZmZWZ1U9OZuRLSW6TqzxNh24Kqi9VnArKqqMzOzmvMnd83MEuPg\nNzNLjIPfzCwxDn4zs8Q4+M3MEuPgNzNLjIPfzCwxDn4zs8Q4+M3MEuPgNzNLjIPfzCwxDn4zs8Q4\n+M3MEuPgNzNLjIPfzCwxDn4zs8RUHfySjpG0pOi1VdL1ncaMlbSlaMzf5y/ZzMzyqOgJXKVExKvA\ncABJfSg8RP3BEkOfjYivVHscMzOrrVpN9ZwJ/DYi/r1G+zMzs72kVsE/CbinTN8pkl6S9Jik42p0\nPDMzq1Lu4Jd0AHA+cF+J7sXA5yPiBOA24F/3sJ82Se2S2jds2JC3LDMzK6MWZ/znAIsjYn3njojY\nGhHbsuVHgb6SBpXaSUTMjIiWiGhpbGysQVlmZlZKLYK/lTLTPJL+TJKy5VHZ8TbV4JhmZlalqq/q\nAZB0MHA28NdFbVcDRMQMYCLwN5J2An8EJkVE5DmmmZnlkyv4I+I9YGCnthlFy7cDt+c5hpmZ1Vau\n4Ld9yPT+FYzZsvfrMLO9zrdsMDNLjIPfzCwxDn4zs8Q4+M3MEuPgNzNLjIPfzCwxDn4zs8Q4+M3M\nEuPgNzNLjIPfzCwxDn4zs8Q4+M3MEuPgNzNLjIPfzCwxDn4zs8Q4+M3MEpM7+CWtkfSypCWS2kv0\nS9KtklZJWippZN5jmplZ9Wr1BK5xEbGxTN85wFHZ6yTgn7KvZmZWB90x1XMB8LMoWAh8VtLh3XBc\nMzMroRbBH8AcSS9IaivRPxh4o2i9I2szM7M6qMVUz5iIWCvpc8BcSa9ExDOfdifZL402gCFDhtSg\nLDMzKyX3GX9ErM2+vgU8CIzqNGQtcGTRelPW1nk/MyOiJSJaGhsb85ZlZmZl5Ap+SQdL6rdrGRgP\nLOs07GHgsuzqnpOBLRGxLs9xzcysenmneg4DHpS0a193R8Tjkq4GiIgZwKPAucAqYDvwlzmPaWZm\nOeQK/ohYDZxQon1G0XIA1+Q5jpmZ1Y4/uWtmlhgHv5lZYhz8ZmaJcfCbmSXGwW9mlpha3aTNgOap\nj3Q5Zk3DJZXtbPqWnNWYmZXmM34zs8Q4+M3MEuPgNzNLjIPfzCwxDn4zs8Q4+M3MEuPgNzNLjIPf\nzCwxDn4zs8Q4+M3MEuPgNzNLTNXBL+lISU9LWiFpuaQpJcaMlbRF0pLs9ff5yjUzs7zy3KRtJ/C3\nEbE4e+D6C5LmRsSKTuOejYiv5DiOmZnVUNVn/BGxLiIWZ8vvAiuBwbUqzMzM9o6azPFLagZGAM+V\n6D5F0kuSHpN0XC2OZ2Zm1ct9P35JhwD3A9dHxNZO3YuBz0fENknnAv8KHFVmP21AG8CQIUPylmVm\nZmXkOuOX1JdC6N8VEQ907o+IrRGxLVt+FOgraVCpfUXEzIhoiYiWxsbGPGWZmdke5LmqR8AdwMqI\n+HGZMX+WjUPSqOx4m6o9ppmZ5ZdnqudU4BvAy5KWZG1/BwwBiIgZwETgbyTtBP4ITIqIyHFMMzPL\nqergj4j5gLoYcztwe7XHMDOz2vMnd83MEuPgNzNLjIPfzCwxDn4zs8Q4+M3MEuPgNzNLjIPfzCwx\nDn4zs8Q4+M3MEuPgNzNLTO7bMtdL89RHuhyzpuGSrnc0fUsNqjEz6z18xm9mlhgHv5lZYhz8ZmaJ\ncfCbmSXGwW9mlhgHv5lZYvI+bH2CpFclrZI0tUT/gZLuzfqfk9Sc53hmZpZfnoet9wH+ETgHOBZo\nlXRsp2FXAm9HxJ8DNwP/q9rjmZlZbeQ54x8FrIqI1RGxA/g5cEGnMRcAd2bL/wKcKWmPz+k1M7O9\nSxFR3YbSRGBCRFyVrX8DOCkiri0asywb05Gt/zYbs7HE/tqAtmz1GODVqgrb3SDgE8eqs55YE/TM\nulxTZVxT5XpiXbWq6fMR0VjJwB5zy4aImAnMrOU+JbVHREst95lXT6wJemZdrqkyrqlyPbGuetSU\nZ6pnLXBk0XpT1lZyjKT9gf7AphzHNDOznPIE/yLgKElDJR0ATAIe7jTmYeDybHki8Kuodm7JzMxq\nouqpnojYKela4AmgDzArIpZL+i7QHhEPA3cA/0/SKmAzhV8O3ammU0c10hNrgp5Zl2uqjGuqXE+s\nq9trqvrNXTMz6538yV0zs8Q4+M3MEuPgNzNLTI+5jr8WJH2BwqeFB2dNa4GHI2Jl/aqySkkaBURE\nLMpu/zEBeCUiHq1zaQBI+llEXFbvOqx3Krr68c2IeFLSJcBoYCUwMyI+6LZa9pU3dyV9G2ilcOuI\njqy5icI3+ucR8YN61dbTZL8gBwPPRcS2ovYJEfF4nWqaRuG+T/sDc4GTgKeBs4EnIuJ/dnM9nS9N\nFjAO+BVARJzfnfWUI2kMhdunLIuIOXWq4SRgZURslfSfgKnASGAF8P2I6PYHW0u6DngwIt7o7mOX\nI+kuCv99HwS8AxwCPACcSSGLL9/D5rWtZR8K/teA4zr/1sx+yy6PiKPqU1lpkv4yIv65Dse9DriG\nwlnGcGBKRDyU9S2OiJHdXVN27Jezeg4E/gA0FQXJcxExrJvrWUwhuH4KBIXgv4fskuSI+LfurKeo\nrucjYlS2/FcUfpYPAuOBX9TjBEfScuCE7BLvmcB2sntzZe1/UYeatgDvAb+l8HO7LyI2dHcdnWpa\nGhHDsg+zrgWOiIgPs/uXvdSd/43vS3P8HwFHlGg/POvraW6s03H/CvhSRFwIjAX+h6QpWV89b6C3\nMyI+jIjtwG8jYitARPyR+vz8WoAXgO8AWyJiHvDHiPi3eoV+pm/RchtwdkTcSCH4L61PSewXETuz\n5ZaIuD4i5md1/ec61bSawl/83wO+BKyQ9LikyyX1q1NN+2Unov0onPX3z9oPZPef6163L83xXw88\nJel1YNefd0OAPweuLbvVXiRpabku4LDurKXIfrumdyJijaSxwL9I+jz1Df4dkg7Kgv9Luxol9acO\nwR8RHwE3S7ov+7qenvH/y36SBlA4adOus9iIeE/Szj1vutcsK/oL9iVJLRHRLulooNvmrTuJ7Gc4\nB5gjqS+FqcRW4EdARTczq7E7gFcofOD1O8B9klYDJ1OYou42+8xUD4Ck/SjMdxa/ubsoIj6sUz3r\ngS8Db3fuAn4dEaX+QtnbNf0K+FZELClq2x+YBVwaEX26u6ashgMj4k8l2gcBh0fEy3Uoq7iO84BT\nI+Lv6lzHGgq/CEVhCurUiFgn6RBgfkQMr0NN/YH/A5xG4S6TIymcfL0BXBcRL9WhphcjYkSZvl0n\nGN1O0hEAEfGmpM8CZwG/j4jnu7WOfSn4expJdwD/HBHzS/TdHRGX1KGmJgrTKn8o0XdqRCzo7pos\nP0kHAYdFxO/qWMNngKEU/jLqiIj1dazl6Ih4rV7H7+kc/GZmidmX3tw1M7MKOPjNzBLj4DergKQJ\nkl6VtErS1HrXY5aH5/jNuiCpD/AahU8Rd1B4CFFrRKyoa2FmVfIZv1nXRgGrImJ1ROygcM31BXWu\nyaxqDn6zrg3mPz4UCIWz/sFlxpr1eA5+M7PEOPjNurYWOLJovSlrM+uVHPxmXVsEHCVpaNE91Tvf\nttms1+gJN50y69Gy2w1fCzxB4QZbsyJieZ3LMquaL+c0M0uMp3rMzBLj4DczS4yD38wsMQ5+M7PE\nOPjNzBLj4DczS4yD38wsMf8fhmp2L3Zoj4MAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df.plot(kind='bar')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "df2 = pd.DataFrame([(datetime(2019, 1, x+1), y) for x,y in test_data]).set_index(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "df2 = df2.reindex(pd.DatetimeIndex(freq='1d', start=df2.index[0], end=df2.index[-1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "df2['interpolated'] = df2.interpolate(method='linear')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x110312f28>"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAFbCAYAAADFmXWwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAHyNJREFUeJzt3XuQnXWd5/H3Rwz2QELIpWWRkGlW\nEBQHk9jcL5twG7yDghAdwQpsdBcU0FrJWltF2GFdZB2gQJFihCVTg1wUFRQdESYZJEyAJomQi1wW\nojZiCAkQkOKS8N0/ztOd7rZPn6e7T5/n9zz5vKq6OLfu87afp76e/Pqc51FEYGZm5fe2ogPMzKw5\nPNDNzCrCA93MrCI80M3MKsID3cysIjzQzcwqwgPdzKwiPNDNzCrCA93MrCLe3sonmzp1anR0dLTy\nKc3MSu/hhx9+PiLaGz2upQO9o6ODrq6uVj6lmVnpSfpdnsd5ycXMrCI80M3MKsID3cysIlq6hj6Y\nN998k+7ubl577bWiU7ZLbW1tTJs2jXHjxhWdYmajVPhA7+7uZsKECXR0dCCp6JztSkSwceNGuru7\n2WuvvYrOMbNRarjkIqlN0oOSfiNptaSLstv3kvSApCcl3SJpx5EEvPbaa0yZMsXDvACSmDJliv91\nZFYRedbQXweOjogPADOAEyQdAnwTuDwi9gZeAM4caYSHeXH8uzerjoYDPWpeya6Oy74COBr4YXb7\nIuDEMSk0M7Nccq2hS9oBeBjYG/gO8P+AFyNiS/aQbmCPZgR1LLizGT+m17pLPtLwMfPmzeNnP/sZ\n73znO1m1alVTn9/MrFVyDfSI2ArMkLQr8GNgv7xPIGk+MB9g+vTpI2kcc5///Oc555xzOP3004tO\nMbMSyPPCc13bZxr/oIUvNaFmm2G9Dz0iXgQWA4cCu0rq+T+EacAzdb7n2ojojIjO9vaGhyIoxFFH\nHcXkyZOLzjAzG5U873Jpz16ZI+mvgOOAtdQG+8nZw84Abh+rSDMzayzPksvuwKJsHf1twK0R8TNJ\na4CbJV0MrACuG8NOMzNroOFAj4hHgJmD3P4UcNBYRJmZ2fD5WC5mZhVR+Ef/B8rzNsNmmzt3LkuW\nLOH5559n2rRpXHTRRZx55og/J2VmVojkBnoRbrrppqITzMxGzUsuZmYV4YFuZlYRHuhmZhXhgW5m\nVhEe6GZmFeGBbmZWEem9bXHhxCb/vMZHMzvssMO4//77h3zMFVdcwfz589lpp52aVTaoG264ga6u\nLr797W/XfcySJUvYcccdOeyww4b1szs6Oujq6mLq1KmjzTRLS5650eQjG6bIr9Ch4TCH2kB/9dVX\nh/Vzt27dOtKkIS1ZsiRXs5ltXzzQgfHjxwO1QTl79mxOPvlk9ttvPz772c8SEVx55ZX88Y9/ZM6c\nOcyZMweAu+66i0MPPZRZs2Zxyimn8MortZM6dXR0cMEFFzBr1ix+8IMfMHv2bM4991xmzJjB+9//\nfh588EEANm3axIknnsgBBxzAIYccwiOPPPIXXT/96U85+OCDmTlzJsceeyzr169n3bp1XHPNNVx+\n+eXMmDGDX//612zYsIFPfepTHHjggRx44IEsXboUgI0bN3L88cez//77c9ZZZxERrfh1mllBPNAH\nWLFiBVdccQVr1qzhqaeeYunSpXz5y1/mXe96F4sXL2bx4sU8//zzXHzxxdx9990sX76czs5OLrvs\nst6fMWXKFJYvX85pp50GwKuvvsrKlSu5+uqrmTdvHgAXXnghM2fO5JFHHuEb3/jGoCfXOOKII1i2\nbBkrVqzgtNNO49JLL6Wjo4MvfvGLnH/++axcuZIjjzySc889l/PPP5+HHnqI2267jbPOOguAiy66\niCOOOILVq1dz0kkn8fvf/74Fv0EzK0p6a+gFO+igg5g2bRoAM2bMYN26dRxxxBH9HrNs2TLWrFnD\n4YcfDsAbb7zBoYce2nv/qaee2u/xc+fOBWon0ti8eTMvvvgi9913H7fddhsARx99NBs3bmTz5s39\nvq+7u5tTTz2VZ599ljfeeIO99tpr0Oa7776bNWvW9F7fvHkzr7zyCvfeey8/+tGPAPjIRz7CpEmT\nhv37MLPy8EAf4B3veEfv5R122IEtW7b8xWMiguOOO67uMWB23nnnftclDXm9ni996Ut85Stf4eMf\n/zhLlixh4cKFgz7urbfeYtmyZbS1teX6uWZWTV5yyWnChAm8/PLLABxyyCEsXbqUJ598EoA///nP\nPP7443W/95ZbbgHgvvvuY+LEiUycOJEjjzySG2+8Eait3U+dOpVddtml3/e99NJL7LFH7dzbixYt\nGrQF4Pjjj+eqq67qvb5y5Uqg9i+C73//+wD84he/4IUXXhjZ/3gzK4X0XqEn+tai+fPnc8IJJ/Su\n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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df2.plot(kind='bar')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Applying to sql"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df3 = pd.read_sql_query(\n",
    "    sql='''select track_scid, as_of, playback_count from sc_track_stats''', \n",
    "    con=db.Session.get_bind()\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "grouped = df3.groupby('track_scid')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "def apply_power(df):\n",
    "    df4 = df.set_index('as_of').reindex(pd.DatetimeIndex(freq='1d', start=df.min()['as_of'], end=df.max()['as_of']))\n",
    "    x0, y0, xf, yf = df4.index[0], df4.playback_count[0], df4.index[-1], df4.playback_count[-1]\n",
    "    slope = (yf - y0) / (xf - x0).days\n",
    "    df4['x'] = df4.index\n",
    "    df4['power'] = ((df4.x - df4.index[0]).apply(lambda td: td.days * slope + y0) - df4.playback_count)\n",
    "    return [df4['power'].sum(), x0, xf]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/joel/src/thundr/tracker/venv/lib/python3.6/site-packages/ipykernel_launcher.py:4: RuntimeWarning: invalid value encountered in long_scalars\n",
      "  after removing the cwd from sys.path.\n"
     ]
    }
   ],
   "source": [
    "df_power = grouped.apply(apply_power)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_power.to_pickle('/Users/joel/Desktop/df_power1.pkl')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_power2 = pd.DataFrame(index=df_power.index, data=df_power.as_matrix(), columns=['arr'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [],
   "source": [
    "v = df_power2.head().arr.values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[[0.0,\n",
       "  Timestamp('2019-02-14 00:00:00', freq='D'),\n",
       "  Timestamp('2019-02-14 00:00:00', freq='D')],\n",
       " [0.0,\n",
       "  Timestamp('2019-02-14 00:00:00', freq='D'),\n",
       "  Timestamp('2019-02-14 00:00:00', freq='D')],\n",
       " [0.0,\n",
       "  Timestamp('2019-02-14 00:00:00', freq='D'),\n",
       "  Timestamp('2019-02-14 00:00:00', freq='D')],\n",
       " [3813783.0000000019,\n",
       "  Timestamp('2019-02-01 00:00:00', freq='D'),\n",
       "  Timestamp('2019-02-14 00:00:00', freq='D')],\n",
       " [17592792.0,\n",
       "  Timestamp('2019-01-24 00:00:00', freq='D'),\n",
       "  Timestamp('2019-02-14 00:00:00', freq='D')]]"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "v.tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_power3 = pd.DataFrame(index=df_power2.index, data=df_power2.arr.values.tolist(), columns=['power', 'start', 'end'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_sorted = df_power3.sort_values(by=['power'], ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_sorted = df_sorted[df_sorted.index > 100000]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_sorted['days'] = (df_sorted.end - df_sorted.start).apply(lambda x: x.days + 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_sorted['power_avg'] = df_sorted.power / df_sorted.days"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df_sorted.sort_values(by=['power_avg'], ascending=False, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_sorted.to_csv('/Users/joel/Desktop/power1.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_sorted.to_sql(con=db.Session.get_bind(), name='sc_power_1')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 190,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def reindex_and_fill(df):\n",
    "    indexed = df.set_index('as_of')\n",
    "    return (\n",
    "        indexed.reindex(pd.DatetimeIndex(freq='1d', start=indexed.index.min(), end=indexed.index.max()))\n",
    "        .interpolate()\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 191,
   "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></th>\n",
       "      <th>playback_count</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>track_scid</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"11\" valign=\"top\">570005820</th>\n",
       "      <th>2019-02-15</th>\n",
       "      <td>416.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-16</th>\n",
       "      <td>431.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-17</th>\n",
       "      <td>436.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-18</th>\n",
       "      <td>443.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-19</th>\n",
       "      <td>450.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-20</th>\n",
       "      <td>454.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-21</th>\n",
       "      <td>462.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-22</th>\n",
       "      <td>464.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-23</th>\n",
       "      <td>470.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-24</th>\n",
       "      <td>473.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-25</th>\n",
       "      <td>485.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"12\" valign=\"top\">570010416</th>\n",
       "      <th>2019-02-14</th>\n",
       "      <td>463.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-15</th>\n",
       "      <td>478.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-16</th>\n",
       "      <td>494.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-17</th>\n",
       "      <td>508.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-18</th>\n",
       "      <td>519.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-19</th>\n",
       "      <td>534.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-20</th>\n",
       "      <td>542.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-21</th>\n",
       "      <td>547.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-22</th>\n",
       "      <td>554.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-23</th>\n",
       "      <td>565.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-24</th>\n",
       "      <td>567.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-25</th>\n",
       "      <td>571.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"12\" valign=\"top\">570110814</th>\n",
       "      <th>2019-02-14</th>\n",
       "      <td>1764.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-15</th>\n",
       "      <td>1816.818182</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-16</th>\n",
       "      <td>1869.636364</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-17</th>\n",
       "      <td>1922.454545</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-18</th>\n",
       "      <td>1975.272727</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-19</th>\n",
       "      <td>2028.090909</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-20</th>\n",
       "      <td>2080.909091</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-21</th>\n",
       "      <td>2133.727273</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-22</th>\n",
       "      <td>2186.545455</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-23</th>\n",
       "      <td>2239.363636</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-24</th>\n",
       "      <td>2292.181818</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-25</th>\n",
       "      <td>2345.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"9\" valign=\"top\">570204969</th>\n",
       "      <th>2019-02-05</th>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-06</th>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-07</th>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-08</th>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-09</th>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-10</th>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-11</th>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-12</th>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-13</th>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"9\" valign=\"top\">570205440</th>\n",
       "      <th>2019-02-05</th>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-06</th>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-07</th>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-08</th>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-09</th>\n",
       "      <td>3.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-10</th>\n",
       "      <td>3.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-11</th>\n",
       "      <td>3.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-12</th>\n",
       "      <td>3.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-13</th>\n",
       "      <td>3.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                       playback_count\n",
       "track_scid                           \n",
       "570005820  2019-02-15      416.000000\n",
       "           2019-02-16      431.000000\n",
       "           2019-02-17      436.000000\n",
       "           2019-02-18      443.000000\n",
       "           2019-02-19      450.000000\n",
       "           2019-02-20      454.000000\n",
       "           2019-02-21      462.000000\n",
       "           2019-02-22      464.000000\n",
       "           2019-02-23      470.000000\n",
       "           2019-02-24      473.000000\n",
       "           2019-02-25      485.000000\n",
       "570010416  2019-02-14      463.000000\n",
       "           2019-02-15      478.000000\n",
       "           2019-02-16      494.000000\n",
       "           2019-02-17      508.000000\n",
       "           2019-02-18      519.000000\n",
       "           2019-02-19      534.000000\n",
       "           2019-02-20      542.000000\n",
       "           2019-02-21      547.000000\n",
       "           2019-02-22      554.000000\n",
       "           2019-02-23      565.000000\n",
       "           2019-02-24      567.000000\n",
       "           2019-02-25      571.000000\n",
       "570110814  2019-02-14     1764.000000\n",
       "           2019-02-15     1816.818182\n",
       "           2019-02-16     1869.636364\n",
       "           2019-02-17     1922.454545\n",
       "           2019-02-18     1975.272727\n",
       "           2019-02-19     2028.090909\n",
       "           2019-02-20     2080.909091\n",
       "           2019-02-21     2133.727273\n",
       "           2019-02-22     2186.545455\n",
       "           2019-02-23     2239.363636\n",
       "           2019-02-24     2292.181818\n",
       "           2019-02-25     2345.000000\n",
       "570204969  2019-02-05        0.000000\n",
       "           2019-02-06        0.000000\n",
       "           2019-02-07        0.000000\n",
       "           2019-02-08        0.000000\n",
       "           2019-02-09        0.000000\n",
       "           2019-02-10        0.000000\n",
       "           2019-02-11        0.000000\n",
       "           2019-02-12        0.000000\n",
       "           2019-02-13        0.000000\n",
       "570205440  2019-02-05        0.000000\n",
       "           2019-02-06        1.000000\n",
       "           2019-02-07        1.000000\n",
       "           2019-02-08        1.000000\n",
       "           2019-02-09        3.000000\n",
       "           2019-02-10        3.000000\n",
       "           2019-02-11        3.000000\n",
       "           2019-02-12        3.000000\n",
       "           2019-02-13        3.000000"
      ]
     },
     "execution_count": 191,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grouped.apply(reindex_and_fill)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 152,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "ts = df2.index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "fullind = pd.DatetimeIndex(freq='1d', start=datetime(2019, 1, 1), periods=10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df3 = pd.read_sql_query(\n",
    "    sql='''select as_of, playback_count from sc_track_stats where track_scid = 570010416''', \n",
    "    con=db.Session.get_bind()\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "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>playback_count</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-02-14</th>\n",
       "      <td>463</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-15</th>\n",
       "      <td>478</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-16</th>\n",
       "      <td>494</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-17</th>\n",
       "      <td>508</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-18</th>\n",
       "      <td>519</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-19</th>\n",
       "      <td>534</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-20</th>\n",
       "      <td>542</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-21</th>\n",
       "      <td>547</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-22</th>\n",
       "      <td>554</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-23</th>\n",
       "      <td>565</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-24</th>\n",
       "      <td>567</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-25</th>\n",
       "      <td>571</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            playback_count\n",
       "2019-02-14             463\n",
       "2019-02-15             478\n",
       "2019-02-16             494\n",
       "2019-02-17             508\n",
       "2019-02-18             519\n",
       "2019-02-19             534\n",
       "2019-02-20             542\n",
       "2019-02-21             547\n",
       "2019-02-22             554\n",
       "2019-02-23             565\n",
       "2019-02-24             567\n",
       "2019-02-25             571"
      ]
     },
     "execution_count": 177,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df3.set_index('as_of').reindex(pd.DatetimeIndex(freq='1d', start=df3.min()['as_of'], end=df3.max()['as_of']))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df4 = df3.set_index('as_of')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df4['playback_count'].apply()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 272,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x0, y0, xf, yf = df4.index[0], df4.playback_count[0], df4.index[-1], df4.playback_count[-1]\n",
    "\n",
    "slope = (yf - y0) / (xf - x0).days\n",
    "\n",
    "df4['x'] = df4.index\n",
    "\n",
    "df4['power'] = ((df4.x - df4.index[0]).apply(lambda td: td.days * slope + y0) - df4.playback_count)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 273,
   "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>playback_count</th>\n",
       "      <th>x</th>\n",
       "      <th>power</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>as_of</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-02-14</th>\n",
       "      <td>463</td>\n",
       "      <td>2019-02-14</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-15</th>\n",
       "      <td>478</td>\n",
       "      <td>2019-02-15</td>\n",
       "      <td>-5.181818</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-16</th>\n",
       "      <td>494</td>\n",
       "      <td>2019-02-16</td>\n",
       "      <td>-11.363636</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-17</th>\n",
       "      <td>508</td>\n",
       "      <td>2019-02-17</td>\n",
       "      <td>-15.545455</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-18</th>\n",
       "      <td>519</td>\n",
       "      <td>2019-02-18</td>\n",
       "      <td>-16.727273</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-19</th>\n",
       "      <td>534</td>\n",
       "      <td>2019-02-19</td>\n",
       "      <td>-21.909091</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-20</th>\n",
       "      <td>542</td>\n",
       "      <td>2019-02-20</td>\n",
       "      <td>-20.090909</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-21</th>\n",
       "      <td>547</td>\n",
       "      <td>2019-02-21</td>\n",
       "      <td>-15.272727</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-22</th>\n",
       "      <td>554</td>\n",
       "      <td>2019-02-22</td>\n",
       "      <td>-12.454545</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-23</th>\n",
       "      <td>565</td>\n",
       "      <td>2019-02-23</td>\n",
       "      <td>-13.636364</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-24</th>\n",
       "      <td>567</td>\n",
       "      <td>2019-02-24</td>\n",
       "      <td>-5.818182</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-25</th>\n",
       "      <td>571</td>\n",
       "      <td>2019-02-25</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            playback_count           x      power\n",
       "as_of                                            \n",
       "2019-02-14             463  2019-02-14   0.000000\n",
       "2019-02-15             478  2019-02-15  -5.181818\n",
       "2019-02-16             494  2019-02-16 -11.363636\n",
       "2019-02-17             508  2019-02-17 -15.545455\n",
       "2019-02-18             519  2019-02-18 -16.727273\n",
       "2019-02-19             534  2019-02-19 -21.909091\n",
       "2019-02-20             542  2019-02-20 -20.090909\n",
       "2019-02-21             547  2019-02-21 -15.272727\n",
       "2019-02-22             554  2019-02-22 -12.454545\n",
       "2019-02-23             565  2019-02-23 -13.636364\n",
       "2019-02-24             567  2019-02-24  -5.818182\n",
       "2019-02-25             571  2019-02-25   0.000000"
      ]
     },
     "execution_count": 273,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "dffull = df2.reindex(index=fullind).interpolate(method='time')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "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",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-01-01</th>\n",
       "      <td>10.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-02</th>\n",
       "      <td>20.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-03</th>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-04</th>\n",
       "      <td>40.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-05</th>\n",
       "      <td>50.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-06</th>\n",
       "      <td>50.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-07</th>\n",
       "      <td>50.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-08</th>\n",
       "      <td>50.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-09</th>\n",
       "      <td>50.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-10</th>\n",
       "      <td>50.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               1\n",
       "2019-01-01  10.0\n",
       "2019-01-02  20.0\n",
       "2019-01-03  30.0\n",
       "2019-01-04  40.0\n",
       "2019-01-05  50.0\n",
       "2019-01-06  50.0\n",
       "2019-01-07  50.0\n",
       "2019-01-08  50.0\n",
       "2019-01-09  50.0\n",
       "2019-01-10  50.0"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dffull.interpolate(method='time')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def interpolate_missing(series):\n",
    "    all_points = []\n",
    "    xs = []\n",
    "    ys = []\n",
    "    if len(series) < 2:\n",
    "        return series\n",
    "    \n",
    "    last_x = series[0][0]\n",
    "    for x, y in series[1:]:\n",
    "        if x != last_x + 1:\n",
    "            these_misses = list(range(last_x + 1, x));\n",
    "            print(\"missing\", last_x, x, these_misses)\n",
    "            missing.extend(these_misses)\n",
    "        last_x = x\n",
    "        xs.append(x)\n",
    "        ys.append(y)\n",
    "        \n",
    "            \n",
    "    \n",
    "    return series[:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "missing 1 3 [2]\n",
      "missing 3 8 [4, 5, 6, 7]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([  7.,  12.,  14.,  16.,  18.])"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "interpolate_missing(test_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'matplotlib'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m-----------------------------------------------------\u001b[0m",
      "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-23-a0d2faabd9e9>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpyplot\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'matplotlib'"
     ]
    }
   ],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 282,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df_hocker = pd.read_sql_query(\n",
    "    sql='''select as_of, playback_count from sc_track_stats where track_scid = 21 order by as_of limit 20 offset 20''', \n",
    "    con=db.Session.get_bind()\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 292,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def apply_power(df):\n",
    "    df4 = df.set_index('as_of').reindex(pd.DatetimeIndex(freq='1d', start=df.min()['as_of'], end=df.max()['as_of']))\n",
    "    x0, y0, xf, yf = df4.index[0], df4.playback_count[0], df4.index[-1], df4.playback_count[-1]\n",
    "    slope = (yf - y0) / (xf - x0).days\n",
    "    df4['x'] = df4.index\n",
    "    df4['power'] = ((df4.x - df4.index[0]).apply(lambda td: td.days * slope + y0) - df4.playback_count)\n",
    "    return [df4['power'].sum(), x0, xf]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 293,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "dfh = apply_power(df_hocker)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 288,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "100753.00000000015"
      ]
     },
     "execution_count": 288,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dfh['power'].sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 294,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "track_scid\n",
       "570005820    [-28.5, 2019-02-15 00:00:00, 2019-02-25 00:00:00]\n",
       "570010416    [-138.0, 2019-02-14 00:00:00, 2019-02-25 00:00...\n",
       "570110814      [0.0, 2019-02-14 00:00:00, 2019-02-25 00:00:00]\n",
       "570204969      [0.0, 2019-02-05 00:00:00, 2019-02-13 00:00:00]\n",
       "570205440     [-4.5, 2019-02-05 00:00:00, 2019-02-13 00:00:00]\n",
       "dtype: object"
      ]
     },
     "execution_count": 294,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grouped.apply(apply_power)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "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.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
