{
"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
}