{ "cells": [ { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "## Кодирование категориальных (факторных, номинальных) признаков\n", "\n", "автор: Александр Дьяконов (alexanderdyakonov.wordpress.com)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
cityclassdegreeincome
0MoscowA110.2
1LondonB111.6
2LondonA28.8
3KievA29.0
4MoscowB36.6
5MoscowB310.0
6KievA19.0
7MoscowA17.2
\n", "
" ], "text/plain": [ " city class degree income\n", "0 Moscow A 1 10.2\n", "1 London B 1 11.6\n", "2 London A 2 8.8\n", "3 Kiev A 2 9.0\n", "4 Moscow B 3 6.6\n", "5 Moscow B 3 10.0\n", "6 Kiev A 1 9.0\n", "7 Moscow A 1 7.2" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "# просто табличка для примера\n", "def create_data():\n", " return (pd.DataFrame({'city': ['Moscow', 'London', 'London', 'Kiev', 'Moscow', 'Moscow', 'Kiev','Moscow'], 'degree': [1,1,2,2,3,3,1,1], 'class':['A','B','A','A','B','B','A','A'], 'income':[10.2, 11.6, 8.8, 9.0, 6.6, 10.0, 9.0, 7.2]}))\n", "\n", "data = create_data()\n", "data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### как часто распознают категориальные признаки\n", "\n", "Идея - категориальные признаки те, в которых значения - строки\n", "(можно смотреть ещё на число уникальных значений)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "city строка, мало уникальных\n", "class строка, мало уникальных\n", "degree мало уникальных\n" ] } ], "source": [ "# найти все признаки, в которых первое значение - строка\n", "def find_cat(data):\n", " for name in data.columns:\n", " s = ''\n", " s += name\n", " if (type(data[name][0]) == str):\n", " s += ' строка,'\n", " if (data[name].nunique()<=3):\n", " s += ' мало уникальных'\n", " if (s!=name):\n", " print (s)\n", " \n", "find_cat(data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Делаем один категориальный признак на основе нескольких" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
cityclassdegreeincomecity + degree
0MoscowA110.2Moscow + 1
1LondonB111.6London + 1
2LondonA28.8London + 2
3KievA29.0Kiev + 2
4MoscowB36.6Moscow + 3
5MoscowB310.0Moscow + 3
6KievA19.0Kiev + 1
7MoscowA17.2Moscow + 1
\n", "
" ], "text/plain": [ " city class degree income city + degree\n", "0 Moscow A 1 10.2 Moscow + 1\n", "1 London B 1 11.6 London + 1\n", "2 London A 2 8.8 London + 2\n", "3 Kiev A 2 9.0 Kiev + 2\n", "4 Moscow B 3 6.6 Moscow + 3\n", "5 Moscow B 3 10.0 Moscow + 3\n", "6 Kiev A 1 9.0 Kiev + 1\n", "7 Moscow A 1 7.2 Moscow + 1" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# конъюнкция двух признаков\n", "def make_conj(data, feature1, feature2):\n", " data[feature1 + ' + ' + feature2] = data[feature1].astype(str) + ' + ' + data[feature2].astype(str)\n", " return (data)\n", "\n", "# пример использования\n", "make_conj(data, 'city', 'degree')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Обычное кодирование\n", "\n", "По умолчанию - в лексикографическом порядке" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
cityclassdegreeincomecity + degreecity_le
0MoscowA110.2Moscow + 12
1LondonB111.6London + 11
2LondonA28.8London + 21
3KievA29.0Kiev + 20
4MoscowB36.6Moscow + 32
5MoscowB310.0Moscow + 32
6KievA19.0Kiev + 10
7MoscowA17.2Moscow + 12
\n", "
" ], "text/plain": [ " city class degree income city + degree city_le\n", "0 Moscow A 1 10.2 Moscow + 1 2\n", "1 London B 1 11.6 London + 1 1\n", "2 London A 2 8.8 London + 2 1\n", "3 Kiev A 2 9.0 Kiev + 2 0\n", "4 Moscow B 3 6.6 Moscow + 3 2\n", "5 Moscow B 3 10.0 Moscow + 3 2\n", "6 Kiev A 1 9.0 Kiev + 1 0\n", "7 Moscow A 1 7.2 Moscow + 1 2" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.preprocessing import LabelEncoder\n", "le = LabelEncoder()\n", "le.fit(data.city)\n", "data['city_le'] = le.transform(data.city)\n", "data" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
cityclassdegreeincomecity + degreecity_le
0MoscowA110.2Moscow + 12
1LondonB111.6London + 11
2LondonA28.8London + 21
3KievA29.0Kiev + 20
4MoscowB36.6Moscow + 32
5MoscowB310.0Moscow + 32
6KievA19.0Kiev + 10
7MoscowA17.2Moscow + 12
\n", "
" ], "text/plain": [ " city class degree income city + degree city_le\n", "0 Moscow A 1 10.2 Moscow + 1 2\n", "1 London B 1 11.6 London + 1 1\n", "2 London A 2 8.8 London + 2 1\n", "3 Kiev A 2 9.0 Kiev + 2 0\n", "4 Moscow B 3 6.6 Moscow + 3 2\n", "5 Moscow B 3 10.0 Moscow + 3 2\n", "6 Kiev A 1 9.0 Kiev + 1 0\n", "7 Moscow A 1 7.2 Moscow + 1 2" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# ручная альтернатива\n", "# словарь для кодировки\n", "dct = {'Kiev': 0, 'London': 1, 'Moscow': 2}\n", "data['city_le'] = data['city'].map(dct)\n", "data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### dummy-кодировка\n", "\n", "Бинарными характеристическими векторами" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
cityclassdegreeincomecity + degreecity_lecity=0city=1city=2
0MoscowA110.2Moscow + 12001
1LondonB111.6London + 11010
2LondonA28.8London + 21010
3KievA29.0Kiev + 20100
4MoscowB36.6Moscow + 32001
5MoscowB310.0Moscow + 32001
6KievA19.0Kiev + 10100
7MoscowA17.2Moscow + 12001
\n", "
" ], "text/plain": [ " city class degree income city + degree city_le city=0 city=1 city=2\n", "0 Moscow A 1 10.2 Moscow + 1 2 0 0 1\n", "1 London B 1 11.6 London + 1 1 0 1 0\n", "2 London A 2 8.8 London + 2 1 0 1 0\n", "3 Kiev A 2 9.0 Kiev + 2 0 1 0 0\n", "4 Moscow B 3 6.6 Moscow + 3 2 0 0 1\n", "5 Moscow B 3 10.0 Moscow + 3 2 0 0 1\n", "6 Kiev A 1 9.0 Kiev + 1 0 1 0 0\n", "7 Moscow A 1 7.2 Moscow + 1 2 0 0 1" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.preprocessing import OneHotEncoder\n", "ohe = OneHotEncoder(sparse=False) # sparse=False categorical_features=...\n", "new_ohe_features = ohe.fit_transform(data.city_le.values.reshape(-1, 1))\n", "tmp = pd.DataFrame(new_ohe_features, columns=['city=' + str(i) for i in range(new_ohe_features.shape[1])])\n", "data = pd.concat([data, tmp], axis=1)\n", "data" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
cityclassdegreeincomecity + degreecity_lecity=0city=1city=2city=Moscowcity=Londoncity=Kiev
0MoscowA110.2Moscow + 12001100
1LondonB111.6London + 11010010
2LondonA28.8London + 21010010
3KievA29.0Kiev + 20100001
4MoscowB36.6Moscow + 32001100
5MoscowB310.0Moscow + 32001100
6KievA19.0Kiev + 10100001
7MoscowA17.2Moscow + 12001100
\n", "
" ], "text/plain": [ " city class degree income city + degree city_le city=0 city=1 \\\n", "0 Moscow A 1 10.2 Moscow + 1 2 0 0 \n", "1 London B 1 11.6 London + 1 1 0 1 \n", "2 London A 2 8.8 London + 2 1 0 1 \n", "3 Kiev A 2 9.0 Kiev + 2 0 1 0 \n", "4 Moscow B 3 6.6 Moscow + 3 2 0 0 \n", "5 Moscow B 3 10.0 Moscow + 3 2 0 0 \n", "6 Kiev A 1 9.0 Kiev + 1 0 1 0 \n", "7 Moscow A 1 7.2 Moscow + 1 2 0 0 \n", "\n", " city=2 city=Moscow city=London city=Kiev \n", "0 1 1 0 0 \n", "1 0 0 1 0 \n", "2 0 0 1 0 \n", "3 0 0 0 1 \n", "4 1 1 0 0 \n", "5 1 1 0 0 \n", "6 0 0 0 1 \n", "7 1 1 0 0 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# ручной способ\n", "def code_myohe(data, feature):\n", " for i in data[feature].unique():\n", " data[feature + '=' + i] = (data[feature] == i).astype(float)\n", "\n", "code_myohe(data, 'city')\n", "data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Кодировка по значениям вещественного признака\n", "Например, каждая категория - среднее значение выбранного признака" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
cityclassdegreeincomecity_mean_income
0MoscowA110.28.5
1LondonB111.610.2
2LondonA28.810.2
3KievA29.09.0
4MoscowB36.68.5
5MoscowB310.08.5
6KievA19.09.0
7MoscowA17.28.5
\n", "
" ], "text/plain": [ " city class degree income city_mean_income\n", "0 Moscow A 1 10.2 8.5\n", "1 London B 1 11.6 10.2\n", "2 London A 2 8.8 10.2\n", "3 Kiev A 2 9.0 9.0\n", "4 Moscow B 3 6.6 8.5\n", "5 Moscow B 3 10.0 8.5\n", "6 Kiev A 1 9.0 9.0\n", "7 Moscow A 1 7.2 8.5" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# функция возвращает значения нового признака\n", "def code_mean(data, cat_feature, real_feature):\n", " return (data[cat_feature].map(data.groupby(cat_feature)[real_feature].mean()))\n", "\n", "data = create_data()\n", "data['city_mean_income'] = code_mean(data, 'city', 'income')\n", "data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Кодировка по значениям другого категориального признака\n", "см. *Дьяконов А. Г. Методы решения задач классификации с категориальными признаками // Прикладная математика и информатика. Труды факультета Вычислительной математики и кибернетики МГУ имени М.В. Ломоносова. — 2014. — № 46. — С. 103–127.*" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
cityclassdegreeincomecity_mean_incomecity_degree_code
0MoscowA110.28.5-0.888074
1LondonB111.610.2-0.325058
2LondonA28.810.2-0.325058
3KievA29.09.0-0.325058
4MoscowB36.68.5-0.888074
5MoscowB310.08.5-0.888074
6KievA19.09.0-0.325058
7MoscowA17.28.5-0.888074
\n", "
" ], "text/plain": [ " city class degree income city_mean_income city_degree_code\n", "0 Moscow A 1 10.2 8.5 -0.888074\n", "1 London B 1 11.6 10.2 -0.325058\n", "2 London A 2 8.8 10.2 -0.325058\n", "3 Kiev A 2 9.0 9.0 -0.325058\n", "4 Moscow B 3 6.6 8.5 -0.888074\n", "5 Moscow B 3 10.0 8.5 -0.888074\n", "6 Kiev A 1 9.0 9.0 -0.325058\n", "7 Moscow A 1 7.2 8.5 -0.888074" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "from numpy.linalg import svd\n", "\n", "# функция возвращает значения нового признака\n", "def code_factor(data, cat_feature, cat_feature2):\n", " ct = pd.crosstab(data[cat_feature], data[cat_feature2])\n", " u, _, _ = svd(ct.values)\n", " coder = dict(zip(ct.index, u[:,0])) # если кодировать первой компонентой\n", " return (data[cat_feature].map(coder))\n", "\n", "data['city_degree_code'] = code_factor(data, 'city', 'degree')\n", "data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Инструменты:\n", "### Функция crosstab\n", "\n", "мощное средство для работы с категориальными признаками" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] }, { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
classAB
citydegree
Kiev110
210
London101
210
Moscow120
302
\n", "
" ], "text/plain": [ "class A B\n", "city degree \n", "Kiev 1 1 0\n", " 2 1 0\n", "London 1 0 1\n", " 2 1 0\n", "Moscow 1 2 0\n", " 3 0 2" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n63WXZmbWd3hHxFxgWR+b9e8OB4mSxBFHHMGIESN45JFH6i7HzKySMe8A9pE0T9JdknarYJ9NoXPM\nOyJWH4V/5jOfqbkqM7NqThV8Ctg+It6R9AXgNmDX7jZsa2tb/Xlrayutra0977Wt51VD5ZBDDmHE\niBFIoqWlhfb2doe3mQ2qjo4OOjo6+tyuX7dBk9QC3NndG5bdbPsysFdELG1Y7tugmSXEt0HrXja3\nQZO0jcpLFiVNoviFsLSPp5mZ2Troz6mCPwGmAVtLWgycC4wCiIjLgaOBr0paCbwDfGnwyjUzM/Dd\n4yuVUy9mHjbpXjbDJmZmNvQc3mZmCXJ4m5klqCmmhO3P/NpmZvaR2sM75zc2zMwGi4dNzMwS5PA2\nM0uQw9vMLEEObzOzBDm8zcwS5PA2M0uQw9vMLEEObzOzBDm8zcwS5PA2M0uQw9vMLEEObzOzBDm8\nzcwS5PA2M0uQw9vMLEEObzOzBDm8zcwS5PA2M0uQw9vMLEEObzOzBDm8zcwS5PA2M0uQw9vMLEEO\nbzOzBDm8zcwS5PA2M0uQw9vMLEEObzOzBDm8zcwS5PA2M0uQw9vMLEEObzOzBDm8zcwS5PA2M0uQ\nw9vMLEEObzOzBDm8zcwS5PA2M0uQw9vMLEEObzOzBDm8zcwS5PA2M0tQn+Et6SpJr0ta0Ms2F0p6\nQdI8SROrLdHMzBr158j7auCgnlZKmgHsHBG7AKcCl1ZUm5mZ9aDP8I6IucCyXjY5FJhTbvs4sIWk\nbaopz8zMulPFmPcngcVdHi8Btqtgv2Zm1oORFe1HDY+ju43a2tpWf97a2kpra2vfO1bjrvsvotsy\nmkru/Q1EKt+TVOq0tHR0dNDR0dHndurPD5GkFuDOiNi9m3WXAR0RcUP5+HlgWkS83rBdDOQHtvgP\nMpAfdCXxHyT3/gZCErQN4IltdYR3vq9d7v0N1FD/fEoiItY4Uqhi2OQO4MTyi0wB3mwMbjMzq1af\nwyaSfgJMA7aWtBg4FxgFEBGXR8RdkmZIehF4GzhlMAs2M7N+hHdEzOzHNrOqKcfMzPrDV1iamSXI\n4W1mliCHt5lZghzeZmYJcnibmSXI4W1mliCHt5lZghzeZmYJcnibmSXI4W1mliCHt5lZghzeZmYJ\ncnibmSXI4W1mliCHt5lZghzeZmYJcnibmSXI4W1mliCHt5lZghzeZmYJcnibmSXI4W1mliCHt5lZ\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\ndHOhax7drJSVaHRz7Thz5gz9+vXD39+fZs2aERISwubNmx3rNbpZqQpscF9yc6Vu21mfopubNm3K\nP//5Tzp16oSXlxfLly8nIiKCjIwMvLy8NLpZKauoT9HNjRo14vbbb8fLy4uCggK8vLzIzMzk7Nmz\njm00ulkpC6iP0c3du3encePGDB8+nLi4OPz9/R3rNLpZKQuoj9HNu3fvJjs7m6SkJPr16+e0TqOb\nlbKA+hrdfN111xEVFcUrr7zC7t27HcuvaXSziPxTRH4QkT018opK1RP1Pbo5Ly+PI0eOOB5f6+jm\n94EhNfJqStUj9Sm6eevWrfzrX/8iNzeXixcv8uqrr/Ljjz/Sp08fxzbXNLrZGLMJyKyRV1OqHqlP\n0c2XLl1i8uTJ+Pv707ZtW1JTU1m1apXj/dVKdLOItANSjDF3lrFOE1A9XXz9SUDV6Gb3sVx0szYu\ni4uvP41LWU9VGleNnDkfHx/v+D0sLKxG78VWafG199JKqaqz2+3Y7XaXtq17Iy48oxbPUjdHJjri\nqhvccrMMEfkA2AzcJiInROShaleqlFLVUPduT6YjrjLUzZGJjrjqBr09mVKqXtBYG2VpVo6CUVWn\njUtZVg1Mc+jEQhkEzz99Rg8VlVKWo41LKWU52riUUpajjUspZTnauJRSlqONSyllOdq4lFKWo41L\nKWU52riUUpajjUspZTnauJRSlqONSyllOdq4lFKWo41LKWU52riUUpajjUspZTnauJRSlqONSyll\nOdq4lFKWo41LKWU52riUUpajjUspZTkVNi4RGSIi+0XkkIhMuxZF1Q322i5AWYi9tguwmKs2LhHx\nBuYDQ4AuwBgRueNaFGZ99touQFmIvbYLsJiKRlx3A4eNMUeNMXlAMjDc/WUppVT5KmpcAcCJKx5/\nV7RMKaVqTYMK1rt0H24RqYFSaoon1TKztgtw8Ky/I8/hSZ+K5/xr8fx/LxU1rpPAzVc8vpnCUZeD\nMcaz36FSqs6p6FBxG9BJRNqJyHXA/wFWuL8spZQq31VHXMaYfBGZDHwOeAPvGWP2XZPKlFKqHGKM\nS9NYSinlMfTMeTcRkV+LyP+r7TqU5xMRf/H02XAPo42rBolILxH5q4gcA14E9td2TcqziMivRMQu\nIp8U/Xv5D/Af4EcRub+267OKir5VVBUQkduBMUAUcAZYSuEheFht1qU81nzgOeB6YD0wxBizRUQ6\nU3iC92e1WZxV6BxXNYlIAbAJmGSMOVS07Igxpn3tVqY8kYjsNMYEFf2+zxhzxxXrdhhjetZeddah\nh4rVFwmcBjaIyDsich+edV6j8ixXjhRyaq0Ki9MRVw0RkaYUXsc5BhgALAQ+NcasqdXClEcRkcvA\nhaKHjYGLV6xubIzR6RsXaONyAxFpAYwCoowxA2u7HqXqGm1cSinL0TkupZTlaONSSlmONi6llOVo\n41I1TkTiRWRqbdeh6i5tXMod9Bsf5VbauFS1iUisiOwSkZ0isrDEujgR+bJo3Uci0rho+YMisqdo\neVrRsq4islVEdhTt79baeD/K8+npEKpaRKQr8AnwK2PMWRFpDvwPcM4YM0dEWhhjzhZt+yLwgzFm\nvojsBn5jjPleRPyMMVki8jqwxRiTJCINgAbGGD27XJWiIy5VXQOBD4ubkzEms8T6O0VkU1Gjiqbw\nNncA6cACEZnELxf7fwE8LyLPAO20aanyaONS1WUo+9rM4qF8IvC4MaY7hfeDaAxgjHkM+L8U3sdg\ne9HI7AMggsLLYFaLyAA3164sShuXqq71wINFlzkVX+4EvzSzpsBpEWkIjCt+koh0NMZ8aYx5AcgA\n2opIe+CoMWYesBy481q9CWUtekGnqhZjzNcikgCkFV1AvAM4yi8jrhnAVgqb01YKGxnAX0SkE4UN\n7n+NMbtFZBoQIyJ5wPdAwrV7J8pKdHJeKWU5eqiolLIcbVxKKcvRxqWUshxtXEopy9HGpZSyHG1c\nSinL0callLIcbVxKKcv5/+FMC/F20xj5AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%pylab inline\n", "# figsize(5, 3)\n", "ct = pd.crosstab([data.city, data.degree], data['class'])\n", "ct.plot(kind='bar')\n", "ct.T.plot(kind='bar', stacked=True, figsize=(5, 3))\n", "ct" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
classAB
citydegree
Kiev10.20.000000
20.20.000000
London10.00.333333
20.20.000000
Moscow10.40.000000
30.00.666667
\n", "
" ], "text/plain": [ "class A B\n", "city degree \n", "Kiev 1 0.2 0.000000\n", " 2 0.2 0.000000\n", "London 1 0.0 0.333333\n", " 2 0.2 0.000000\n", "Moscow 1 0.4 0.000000\n", " 3 0.0 0.666667" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# если хотим с процентами\n", "pd.crosstab([data.city, data.degree], data['class']).apply(lambda r: r/r.sum(), axis=0)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
lenmean
classABAB
citydegree
Kiev11NaN9.0NaN
21NaN9.0NaN
London1NaN1NaN11.6
21NaN8.8NaN
Moscow12NaN8.7NaN
3NaN2NaN8.3
\n", "
" ], "text/plain": [ " len mean \n", "class A B A B\n", "city degree \n", "Kiev 1 1 NaN 9.0 NaN\n", " 2 1 NaN 9.0 NaN\n", "London 1 NaN 1 NaN 11.6\n", " 2 1 NaN 8.8 NaN\n", "Moscow 1 2 NaN 8.7 NaN\n", " 3 NaN 2 NaN 8.3" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# использование нескольких функций и целевого признака\n", "import numpy as np\n", "pd.crosstab([data.city, data.degree], data['class'], values=data.income, aggfunc=[len, np.mean])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Инструменты:\n", "### Кодировки\n", "Почти любая кодировка делается с помощью **map**" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0 1\n", "1 -1\n", "2 1\n", "3 1\n", "4 -1\n", "5 -1\n", "6 1\n", "7 1\n", "Name: class, dtype: int64" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# словарь для кодировки\n", "dct = {'A': +1, 'B':-1}\n", "data['class'].map(dct) # data.class нельзя, т.к. зарезервированное слово" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0 1\n", "1 -1\n", "2 1\n", "3 1\n", "4 -1\n", "5 -1\n", "6 1\n", "7 1\n", "Name: class, dtype: int64" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# даже если бы не было map-функции\n", "data['class'].apply(lambda x: dct[x])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Инструменты:\n", "### сортировка\n", "\n", "для просмотра таблицы\n", "Очень коварная штука, в смысле индексации (см. data.sort(['city','degree'], inplace=True))" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
cityclassdegreeincomecity_mean_incomecity_degree_code
6KievA19.09.0-0.325058
3KievA29.09.0-0.325058
1LondonB111.610.2-0.325058
2LondonA28.810.2-0.325058
0MoscowA110.28.5-0.888074
7MoscowA17.28.5-0.888074
4MoscowB36.68.5-0.888074
5MoscowB310.08.5-0.888074
\n", "
" ], "text/plain": [ " city class degree income city_mean_income city_degree_code\n", "6 Kiev A 1 9.0 9.0 -0.325058\n", "3 Kiev A 2 9.0 9.0 -0.325058\n", "1 London B 1 11.6 10.2 -0.325058\n", "2 London A 2 8.8 10.2 -0.325058\n", "0 Moscow A 1 10.2 8.5 -0.888074\n", "7 Moscow A 1 7.2 8.5 -0.888074\n", "4 Moscow B 3 6.6 8.5 -0.888074\n", "5 Moscow B 3 10.0 8.5 -0.888074" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# сортировка по определённым значениям\n", "data.sort_values(['city','degree']) # раньше - sort" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }