{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Настройка pandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# импортируем библиотеки numpy и pandas\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "# импортируем библиотеку datetime для работы с датами\n",
    "import datetime\n",
    "from datetime import datetime, date\n",
    "\n",
    "# Задаем некоторые опции библиотеки pandas, которые \n",
    "# настраивают вывод\n",
    "pd.set_option('display.notebook_repr_html', False)\n",
    "pd.set_option('display.max_columns', 8)\n",
    "pd.set_option('display.max_rows', 10)\n",
    "pd.set_option('display.width', 60)\n",
    "\n",
    "# импортируем библиотеку matplotlib для построения графиков\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Данные для примеров"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   interval sensor axis  reading\n",
       "0         0  accel    Z      0.0\n",
       "1         0  accel    Y      0.5\n",
       "2         0  accel    X      1.0\n",
       "3         1  accel    Z      0.1\n",
       "4         1  accel    Y      0.4"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# загружаем данные датчиков\n",
    "sensor_data = pd.read_csv(\"C:/data/sensors.csv\")\n",
    "sensor_data[:5]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Группировка по значениям отдельного столбца"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<pandas.core.groupby.DataFrameGroupBy object at 0x000001D1431E10B8>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# группировка этих данных по столбцу/переменной sensor\n",
    "# возвращает объект DataFrameGroupBy\n",
    "grouped_by_sensor = sensor_data.groupby('sensor')\n",
    "grouped_by_sensor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# получаем информацию о количестве групп, \n",
    "# которые будут созданы\n",
    "grouped_by_sensor.ngroups"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'accel': Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], dtype='int64'),\n",
       " 'orientation': Int64Index([12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,\n",
       "             23],\n",
       "            dtype='int64')}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# что представляют из себя найденные группы?\n",
    "grouped_by_sensor.groups"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Просмотр результатов группировки"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# вспомогательная функция, печатающая содержимое групп\n",
    "def print_groups (group_object):\n",
    "    # итерируем по всем группам, печатая название группы \n",
    "    # и первые пять наблюдений в группе\n",
    "    for name, group in group_object:\n",
    "        print (name)\n",
    "        print (group[:5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accel\n",
      "   interval sensor axis  reading\n",
      "0         0  accel    Z      0.0\n",
      "1         0  accel    Y      0.5\n",
      "2         0  accel    X      1.0\n",
      "3         1  accel    Z      0.1\n",
      "4         1  accel    Y      0.4\n",
      "orientation\n",
      "    interval       sensor axis  reading\n",
      "12         0  orientation    Z      0.0\n",
      "13         0  orientation    Y      0.1\n",
      "14         0  orientation    X      0.0\n",
      "15         1  orientation    Z      0.0\n",
      "16         1  orientation    Y      0.2\n"
     ]
    }
   ],
   "source": [
    "# смотрим содержимое созданных групп\n",
    "print_groups(grouped_by_sensor)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "sensor\n",
       "accel          12\n",
       "orientation    12\n",
       "dtype: int64"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# получаем информацию о количестве элементов\n",
    "# в каждой группе\n",
    "grouped_by_sensor.size()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "             interval  axis  reading\n",
       "sensor                              \n",
       "accel              12    12       12\n",
       "orientation        12    12       12"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# получаем информацию о количестве элементов\n",
    "# в каждом столбце каждой группы\n",
    "grouped_by_sensor.count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   interval sensor axis  reading\n",
       "0         0  accel    Z      0.0\n",
       "1         0  accel    Y      0.5\n",
       "2         0  accel    X      1.0\n",
       "3         1  accel    Z      0.1\n",
       "4         1  accel    Y      0.4"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# получаем данные конкретной группы\n",
    "grouped_by_sensor.get_group('accel')[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "    interval       sensor axis  reading\n",
       "0          0        accel    Z      0.0\n",
       "1          0        accel    Y      0.5\n",
       "2          0        accel    X      1.0\n",
       "12         0  orientation    Z      0.0\n",
       "13         0  orientation    Y      0.1\n",
       "14         0  orientation    X      0.0"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# извлекаем первые три строки в каждой группе\n",
    "grouped_by_sensor.head(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "            axis  interval  reading\n",
       "sensor                             \n",
       "accel          Y         0      0.5\n",
       "orientation    Y         0      0.1"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# извлекаем вторую строку каждой группы\n",
    "grouped_by_sensor.nth(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "            interval                     ...  reading  \\\n",
       "               count mean       std  min ...      25%   \n",
       "sensor                                   ...            \n",
       "accel           12.0  1.5  1.167748  0.0 ...      0.2   \n",
       "orientation     12.0  1.5  1.167748  0.0 ...      0.0   \n",
       "\n",
       "                               \n",
       "              50%    75%  max  \n",
       "sensor                         \n",
       "accel        0.35  0.725  1.0  \n",
       "orientation  0.10  0.225  0.4  \n",
       "\n",
       "[2 rows x 16 columns]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# получаем описательные статистики по каждой группе\n",
    "grouped_by_sensor.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Группировка по нескольким столбцам"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('accel', 'X')\n",
      "    interval sensor axis  reading\n",
      "2          0  accel    X      1.0\n",
      "5          1  accel    X      0.9\n",
      "8          2  accel    X      0.8\n",
      "11         3  accel    X      0.7\n",
      "('accel', 'Y')\n",
      "    interval sensor axis  reading\n",
      "1          0  accel    Y      0.5\n",
      "4          1  accel    Y      0.4\n",
      "7          2  accel    Y      0.3\n",
      "10         3  accel    Y      0.2\n",
      "('accel', 'Z')\n",
      "   interval sensor axis  reading\n",
      "0         0  accel    Z      0.0\n",
      "3         1  accel    Z      0.1\n",
      "6         2  accel    Z      0.2\n",
      "9         3  accel    Z      0.3\n",
      "('orientation', 'X')\n",
      "    interval       sensor axis  reading\n",
      "14         0  orientation    X      0.0\n",
      "17         1  orientation    X      0.1\n",
      "20         2  orientation    X      0.2\n",
      "23         3  orientation    X      0.3\n",
      "('orientation', 'Y')\n",
      "    interval       sensor axis  reading\n",
      "13         0  orientation    Y      0.1\n",
      "16         1  orientation    Y      0.2\n",
      "19         2  orientation    Y      0.3\n",
      "22         3  orientation    Y      0.4\n",
      "('orientation', 'Z')\n",
      "    interval       sensor axis  reading\n",
      "12         0  orientation    Z      0.0\n",
      "15         1  orientation    Z      0.0\n",
      "18         2  orientation    Z      0.0\n",
      "21         3  orientation    Z      0.0\n"
     ]
    }
   ],
   "source": [
    "# группируем по значениям столбцов sensor и axis\n",
    "mcg = sensor_data.groupby(['sensor', 'axis'])\n",
    "print_groups(mcg)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Группировка по уровням индекса"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "                  interval  reading\n",
       "sensor      axis                   \n",
       "accel       Z            0      0.0\n",
       "            Y            0      0.5\n",
       "            X            0      1.0\n",
       "            Z            1      0.1\n",
       "            Y            1      0.4\n",
       "...                    ...      ...\n",
       "orientation Y            2      0.3\n",
       "            X            2      0.2\n",
       "            Z            3      0.0\n",
       "            Y            3      0.4\n",
       "            X            3      0.3\n",
       "\n",
       "[24 rows x 2 columns]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# создаем копию данных и заново индексируем ее\n",
    "mi = sensor_data.copy()\n",
    "mi = mi.set_index(['sensor', 'axis'])\n",
    "mi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accel\n",
      "             interval  reading\n",
      "sensor axis                   \n",
      "accel  Z            0      0.0\n",
      "       Y            0      0.5\n",
      "       X            0      1.0\n",
      "       Z            1      0.1\n",
      "       Y            1      0.4\n",
      "orientation\n",
      "                  interval  reading\n",
      "sensor      axis                   \n",
      "orientation Z            0      0.0\n",
      "            Y            0      0.1\n",
      "            X            0      0.0\n",
      "            Z            1      0.0\n",
      "            Y            1      0.2\n"
     ]
    }
   ],
   "source": [
    "# группируем по первому уровню индекса \n",
    "print_groups(mi.groupby(level=0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('accel', 'X')\n",
      "             interval  reading\n",
      "sensor axis                   \n",
      "accel  X            0      1.0\n",
      "       X            1      0.9\n",
      "       X            2      0.8\n",
      "       X            3      0.7\n",
      "('accel', 'Y')\n",
      "             interval  reading\n",
      "sensor axis                   \n",
      "accel  Y            0      0.5\n",
      "       Y            1      0.4\n",
      "       Y            2      0.3\n",
      "       Y            3      0.2\n",
      "('accel', 'Z')\n",
      "             interval  reading\n",
      "sensor axis                   \n",
      "accel  Z            0      0.0\n",
      "       Z            1      0.1\n",
      "       Z            2      0.2\n",
      "       Z            3      0.3\n",
      "('orientation', 'X')\n",
      "                  interval  reading\n",
      "sensor      axis                   \n",
      "orientation X            0      0.0\n",
      "            X            1      0.1\n",
      "            X            2      0.2\n",
      "            X            3      0.3\n",
      "('orientation', 'Y')\n",
      "                  interval  reading\n",
      "sensor      axis                   \n",
      "orientation Y            0      0.1\n",
      "            Y            1      0.2\n",
      "            Y            2      0.3\n",
      "            Y            3      0.4\n",
      "('orientation', 'Z')\n",
      "                  interval  reading\n",
      "sensor      axis                   \n",
      "orientation Z            0      0.0\n",
      "            Z            1      0.0\n",
      "            Z            2      0.0\n",
      "            Z            3      0.0\n"
     ]
    }
   ],
   "source": [
    "# группируем по нескольким уровням индекса\n",
    "print_groups(mi.groupby(level=['sensor', 'axis']))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Применение агрегирующих функций к группам"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "                  interval  reading\n",
       "sensor      axis                   \n",
       "accel       X          1.5     0.85\n",
       "            Y          1.5     0.35\n",
       "            Z          1.5     0.15\n",
       "orientation X          1.5     0.15\n",
       "            Y          1.5     0.25\n",
       "            Z          1.5     0.00"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# вычисляем среднее для каждого сенсора/оси\n",
    "sensor_axis_grouping = mi.groupby(level=['sensor', 'axis'])\n",
    "sensor_axis_grouping.agg(np.mean)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "        sensor axis  interval  reading\n",
       "0        accel    X       1.5     0.85\n",
       "1        accel    Y       1.5     0.35\n",
       "2        accel    Z       1.5     0.15\n",
       "3  orientation    X       1.5     0.15\n",
       "4  orientation    Y       1.5     0.25\n",
       "5  orientation    Z       1.5     0.00"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# вместо индекса, совпадающего с индексом исходного объекта,\n",
    "# создаем числовой индекс и переносим уровни исходного\n",
    "# индекса в столбцы\n",
    "sensor_data.groupby(['sensor', 'axis'], as_index=False).agg(np.mean)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "                  interval  reading\n",
       "sensor      axis                   \n",
       "accel       X          1.5     0.85\n",
       "            Y          1.5     0.35\n",
       "            Z          1.5     0.15\n",
       "orientation X          1.5     0.15\n",
       "            Y          1.5     0.25\n",
       "            Z          1.5     0.00"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# можно просто применить агрегирующую функцию к группе\n",
    "sensor_axis_grouping.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "                 interval           reading          \n",
       "                      sum       std     sum       std\n",
       "sensor      axis                                     \n",
       "accel       X           6  1.290994     3.4  0.129099\n",
       "            Y           6  1.290994     1.4  0.129099\n",
       "            Z           6  1.290994     0.6  0.129099\n",
       "orientation X           6  1.290994     0.6  0.129099\n",
       "            Y           6  1.290994     1.0  0.129099\n",
       "            Z           6  1.290994     0.0  0.000000"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# применяем сразу несколько агрегирующих функций\n",
    "sensor_axis_grouping.agg([np.sum, np.std])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "                  interval  reading\n",
       "sensor      axis                   \n",
       "accel       X            4     0.85\n",
       "            Y            4     0.35\n",
       "            Z            4     0.15\n",
       "orientation X            4     0.15\n",
       "            Y            4     0.25\n",
       "            Z            4     0.00"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# применяем к каждому столбцу свою функцию\n",
    "sensor_axis_grouping.agg({'interval' : len,\n",
    "                          'reading': np.mean})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "sensor       axis\n",
       "accel        X       0.85\n",
       "             Y       0.35\n",
       "             Z       0.15\n",
       "orientation  X       0.15\n",
       "             Y       0.25\n",
       "             Z       0.00\n",
       "Name: reading, dtype: float64"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# вычисляем среднее только для столбца reading\n",
    "sensor_axis_grouping['reading'].mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Преобразование групп данных"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  Label Other  Values  Values2\n",
       "V     A   foo       0        5\n",
       "W     C   bar       1        6\n",
       "X     B   baz       2        7\n",
       "Y     A   fiz       3        8\n",
       "Z     C   buz       4        9"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# создаем объект DataFrame, который\n",
    "# будем использовать в примерах\n",
    "transform_data = pd.DataFrame({ 'Label': ['A', 'C', 'B', 'A', 'C'],\n",
    "                                'Values': [0, 1, 2, 3, 4],\n",
    "                                'Values2': [5, 6, 7, 8, 9],\n",
    "                                'Other': ['foo', 'bar', 'baz', \n",
    "                                          'fiz', 'buz']},\n",
    "                              index = list('VWXYZ'))\n",
    "transform_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "A\n",
      "  Label Other  Values  Values2\n",
      "V     A   foo       0        5\n",
      "Y     A   fiz       3        8\n",
      "B\n",
      "  Label Other  Values  Values2\n",
      "X     B   baz       2        7\n",
      "C\n",
      "  Label Other  Values  Values2\n",
      "W     C   bar       1        6\n",
      "Z     C   buz       4        9\n"
     ]
    }
   ],
   "source": [
    "# сгруппируем по столбцу Label\n",
    "grouped_by_label = transform_data.groupby('Label')\n",
    "print_groups(grouped_by_label)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   Values  Values2\n",
       "V      10       15\n",
       "W      11       16\n",
       "X      12       17\n",
       "Y      13       18\n",
       "Z      14       19"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# добавляем 10 ко всем значениям во всех столбцах\n",
    "grouped_by_label.transform(lambda x: x + 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Заполнение пропущенных значений групповым средним"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "A\n",
      "  Label  Values\n",
      "0     A    10.0\n",
      "2     A    11.0\n",
      "4     A    12.0\n",
      "B\n",
      "  Label  Values\n",
      "1     B    20.0\n",
      "3     B     NaN\n",
      "5     B    22.0\n"
     ]
    }
   ],
   "source": [
    "# создаем данные, чтобы продемонстрировать способ\n",
    "# замены пропусков\n",
    "df = pd.DataFrame({ 'Label': list(\"ABABAB\"),\n",
    "                    'Values': [10, 20, 11, np.nan, 12, 22]})\n",
    "grouped = df.groupby('Label')\n",
    "print_groups(grouped)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "       Values\n",
       "Label        \n",
       "A        11.0\n",
       "B        21.0"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# вычисляем среднее для каждой группы\n",
    "grouped.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   Values\n",
       "0    10.0\n",
       "1    20.0\n",
       "2    11.0\n",
       "3    21.0\n",
       "4    12.0\n",
       "5    22.0"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# используем метод .transform(), чтобы заполнить\n",
    "# значения NaN групповым средним\n",
    "filled_NaNs = grouped.transform(lambda x: x.fillna(x.mean()))\n",
    "filled_NaNs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Вычисление z-значений"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2013-04-10    0.073603\n",
       "2013-04-11    0.057313\n",
       "2013-04-12    0.089255\n",
       "2013-04-13    0.133248\n",
       "2013-04-14    0.175876\n",
       "Freq: D, dtype: float64"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# генерируем временной ряд со скользящими средними\n",
    "np.random.seed(123456)\n",
    "data = pd.Series(np.random.normal(0.5, 2, 365*3), \n",
    "                 pd.date_range('2013-01-01', periods=365*3))\n",
    "periods = 100\n",
    "rolling = data.rolling(\n",
    "    window=periods,\n",
    "    min_periods=periods,\n",
    "    center=False).mean().dropna()\n",
    "rolling[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1d14612ce48>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# визуализируем ряд\n",
    "rolling.plot();"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "          mean       std\n",
       "2013  0.454233  0.171988\n",
       "2014  0.286502  0.182040\n",
       "2015  0.599447  0.275786"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# вычисляем среднее и стандартное отклонение\n",
    "# по каждому году\n",
    "group_key = lambda x: x.year\n",
    "groups = rolling.groupby(group_key)\n",
    "groups.agg([np.mean, np.std])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "              mean  std\n",
       "2013 -3.172066e-17  1.0\n",
       "2014 -1.881296e-15  1.0\n",
       "2015 -1.492261e-15  1.0"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# выполняем z-преобразование\n",
    "z_score = lambda x: (x - x.mean()) / x.std()\n",
    "normed = rolling.groupby(group_key).transform(z_score)\n",
    "normed.groupby(group_key).agg([np.mean, np.std])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1d1465a29b0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# визуализируем исходные и\n",
    "# стандартизированные данные\n",
    "compared = pd.DataFrame({ 'Original': rolling,\n",
    "                          'Normed': normed })\n",
    "compared.plot();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Исключение групп из процедуры агрегирования"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  Label  Values\n",
       "0     A     1.0\n",
       "1     A     2.0\n",
       "2     B     3.0\n",
       "3     C     4.0\n",
       "4     C     NaN\n",
       "5     C     8.0"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# создаем данные для наших примеров\n",
    "df = pd.DataFrame({'Label': list('AABCCC'),\n",
    "                   'Values': [1, 2, 3, 4, np.nan, 8]})\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  Label  Values\n",
       "0     A     1.0\n",
       "1     A     2.0\n",
       "3     C     4.0\n",
       "4     C     NaN\n",
       "5     C     8.0"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# удаляем группы с одним непропущенным \n",
    "# значением и меньше\n",
    "f = lambda x: x.Values.count() > 1\n",
    "df.groupby('Label').filter(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  Label  Values\n",
       "0     A     1.0\n",
       "1     A     2.0\n",
       "2     B     3.0"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# удаляем группы, в которых есть пропуски\n",
    "f = lambda x: x.Values.isnull().sum() == 0\n",
    "df.groupby('Label').filter(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  Label  Values\n",
       "3     C     4.0\n",
       "4     C     NaN\n",
       "5     C     8.0"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# отбираем группы со средним 2.0 и выше \n",
    "grouped = df.groupby('Label')\n",
    "group_mean = grouped.mean().mean()\n",
    "f = lambda x: abs(x.Values.mean() - group_mean) > 2.0\n",
    "df.groupby('Label').filter(f)"
   ]
  }
 ],
 "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.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
