{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Майнор по Анализу Данных, Группа ИАД-2\n", "## 25/01/2017 Спасательная операция: Pandas, Matplotlib, NumPy. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Так как на предыдущем майноре вам не успели рассказать про `рandas`, `matplotlib`, `numpy`, то придется вас спасать.\n", "\n", "**Дисклеймер**
\n", "Мы очень ограничены во времени и естественно стать гуру `pandas`, `numpy`, `matplotlib` и других модулей за такой краткий срок у вас не получится. Этому может способствовать только постоянная практика: наши домашние задания, онлайн курсы по анализу данных в `python`, [видео лекции](http://www.dataschool.io/easier-data-analysis-with-pandas/), ваша курсовая работа (?). Я постараюсь изложить основную суть. Для всего, что я не успею - можно спрашивать меня, google или [RTFM](http://pandas.pydata.org/).\n", "\n", "Начнем." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "%matplotlib inline\n", "\n", "plt.style.use('ggplot')\n", "plt.rcParams['figure.figsize'] = (16,8)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# NumPy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "NumPy (short for Numerical Python) - это эффективная библиотека для работы с числовыми массивами и матрицами.\n", "\n", "Нам с вами очень важно уметь работать с этими структурами быстро по крайней мере по двум причинам:\n", "* Данные любой природы в подавляющем числе случаем можно преставить в виде набора чисел (изображения, тексты, видео-клипы, простые табличные данные)\n", "* Этих данных очень много и надо бы уметь их быстро обрабатывать, анализировать и модифицировать ( желательно избегая вложенных циклов, большого набора условных операторов!)\n", "\n", "Основа `numpy` - это `array` (массивы). В отличие от списков или кортежей, элементы массива должны быть одного типа. Такая жертва оправдывает скорость и низкие затраты на хранение информации, которую дает numpy. Массивы же, в свою очередь, используются во многих других библиотеках `python` для анализа данных." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Массивы" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Создание массива" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Массив можно создать из списка." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr = np.array([1,3,4,7,12])\n", "arr" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr = np.array([1,3,4,7,12.0])\n", "arr" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr = np.array([1,3,4,'7',12.0])\n", "arr" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Но наиболее распространены создания \"с нуля\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr = np.arange(0, 12, 0.7) # расширение функции range()\n", "arr" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr = np.linspace(0, 12, 20) # равномерно распределенные 20 чисел от 0 до 12\n", "arr" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Массив из \"1\"\n", "arr = np.ones(7)\n", "print arr\n", "arr = np.ones(7, dtype=int)\n", "print arr" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Массив из \"0\"\n", "arr = np.zeros(7)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Массив из чего хотите\n", "arr = np.full(7, np.exp(1), )\n", "arr" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Свойства массива" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "A = np.array([[3, 1, 4], [1, 5, 9], [2, 6, 5], [4, 1, 1]])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print A.shape\n", "print A.size\n", "print A.ndim" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Форму массива (`shape`) можно менять, но так, чтобы это согласовывалось с его размером (`size`) " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "A = A.reshape((6,2))\n", "A" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "A = A.flatten()\n", "A\n", "\n", "#!!!\n", "# Это не тоже самое, что A = A.reshape((1, 12))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "A = A.reshape((3,-1)) \n", "A\n", "\n", "# -1 как бы означает, \"сделай первую размерность равную 3, \n", "# а все остальное запихни во вторую, если получится" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "A.T # Транспонирование матрицы" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Индексация" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Довольно стандартная и интуитивно понятная" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr = np.arange(0, 19, 3)\n", "arr" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr[3]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr[:3]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr[3:5]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr[::3] #?!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr[-2:] #?!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задание**
\n", "Догадайтесь, как вывести массив в обратном порядке?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "## Your code here\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print arr>10\n", "print arr[arr>10]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr[[1,3,2]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "На многомерные массивы (матрицы) все распространяется точно также." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "A = np.random.randint(0, 20, (5,6))\n", "A" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Небольшое дополнение\n", "print A[:, 2]\n", "print A[2, :]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "A[A>5]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задание**\n", "Задайте случайную матрицу размера `(5,7)` c числами от 5 до 34, такую что на каждой строчке числа поледовательно возрастают на 1. Первая строчка начинается с 5 и заканчивается 10, вторая начинается с 11 и тп. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "## Your code here\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Склейка массивов" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "a = np.random.randint(0, 10, (2, 5))\n", "b = np.random.randint(0, 10, (2, 5))\n", "\n", "print a\n", "print b" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "A = np.r_[a,b]\n", "A" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "A = np.concatenate((a,b), axis=0)\n", "A" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "A = np.c_[a,b]\n", "A" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "A = np.concatenate((a,b), axis=1)\n", "A" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Операции и функции на массивах" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Тут все тоже довольно просто" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr = np.arange(1,6, dtype=float)\n", "arr" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "1/arr" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr * 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr // 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "bar = np.arange(6,1,-1)\n", "bar" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr + bar" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr * bar" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr ** bar" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Матричное умножение (скалярное произведение)\n", "arr.dot(bar)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В `numpy` реализовано много математических функций" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "np.log(arr)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "np.sqrt(arr)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задание**
\n", "Задайте два случайных массива $a$ и $b$ одинаковой длины. \n", "\n", "Вычислите следующие расстояния между массивами:\n", "\n", "* Euclidean Distance\n", "$$ d(a, b) = \\sqrt{\\sum_i (a_i - b_i)^2} $$\n", "* Manhattan Distance\n", "$$ d(a, b) = \\sum_i |a_i - b_i| $$\n", "* Cosine Distance\n", "$$ d(a, b) = 1 - \\frac{a^\\top b}{||a||_2\\cdot||b||_2}$$\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "## Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задание**
\n", "Выполните загрузку данных, как указано ниже (может занять время).\n", "\n", "Выберите случайную строчку из данных. Найдите другую \"ближайшую\" (по евклидовому расстоянию) к ней строчку и выведите её." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn.datasets import fetch_olivetti_faces\n", "faces = fetch_olivetti_faces()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "X = faces.data" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "## Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Аггрегация" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Массивы можно аггрегировать - считать среднее значение, медиану, моду, максимум, минимум, сумму и тп" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr = np.random.rand(11)\n", "arr" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print np.mean(arr)\n", "print arr.mean()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr.sum()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print 'максимальное значение %.4f находится на %d позиции' % (arr.max(), arr.argmax())\n", "# аналогично argmax, есть argmin и argsort" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "np.median(arr)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "np.percentile(arr, [15, 85])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задание**
\n", "Сгенерируйте такой случайный вектор (`np.random.rand()`) длины 10, что сумма его элементов равна 2." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "## Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задание**
\n", "Сгенерируйте случайный вектор (`np.random.rand()`) длины 100. Выполните такое преобразование массива, что \n", "* Максимальному элементу(-ам) соответствовало число 1\n", "* Минимальному элементу(-ам) соответствовало число 0\n", "* Остальные элементы находились на интервале 0-1 с сохранением порядка" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "## Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задание**
\n", "Сгенерируйте случайный вектор длины 20 из целых чисел на интервале [0,50]. Оставьте в нем только те элементы что меньше 5 персентиля и больше 95 персентиля" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "## Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Что касается матриц - то в них все примерно тоже самое." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "A = np.random.rand(3,5)\n", "A" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "A.mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задание**
\n", "Сгенерируйте случайную матрицу размера $5 \\times 6$ из целых чисел на интервале [0,50]. Выведите столбец с содержащий максимальное значение во всей матрице." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "## Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Пропущенные значения" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В `numpy` есть специальные обозначения для бесконечности и пропущенных значений.\n", "\n", "В реальном мире приходится работать с очень \"грязными\" данными и частенько бывает, что какие-то измерения, значения признаков и тп просто отсутствуют. К этому надо быть готовым" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "np.log(0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "np.log(-1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "np.nan" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr = np.random.rand(10)\n", "idx = np.random.randint(0, 10, 4)\n", "arr[idx] = np.nan\n", "arr" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# проверяем, является ли значение пропущенным\n", "is_nan = np.isnan(arr)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# проверяем, есть ли хотя бы одно пропущенное\n", "np.any(is_nan)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# проверяем, есть ли хотя бы одно пропущенное\n", "np.all(is_nan)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Аггрегация массивов с пропущенными значениями может выполняться без учета np.nan" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print np.nanmean(arr)\n", "print np.mean(arr)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задание**
\n", "Замените все пропущенные значение средним" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "## Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Линейная регрессия (Пока бездумно)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Загрузите [файл 1](https://www.dropbox.com/s/kg9px9v3xfysak9/tutorial_dataset.csv?dl=0) и [файл 2](https://www.dropbox.com/s/f87gm612o144emx/tutorial_dataset_2.csv?dl=0) в папку с тетрадкой. С помощью функции `loadtxt` в модуле `numpy` загрузите табличные данные одного из файлов. Присвойте y = D[:,0] а X = D[:, 1:].\n", "\n", "Сейчас мы воспользуемся одной магической формулой и построим модель линейной регрессии. Откуда эта формула берется мы узнаем на следующих занятиях.\n", "\n", "Модель линейной регрессии в матричном виде выглядит так: $\\hat{y} = X\\hat{\\beta}$, где\n", "\n", "$$ \\hat{\\beta} = (X^T X)^{-1} X^T y $$\n", "Остатки модели рассчитываются как\n", "$$ \\text{res} = y - \\hat{y} $$\n", "\n", "Итак, еще раз:\n", "\n", "1. Загрузите данные\n", "2. Оцените веса $\\beta$ с помощью формулы\n", "3. Постройте график, на котором по оси Y: остатки, а по оси X: $\\hat{y}$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# load data\n", "D = np.loadtxt('tutorial_dataset_1.csv', \n", " skiprows=1, \n", " delimiter=',')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Pandas\n", "## Основные структуры" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Модуль `pandas` существенно упрощает исследование табличных данных в `python`. Работа в нем во многом напоминает работу с таблицами в SQL с тем отличием, что в `pandas` ~~тебе не хочется рвать волосы на голове~~ это делать гораздо удобнее, и в нем заложены некоторые дополнительные инструменты по работе с данными." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Series" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Основными структурами являются `Series` и `DataFrame`.
\n", "`Series` – это проиндексированный одномерный массив значений. Он похож на простой словарь типа `dict`, где имя элемента будет соответствовать индексу, а значение – значению записи." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Задать `Series` можно многими способами, например с помощью массива:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ser = pd.Series(np.random.rand(5))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ser" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Колонка слева - это (строчный) индекс - некоторая нумерация записанных значений" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ser.index" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ser.values" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Достучаться до одного значения можно так\n", "ser[1]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Можно так - это обычная интервальная индексация в python.\n", "ser[0:2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Но про то, как улучше находить нужные вам значения - чуть позже." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Индексом может быть что угодно, например:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ser = pd.Series(np.random.rand(5), index=['m', 'i', 'n', 'o', 'r'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ser" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ser['r']" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ser['n':'o']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Индексация" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Индексация в `pandas` может временами может показаться запутанной" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ser = pd.Series(np.random.rand(5), index=[1,3,5,6,9])\n", "ser" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ser[3]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ser[3:5] #?!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Поэтому придумали разные операторы для индексирования, чтобы можно было явно указать, когда вы хотите использовать значения индекса, а когда позицию." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ser.loc[3:5, ]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ser.loc[:, ]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "idx = ser > 0.5\n", "ser.loc[idx, ]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ser.iloc[3:5, ]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Их же используйте для присваивания!!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "idx = ser > 0.5\n", "ser.loc[idx, ] = 0.5\n", "ser" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### DataFrame" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`DataFrame` — это проиндексированный многомерный массив значений, соответственно каждый столбец `DataFrame`, является структурой `Series`. Индексирование в `DataFrame` ровно тоже, что и в `Series`, с тем отличием, что добавляется второе измерение." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = pd.DataFrame(np.random.randn(10, 3),\n", " index=range(10),\n", " columns=['A', 'B', 'C'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.head() # выводит первые 5 (по-умолчанию) строк таблицы" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print df.index\n", "print df.columns" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.loc[1:3, ['A', 'B']]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.iloc[1:3, 0:2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`DataFrame` тоже можно транспонировать!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.T" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Краткая описательная статистика\n", "df.describe() \n", "\n", "# Кстати, это тоже DataFrame" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Аггрегация в DataFrame (по-умолчанию) происходит по стоблцам" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.mean()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.A.mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Перевод данных в нужный тип" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.A = df.A.astype(int)\n", "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print 'Количество уникальных значений в столбце А = %d' % df.A.nunique()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print 'Самые большие значения в стоблце B :'\n", "print df.B.nlargest(2)\n", "\n", "# Гораздо быстрее, чем df.B.sort(ascending=False).iloc[:2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Важно следить за данными, которые у вас хранятся в `DataFrame`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.dtypes" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.loc[0, 'A'] = 'lalaley'\n", "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.A" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Удаление\\добавление строк\\столбцов" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.drop(0, axis=0)\n", "# Пока df не изменился !" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.drop('A', axis=1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.loc[:, 'D'] = np.nan\n", "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.loc[10, :] = 0\n", "df.tail()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Продолжим обучение на \"реальных данных\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В 1968 году была [опубликована](http://www.ncbi.nlm.nih.gov/pubmed/5676802) статья под интригующем названием Correlation of Performance Test Scores with Tissue Concentration of Lysergic Acid Diethylamide in Human Subjects.\n", "\n", "К статье приложен небольшой набор [данных](https://www.dropbox.com/s/ui14yeeckbc6z7c/drugs-and-math.csv?dl=0), состоящий из 7 наблюдений" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = pd.read_csv('drugs-and-math.csv', \n", " index_col=0, \n", " sep=',')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print df.shape\n", "print df.columns\n", "print df.index" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Таблица уже отсортирована по колонке Drugs - отсортируем по колонке Score" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = df.sort_values('Score', \n", " ascending=False)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.describe().T # Иногда так лучше" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.plot(kind='box')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.Drugs.hist()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# df.plot(x='Drugs', y='Score')\n", "df.plot(x='Drugs', y='Score', kind='scatter')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Мы явно видим тенденцию.." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Качество вина" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Загрузите [датасет](https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv) с информацией о характеристиках вина и его качестве." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "## Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Что из себя представляет объект в этом наборе данных? Сколько их?\n", "* Какие признаки описывают объекты? Сколько их?\n", "* Какой признак является целевым?\n", "* Каковы их области значений?\n", "* Есть ли пропуски?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "## Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Какие признаки больше всего влияют на целевую переменную?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "## Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Создайте новый столбец `quality_cat`, которая будет иметь значение `\"good\"` если `quality > 5` и `\"bad\"` - иначе.
" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "## Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Нарисуйте гистрограммы признака alcohol в группах с `quality_cat == \"good\"` и `quality_cat == \"bad\"`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "## Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Можете ли вы придумать правило для классификации вина на хорошее и плохое по рисунку выше? Пусть это будет нашей первой моделью)\n", "\n", "Напишите функцию `brute_clf_train()` которая бы перебирала пороговое значение по признаку `alcohol` и находило бы \"оптимальное\" (кстати, что значит оптимальное?)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "## Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Напишите функцию `brute_clf_predict()` которая бы по значению признака `alcohol` и найденному выше порогу говорила какое качество у вина.\n", "\n", "А заодно выводила бы количество \"ошибок\" на текущем наборе данных" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Проверим, как обобщается наша модель на другие данные.\n", "\n", "* Загрузите другой [датасет](https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-white.csv)\n", "* Выполните те же панипуляции с признаками\n", "* Используйте нашу простейшую модель для предсказания качества на новых данных" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "## Your code here" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [default]", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12" }, "nav_menu": {}, "toc": { "navigate_menu": true, "number_sections": false, "sideBar": true, "threshold": 6, "toc_cell": false, "toc_section_display": "block", "toc_window_display": true }, "toc_position": { "height": "924px", "left": "0px", "right": "1622.67px", "top": "108px", "width": "212px" } }, "nbformat": 4, "nbformat_minor": 0 }