1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/it-ebooks-pandas-cookbook-code-notes

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
11.md 29 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 01:15 e628503

Глава 11. Визуализация с помощью Matplotlib, Pandas и Seaborn

В этой главе рассматриваются три темы, ни одна из которых не раскрыта полностью.

In[1]: import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

%matplotlib inline

1. Введение в Matplotlib

Matplotlib предоставляет два способа создания графиков: интерфейс состояний и объектно-ориентированный подход.

# Интерфейс состояний реализуется через модуль pyplot, который отслеживает текущее состояние среды построения графиков.
# Этот метод подходит для быстрого создания простых графиков, но может быть неудобен для сложных графиков и нескольких осей.
 In[2]: x = [-3, 5, 7]
y = [10, 2, 5]

plt.figure(figsize=(15,3))
plt.plot(x, y)
plt.xlim(0, 10)
plt.ylim(-3, 8)
plt.xlabel('X Axis')
plt.ylabel('Y axis')
plt.title('Line Plot')
plt.suptitle('Figure Title', size=20, y=1.03)
Out[2]: Text(0.5,1.03,'Figure Title') 

# Объектно-ориентированный метод более понятен, так как изменения вносятся в конкретный объект.
# Кроме того, код более Pythonic и похож на взаимодействие с Pandas.
 In[3]: fig, ax = plt.subplots(figsize=(15,3))
ax.plot(x, y)
ax.set_xlim(0, 10)
ax.set_ylim(-3, 8)
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_title('Line Plot')
fig.suptitle('Figure Title', size=20, y=1.03)
Out[3]: Text(0.5,1.03,'Figure Title') 

# Функция subplots создаёт фигуру с одним Axes.
 In[4]: fig, ax = plt.subplots(nrows=1, ncols=1) 

# Проверяем тип fig и ax.
 In[5]: type(fig)
Out[5]: matplotlib.figure.Figure

 In[6]: type(ax)
Out[6]: matplotlib.axes._subplots.AxesSubplot 
# Узнаём размер фигуры и увеличиваем его.
 In[7]: fig.get_size_inches()
Out[7]: array([ 6.,  4.])

 In[8]: fig.set_size_inches(14, 4)
        fig
Out[8]: 

# Атрибут axes позволяет получить все Axes фигуры.
 In[9]: fig.axes
Out[9]: [<matplotlib.axes._subplots.AxesSubplot at 0x1134202b0>] 
# Сравниваем первый элемент списка fig.axes с ранее определённым ax.
 In[10]: fig.axes[0] is ax
Out[10]: True 
# Устанавливаем разные уровни серого с использованием чисел с плавающей точкой.
 In[11]: fig.set_facecolor('.9')
         ax.set_facecolor('.7')
         fig
Out[11]: 

# Изучаем дочерние элементы Axes, каждый базовый график имеет четыре spine и два axis.
# Spine — это границы данных, то есть четыре ребра.
# Объекты x и y axis содержат больше элементов графика, таких как шкалы и метки.
 In[12]: ax_children = ax.get_children()
         ax_children         
Out[12]: [<matplotlib.spines.Spine at 0x11145b358>,
          <matplotlib.spines.Spine at 0x11145b0f0>,
          <matplotlib.spines.Spine at 0x11145ae80>,
          <matplotlib.spines.Spine at 0x11145ac50>,
          <matplotlib.axis.XAxis at 0x11145aa90>,
          <matplotlib.axis.YAxis at 0x110fa8d30>,
          ...] 
# Получаем доступ к spines напрямую через атрибут.
>>> spines = ax.spines
>>> spines
OrderedDict([('left', <matplotlib.spines.Spine at 0x11279e320>),
             ('right', <matplotlib.spines.Spine at 0x11279e0b8>),
             ('bottom', <matplotlib.spines.Spine at 0x11279e048>),
             ('top', <matplotlib.spines.Spine at 0x1127eb5c0>)]) 
# Выбираем левый край, изменяем его положение и ширину, делаем нижний край невидимым.
 In[13]: spine_left = spines['left']
         spine_left.set_position(('outward', -100))
         spine_left.set_linewidth(5)

         spine_bottom = spines['bottom']
         spine_bottom.set_visible(False)
         fig
Out[13]: 

# Изменяем свойства с помощью атрибутов xaxis и yaxis или непосредственно через Axes объект.
 In[14]: ax.xaxis.grid(True, which='major', linewidth=2, color='black', linestyle='--')
         ax.xaxis.set_ticks([.2, .4, .55, .93])
         ax.xaxis.set_label_text('X Axis', family='Verdana', fontsize=15)

         ax.set_ylabel('Y Axis', family='Calibri', fontsize=20)
         ax.set_yticks([.1, .9])
         ax.set_yticklabels(['point 1', 'point 9'], rotation=45)
         fig
Out[14]: 

Принцип работы

# Функция plt.subplots возвращает кортеж.
 In[22]: plot_objects = plt.subplots()

 In[23]: type(plot_objects)
Out[23]: tuple

 In[24]: fig = plot_objects[0]
         ax = plot_objects[1] 
# Если создано несколько осей, то второй элемент кортежа представляет собой массив NumPy, содержащий все оси.
 In[25]: plot_objects = plt.subplots(2, 4, figsize=(14, 4)) 

 In[26]: plot_objects[1]
Out[26]: array([[<matplotlib.axes._subplots.AxesSubplot object at 0x113eefa20>, ```
<matplotlib.axes._subplots.AxesSubplot object at 0x113f7ccc0>,
<matplotlib.axes._subplots.AxesSubplot object at 0x11413ed68>,
<matplotlib.axes._subplots.AxesSubplot object at 0x114213e48>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x11424ce80>,
<matplotlib.axes._subplots.AxesSubplot object at 0x1142807b8>,
<matplotlib.axes._subplots.AxesSubplot object at 0x1142b8898>,
<matplotlib.axes._subplots.AxesSubplot object at 0x1142f2898>]], dtype=object)
# Некоторые свойства и эквивалентные им методы get
In[27]: fig.get_axes() == fig.axes
Out[27]: True

In[29]: fig.axes == fig.get_axes()
Out[29]: True

In[30]: ax.xaxis == ax.get_xaxis()
Out[30]: True

In[31]: ax.yaxis == ax.get_yaxis()
Out Out[31]: True

Больше

# Запрос всех свойств xaxis
In[15]: ax.xaxis.properties()
Out[15]: 
{'agg_filter': None,
'alpha': None,
'animated': False,
'children': [Text(0.5,22.2,'X Axis'),
Text(1,23.2,''),
<matplotlib.axis.XTick at 0x113371fd0>,
<matplotlib.axis.XTick at 0x113514240>,
<matplotlib.axis.XTick at 0x1136387b8>,
<matplotlib.axis.XTick at 0x113638f60>],
'clip_box': TransformedBbox(Bbox([[0.0, 0.0], [1.0, 1.0]]), CompositeGenericTransform(CompositeGenericTransform(BboxTransformTo(Bbox([[0.0, 0.0], [1.0, 1.0]])), Affine2D(array([[ 1.,  0.,  0.],
        [ 0.,  1.,  0.],
        [ 0.,  0.,  1.]]))), BboxTransformTo(TransformedBbox(Bbox([[0.125, 0.125], [0.9, 0.88]]), BboxTransformTo(TransformedBbox(Bbox([[0.0, 0.0], [14.0, 4.0]]), Affine2D(array([[ 72.,   0.,   0.],
        [  0.,  72.,   0.],
        [  0.,   0.,   1.]])))))))),
'clip_on': True,
'clip_path': None,
'contains': None,
'data_interval': array([ inf, -inf]),
'figure': <matplotlib.figure.Figure at 0x11332abe0>,
'gid': None,
'gridlines': <a list of 4 Line2D gridline objects>,
'label': Text(0.5,22.2,'X Axis'),
'label_position': 'bottom',
'label_text': 'X Axis',
'major_formatter': <matplotlib.ticker.ScalarFormatter at 0x113543780>,
'major_locator': <matplotlib.ticker.FixedLocator at 0x113648ba8>,
'major_ticks': [<matplotlib.axis.XTick at 0x113371fd0>,
<matplotlib.axis.XTick at 0x113514240>,
<matplotlib.axis.XTick at 0x1136387b8>,
<matplotlib.axis.XTick at 0x113638f60>],
'majorticklabels': <a list of 4 Text major ticklabel objects>,
'majorticklines': <a list of 8 Line2D ticklines objects>,
'majorticklocs': array([ 0.2 ,  0.4 ,  0.55,  0.93]),
'minor_formatter': <matplotlib.ticker.NullFormatter at 0x11341a518>,
'minor_locator': <matplotlib.ticker.NullLocator at 0x113624198>,
'minor_ticks': [],
'minorticklabels': <a list of 0 Text minor ticklabel objects>,
'minorticklines': <a list of 0 Line2D ticklines objects>,
'minorticklocs': [],
'minpos': inf,
'offset_text': Text(1,23.2,''),
'path_effects': [],
'picker': None,
'pickradius': 15,
'rasterized': None,
'scale': 'linear',
'sketch_params': None,
'smart_bounds': False,
'snap': None,
'tick_padding': 3.5,
'tick_space': 26,
'ticklabels': <a list of 4 Text major ticklabel objects>,
'ticklines': <a list of 8 Line2D ticklines objects>,
'ticklocs': array([ 0.2 ,  0.4 ,  0.55,  0.93]),
'ticks_direction': array(['out', 'out', 'out', 'out'],
       dtype='<U3'),
'ticks_position': 'bottom',
'transform': IdentityTransform(),
'transformed_clip_path_and_affine': (None, None),
'units': None,
'url': None,
'view_interval': array([ 0.,  1.]),
'visible': True,
'zorder': 1.5}

2. Визуализация данных с помощью matplotlib

# Чтение набора данных movie, вычисление медианного бюджета по годам, затем вычисление пятилетнего скользящего среднего для сглаживания данных
In[32]: movie = pd.read_csv('data/movie.csv')
med_budget = movie.groupby('title_year')['budget'].median() / 1e6
med_budget_roll = med_budget.rolling(5, min_periods=1).mean()
med_budget_roll.tail()
Out[32]: title_year
         2012.0    20.893
         2013.0    19.893
         2014.0    19.100
         2015.0    17.980
         2016.0    17.780
         Name: budget, dtype: float64
# Преобразование данных в массив NumPy
In[33]: years = med_budget_roll.index.values
years[-5:]
Out[33]: array([ 2012.,  2013.,  2014.,  2015.,  2016.])
``` **Бюджет = med_budget_roll.values**

Бюджет[-5:]  
[20,893; 19,893; 19,1; 17,98; 17,78]

**# plot方法可以用来画线图**

**In[35]: fig, ax = plt.subplots(figsize=(14,4), linewidth=5, edgecolor='.5')**
**ax.plot(years, budget, linestyle='--', linewidth=3, color='.2', label='All Movies')**
**text_kwargs=dict(fontsize=20, family='cursive')**
**ax.set_title('Median Movie Budget', **text_kwargs)**
**ax.set_ylabel('Millions of Dollars', **text_kwargs)**

Out[35]: Текст(0,0.5,'Миллионы долларов')

**# 每年的 кинопроизводство**

**In[36]: movie_count = movie.groupby('title_year')['budget'].count()**
**movie_count.tail()**

title_year
2012.0    191
2013.0    208
2014.0    221
2015.0    192
2016.0     86
Name: budget, dtype: int64

**# На основе предыдущей диаграммы, нарисуем столбчатую диаграмму, показывающую количество фильмов, выпущенных каждый год, так как большинство фильмов были выпущены в последние годы, мы установим начало года на 1970**

**In[37]: ct = movie_count.values**
**ct_norm = ct / ct.max() * budget.max()**

**fifth_year = (years % 5 == 0) & (years >= 1970)**
**years_5 = years[fifth_year]**
**ct_5 = ct[fifth_year]**
**ct_norm_5 = ct_norm[fifth_year]**

**ax.bar(years_5, ct_norm_5, 3, facecolor='.5', alpha=.3, label='Movies per Year')**
**ax.set_xlim(1968, 2017)**
**for x, y, v in zip(years_5, ct_norm_5, ct_5):**
**ax.text(x, y + .5, str(v), ha='center')**
**ax.legend()**
**fig**

**# Найти медианное значение бюджета для первых 10 фильмов каждого года за последние 5 лет**

**In[38]: top10 = movie.sort_values('budget', ascending=False)**
**.groupby('title_year')['budget']**
**.apply(lambda x: x.iloc[:10].median() / 1e6)**

**top10_roll = top10.rolling(5, min_periods=1).mean()**
**top10_roll.tail()**

title_year
2012.0    192,9
2013.0    195,9
2014.0    191,7
2015.0    186,8
2016.0    189,1
Name: бюджет, dtype: float64

**# Построить эти данные на другой диаграмме**

**In[39]: fig2, ax_array = plt.subplots(2, 1, figsize=(14,6), sharex=True)**
**ax1 = ax_array[0]**
**ax2 = ax_array[1]**

**ax1.plot(years, бюджет, linestyle='--', linewidth=3, цвет='.2', метка='Все фильмы')**
**ax1.bar(годы_5, ct_норм_5, 3, лицевая сторона='.5', альфа=.3, метка='Фильмы в год')**
**ax1.легенда(loc='верхний левый')**
**ax1.set_xlim(1968, 2017)**
**plt.setp(ax1.get_xticklines(), видимый=Ложно)**

**для x, y, v в zip(годы_5, ct_норм_5, ct_5):**
**ax1.текст(x, y + .5, ул(v), ха='центр')**

**ax2.plot(годы, топ10_ролл.значения, цвет='.2', метка='Топ-10 фильмов')**
**ax2.легенда(loc='верхний левый')**

**fig2.tight_layout()**
**fig2.suptitle('Медианный бюджет фильма', y=1.02, **text_kwargs)**
**fig2.текст(0, .6, 'Миллионы долларов', вращение='вертикальное', ха='центр', **text_kwargs)**

**импорт ОС**
**путь = os.path.expanduser('~/Desktop/movie_budget.png')**
**fig2.savefig(путь, bbox_inches='tight')**

**# Подтвердить вручную метод rolling**

**In[40]: med_бюджет_ролл.хвост()**

название_год
2012.0 20,893
2013.0 19,893
2014.0 19,100
2015.0 17,980
2016.0 17,780
Имя: бюджет, тип данных: float64

**In[41]: med_бюджет.loc[2012:2016].среднее()**
17.78

**In[42]: med_бюджет.loc[2011:2015].среднее()**
17.98

**In[43]: med_бюджет.loc[2010:2014].среднее()**
19.1

**In[44]: os.path.expanduser('~/Desktop/movie_budget.png')**
'/Users/Ted/Desktop/movie_budget.png'

**# Больше**

**In[45]: cols = ['бюджет', 'название_года', 'imdb_score', 'название фильма']**
**m = фильм[cols].dropna()**

**m['бюджет2'] = m['бюджет'] / 1е6**
**np.random.seed(0)**
**фильм_образец = m.query('название_года >= 2000').образец(100)**

**рис., топор = plt.подзаголовки(размер фигуры=(14,6))** **raise in a subsequent release. Please use .values.reshape(...) instead**

`return getattr(obj, method)(*args, **kwds)`

**Out[63]: Text(0.5, 0.98, '')**

**# 检查超出6个标准偏差的点。用一个DataFrame记录异常点。**

**In[64]:** outliers = flights.iloc[fs[fs['TIME_SCORE'] > 6].index]
outliers = outliers[['AIRLINE', 'ORG_AIR', 'DEST_AIR', 'AIR_TIME', 'DIST', 'ARR_DELAY', 'DIVERTED']]
outliers['PLOT_NUM'] = range(1, len(outliers) + 1)
outliers

**Out[64]**

**# 可以这张表的数据确定异常值。pandas提供了将表格附加于图片底部的方法。**

**In[65]:** ax = fs.plot(x='DIST', y='AIR_TIME', kind='scatter', s=1, figsize=(16, 4), table=outliers)
outliers.plot(x='DIST', y='AIR_TIME', kind='scatter', s=25, ax=ax, grid=True)

outs = outliers[['AIR_TIME', 'DIST', 'PLOT_NUM']]
for t, d, n in outs.itertuples(index=False):
    ax.text(d + 5, t + 5, str(n))

plt.setp(ax.get_xticklabels(), y=.1)
plt.setp(ax.get_xticklines(), visible=False)
ax.set_xlabel('')
ax.set_title('Flight Time vs Distance with Outliers')

**Out[65]: Text(0.5,1,'Flight Time vs Distance with Outliers') **

## **5\. 堆叠面积图,以发现趋势**

**In[66]:** meetup = pd.read_csv('data/meetup_groups.csv', parse_dates=['join_date'], index_col='join_date')
meetup.head()

**Out[66]**

**# 读取meetup_groups数据集**

**In[67]:** group_count = meetup.groupby([pd.Grouper(freq='W'), 'group']).size()
group_count.head()

**Out[67]**

**join_date   group**
2010-11-07  houstonr     5
2010-11-14  houstonr    11
2010-11-21  houstonr     2
2010-12-05  houstonr     1
2011-01-16  houstonr     2
dtype: int64

**In[68]:** gc2 = group_count.unstack('group', fill_value=0)
gc2.tail()

**Out[68]**

**In[69]:** group_total = gc2.cumsum()
group_total.tail()

**Out[69]**

**In[70]:** row_total = group_total.sum(axis='columns')
group_cum_pct = group_total.div(row_total, axis='index')
group_cum_pt.tail()

**Out[70]**

**In[71]:** ax = group_cum_pct.plot(kind='area', figsize=(18, 4), cmap='Greys', xlim=('2013-6', None), ylim=(0, 1), legend=False)
ax.figure.suptitle('Houston Meetup Groups', size=25)
ax.set_xlabel('')
ax.yaxis.tick_right()

plot_kwargs = dict(xycoords='axes fraction', size=15)
ax.annotate(xy=(.1, .7), s='R Users', color='w', **plot_kwargs)
ax.annotate(xy=(.25, .16), s='Data Visualization', color='k', **plot_kwargs)
ax.annotate(xy=(.5, .55), s='Energy Data Science', color='k', **plot_kwargs)
ax.annotate(xy=(.83, .07), s='Data Science', color='k', **plot_kwargs)
ax.annotate(xy=(.86, .78), s='Machine Learning', color='w', **plot_kwargs)

**Out[71]: Text(0.86,0.78,'Machine Learning') **

**In[72]:** pie_data = group_cum_pct.asfreq('3MS', method='bfill').tail(6).to_period('M').T
pie_data

**Out[72]**

**In[73]:** from matplotlib.cm import Greys
greys = Greys(np.arange(50,250,40))

ax_array = pie_data.plot(kind='pie', subplots=True, layout=(2,3), labels=None, autopct='%1.0f%%', pctdistance=1.22, colors=greys)
ax1 = ax_array[0, 0]
ax1.figure.legend(ax1.patches, **6. Seaborn и Pandas: различия**

pie_data.index, ncol=3) for ax in ax_array.flatten(): ax.xaxis.label.set_visible(True) ax.set_xlabel(ax.get_ylabel()) ax.set_ylabel('') ax1.figure.subplots_adjust(hspace=.3)


**Рис. 1.**

6. Seaborn和Pandas的不同点

# 读取employee数据集
 In[74]: employee = pd.read_csv('data/employee.csv', 
                                parse_dates=['HIRE_DATE', 'JOB_DATE'])
         employee.head()

Таблица 1.

HIRE_DATE JOB_DATE
0 2015-08-29 NaT
1 2009-03-12 NaT
2 2014-02-22 NaT
3 2013-05-23 NaT
4 2010-07-28 NaT
# 用seaborn画出每个部门的柱状图
 In[75]: import seaborn as sns
 In[76]: sns.countplot(y='DEPARTMENT', data=employee)

Рисунок 2.

# 要是用pandas来做,需要先聚合数据
 In[77]: employee['DEPARTMENT'].value_counts().plot('barh')

Рисунок 3.

# 用seaborn找到每个种族的平均工资
 In[78]: ax = sns.barplot(x='RACE', y='BASE_SALARY', data=employee)
         ax.figure.set_size_inches(16, 4)

Рисунок 4.

# 用pandas来做,需要先按照race分组
 In[79]: avg_sal = employee.groupby('RACE', sort=False)['BASE_SALARY'].mean()
         ax = avg_sal.plot(kind='bar', rot=0, figsize=(16,4), width=.8)
         ax.set_xlim(-.5, 5.5)
         ax.set_ylabel('Mean Salary')

Рисунок 5.

# seaborn还支持在分组内使用第三个参数
 In[80]: ax = sns.barplot(x='RACE', y='BASE_SALARY', hue='GENDER', 
                          data=employee, palette='Greys')
         ax.figure.set_size_inches(16,4)

Рисунок 6.

# pandas则要对race和gender同时分组,并对gender做unstack
 In[81]: employee.groupby(['RACE', 'GENDER'], sort=False)['BASE_SALARY'] \
                 .mean().unstack('GENDER') \
                 .plot(kind='bar', figsize=(16,4), rot=0,
                       width=.8, cmap='Greys')

Рисунок 7.

# 用seaborn话race和gender的盒图
 In[82]: ax = sns.boxplot(x='GENDER', y='BASE_SALARY', data=employee, hue='RACE', palette='Greys')
         ax.figure.set_size_inches(14,4)

Рисунок 8.

# pandas则要为gender创建两个独立的Axes,然后根据race画盒图
 In[83]: fig, ax_array = plt.subplots(1, 2, figsize=(14,4), sharey=True)
         for g, ax in zip(['Female', 'Male'], ax_array):
             employee.query('GENDER== @g') \
                     .boxplot(by='RACE', column='BASE_SALARY', ax=ax, rot=20)
             ax.set_title(g + ' Salary')
             ax.set_xlabel('')
         fig.suptitle('')

Рисунок 9.

# pandas也可以列表分离多个变量,但是画的图不优雅
 In[84]: ax = employee.boxplot(by=['GENDER', 'RACE'], 
                               column='BASE_SALARY', 
                               figsize=(16,4), rot=15)
         ax.figure.suptitle('')

Рисунок 10.

7. Использование Seaborn для многомерного анализа

# 读取employee数据集,创建工龄的列
 In[85]: employee = pd.read_csv('data/employee.csv', 
                                parse_dates=['HIRE_DATE', 'JOB_DATE'])
         days_hired = (pd.to_datetime('12-1-2016') - employee['HIRE_DATE'])

         one_year = pd.Timedelta(1, unit='Y')
         employee['YEARS_EXPERIENCE'] =  days_hired / one_year
         employee[['HIRE_DATE',
``` **YEARS_EXPERIENCE**]]head()

Вывод: данные не предоставлены.

# 画一个基本的带有回归线的散点图
In[86]: import seaborn as sns
In[87]: ax = sns.regplot(x='YEARS_EXPERIENCE', y='BASE_SALARY', data=employee)
         ax.figure.set_size_inches(14,4)
Out[87]: 

Вывод: данные не предоставлены.

# 用regplot的上层函数lmplot,画出不同性别的回归线
In[88]: grid = sns.lmplot(x='YEARS_EXPERIENCE', y='BASE_SALARY', hue='GENDER', palette='Greys', scatter_kws={'s':10}, data=employee)
         grid.fig.set_size_inches(14, 4)
         type(grid)
Out[88]: seaborn.axisgrid.FacetGrid

Вывод: данные не предоставлены.

# 为每个种族创建子图,同时保留回归线
In[89]: grid = sns.lmplot(x='YEARS_EXPERIENCE', y='BASE_SALARY', hue='GENDER', col='RACE', col_wrap=3, palette='Greys', sharex=False, line_kws = {'linewidth':5}, data=employee)
         grid.set(ylim=(20000, 120000))
Out[89]: <seaborn.axisgrid.FacetGrid at 0x11e7ce470>

Вывод: данные не предоставлены.

# 将类型值的层级减小到二,将部门的层级减小到三
In[90]: deps = employee['DEPARTMENT'].value_counts().index[:2]
         races = employee['RACE'].value_counts().index[:3]
         is_dep = employee['DEPARTMENT'].isin(deps)
         is_race = employee['RACE'].isin(races)
         emp2 = employee[is_dep & is_race].copy()
         emp2['DEPARTMENT'] = emp2.DEPARTMENT.str.extract('(HPD|HFD)', expand=True)
         emp2.shape
Out[90]: (968, 11)

In[91]: emp2['DEPARTMENT'].value_counts()
Out[91]: HPD    591
         HFD    377
         Name: DEPARTMENT, dtype: int64

In[92]: emp2['RACE'].value_counts()
Out[92]: White                        478
         Hispanic/Latino              250
         Black or African American    240
         Name: RACE, dtype: int64

Вывод: данные не предоставлены.

# 用Axe слой функции, например violinplot, чтобы нарисовать распределение опыта работы и пола
In[93]: ax = sns.violinplot(x = 'YEARS_EXPERIENCE', y='GENDER', data=emp2)
         ax.figure.set_size_inches(10,4)
Out[93]:

Вывод: данные не предоставлены.

# 用factorplot函数,为每个部门和种族的组合画图
In[94]: sns.factorplot(x ='YEARS_EXPERIENCE', y='GENDER',
                        col='RACE', row='DEPARTMENT', size=3, aspect=2,
                        data=emp2, kind='violin')
Out[94]: <seaborn.axisgrid.FacetGrid at 0x11e40ec50>

Вывод: данные не предоставлены.

8. Использование Seaborn для решения парадокса Симпсона на примере набора данных diamonds

In[95]: pd.DataFrame(index=['Student A', 'Student B'],
                      data={'Raw Score': ['50/100', '80/100'],
                            'Percent Correct':[50,80]}, columns=['Raw Score', 'Percent Correct'])
Out[95]:

Вывод:

Student Raw Score Percent Correct
A 50/100 50
B 80/100 80
In[96]: pd.DataFrame(index=['Student A', 'Student B'],
                      data={'Difficult': ['45/95', '2/5'],
                            'Easy': ['5/5', '78/95'],
                            'Difficult Percent': [47, 40],
                            'Easy Percent' : [100, 82],
                            'Total Percent':[50, 80]},
                      columns=['Difficult', 'Easy', 'Difficient Percent', 'Easy Percent', 'Total Percent'])
Out[96]:

Вывод:

Student Difficult Easy Difficult Percent Easy Percent Total Percent
A 45/95 5/5 47 100 50
B 2/5 78/95 40 82 80
# Чтение набора данных diamonds
In[97]: diamonds = pd.read_csv('data/diamonds.csv')
         diamonds.head()
Out[97]:

Вывод:

carat cut color clarity depth table price x y z
0.23 Good E VS2 61.5 55 326 3.95 3.98 2.43
0.21 Good G VS1 59.8 61 334 3.89 3.84 2.31
0.23 Very Good F VVS2 62.5 56 398 4.05 4.07 2.31
0.29 Premium D SI2 63.3 58 369 4.20 4.23 2.63
0.31 Good J SI1 63.0 57 385 4.34 4.35 2.75
# Преобразование столбцов cut, color и clarity в упорядоченные типы
In[98]: cut_cats = ['Fair', 'Good', 'Very Good', 'Premium', 'Ideal']
         color_cats = ['J', 'I', 'H', 'G', 'F', 'E', 'D']
         clarity_cats = ['I1', 'SI2', 'SI1', 'VS2', 'VS1', 'VVS2', 'VVS1', 'IF']
         diamonds['cut'] = pd.Categorical(diamonds['cut'], categories=cut_cats, ordered=True)

         diamonds['color'] = pd.Categorical(diamonds['color'], categories=color_cats,
``` **Код на языке Python:**

ordered = True)

diamonds['clarity'] = pd.Categorical(diamonds['clarity'],
                                    categories=clarity_cats, 
                                    ordered=True)

In[99]: fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(14,4)) sns.barplot(x='color', y='price', data=diamonds, ax=ax1) sns.barplot(x='cut', y='price', data=diamonds, ax=ax2) sns.barplot(x='clarity', y='price', data=diamonds, ax=ax3) fig.suptitle('Price Decreasing with Increasing Quality?') Out[98]: Text(0.5,0.98,'Price Decreasing with Increasing Quality?')


**Рисунки:**

Рисунок 1:

Не удалось определить, что изображено на рисунке.

```py
# 画出每种钻石颜色和价格的关系
In[100]: sns.factorplot(x='color', y='price', col='clarity',
                       col_wrap=4, data=diamonds, kind='bar')
Out[100]: <seaborn.axisgrid.FacetGrid at 0x11b61d5f8> 

Рисунок 2:

Не удалось определить, что изображено на рисунке.

# 用克拉值取代价格
In[101]: sns.factorplot(x='color', y='carat', col='clarity',
                       col_wrap=4, data=diamonds, kind='bar')
Out[101]: <seaborn.axisgrid.FacetGrid at 0x11e42eef0> 

Рисунок 3:

Не удалось определить, что изображено на рисунке.

In[102]: fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(14,4))
      sns.barplot(x='color', y='carat', data=diamonds, ax=ax1)
      sns.barplot(x='cut', y='carat', data=diamonds, ax=ax2)
      sns.barplot(x='clarity', y='carat', data=diamonds, ax=ax3)
      fig.suptitle('Diamond size decreases with quality')
Out[102]: Text(0.5,0.98,'Diamond size decreases with quality') 

Рисунок 4:

Не удалось определить, что изображено на рисунке.

# 下图显示钻石越大,价格越高
In[103]: diamonds['carat_category'] = pd.qcut(diamonds.carat, 5)

      from matplotlib.cm import Greys
      greys = Greys(np.arange(50,250,40))

      g = sns.factorplot(x='clarity', y='price', data=diamonds,
                         hue='carat_category', col='color', 
                         col_wrap=4, kind='point') #, palette=greys)
      g.fig.suptitle('Diamond price by size, color and clarity',
                     y=1.02, size=20)
Out[103]: Text(0.5,1.02,'Diamond price by size, color and clarity') 

Рисунок 5:

Не удалось определить, что изображено на рисунке.

# 用seaborn更高级的PairGrid构造器,对二元变量作图
In[104]: g = sns.PairGrid(diamonds,size=5,
                           x_vars=["color", "cut", "clarity"],
                           y_vars=["price"])
      g.map(sns.barplot)
      g.fig.suptitle('Replication of Step 3 with PairGrid', y=1.02)
Out[104]: Text(0.5,1.02,'Replication of Step 3 with PairGrid') 

Рисунок 6:

Не удалось определить, что изображено на рисунке.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/it-ebooks-pandas-cookbook-code-notes.git
git@api.gitlife.ru:oschina-mirror/it-ebooks-pandas-cookbook-code-notes.git
oschina-mirror
it-ebooks-pandas-cookbook-code-notes
it-ebooks-pandas-cookbook-code-notes
master