19.11.2022, 13:26 11. Библиотека pandas. Продолжение - Jupyter Notebook
In [22]: regs.head(3) Out[22]:
|
|
|
total |
invalid |
valid |
Zh |
Zu |
Mi |
Pr |
Pu |
|
|
region |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Алтайский |
1961328.0 |
12004.0 |
1163426.0 |
97961.0 |
261665.0 |
45883.0 |
83778.0 |
674139.0 |
|
|
край |
|
|
|
|
|
|
|
|
|
|
Амурская |
662320.0 |
4708.0 |
394996.0 |
39717.0 |
67433.0 |
13594.0 |
23070.0 |
251182.0 |
|
|
область |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
Архангельская |
988678.0 |
5522.0 |
569492.0 |
51169.0 |
91648.0 |
33223.0 |
60108.0 |
333344.0 |
|
|
|
область |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Теперь добавим столбец с явкой в процентах:
In [23]:
regs["turnout_perc"] = regs.turnout / regs.total * 100
In [24]: regs.head(3) Out[24]:
|
|
|
total |
invalid |
valid |
Zh |
Zu |
Mi |
Pr |
Pu |
|
|
region |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Алтайский |
1961328.0 |
12004.0 |
1163426.0 |
97961.0 |
261665.0 |
45883.0 |
83778.0 |
674139.0 |
|
|
край |
|
|
|
|
|
|
|
|
|
|
Амурская |
662320.0 |
4708.0 |
394996.0 |
39717.0 |
67433.0 |
13594.0 |
23070.0 |
251182.0 |
|
|
область |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
Архангельская |
988678.0 |
5522.0 |
569492.0 |
51169.0 |
91648.0 |
33223.0 |
60108.0 |
333344.0 |
|
|
|
область |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Осталось проделать аналогичные операции для голосов за разных кандидатов. Но повторять одно и то же пять раз не хочется (а что бы мы делали, если бы кандидатов было больше?). Давайте напишем функцию, которая будет принимать на вход столбец, делить все его значения на значения из столбца turnout и переводить все в проценты.
In [25]:
def to_perc(x):
return x / regs.turnout * 100
А теперь выберем из базы данных столбцы с голосами за кандидатов и применим к ним нашу функцию.
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/11. Библиотека pandas. Продолжение.ipynb |
11/19 |
19.11.2022, 13:26 11. Библиотека pandas. Продолжение - Jupyter Notebook
In [26]:
perc = regs[['Zh' ,'Zu', 'Mi', 'Pr', 'Pu']].apply(to_perc, axis = 0) # axis = 0 - по столбц
In [27]: perc.head(3) Out[27]:
|
Zh |
Zu |
Mi |
Pr |
Pu |
region |
|
|
|
|
|
|
|
|
|
|
|
Алтайский край |
8.334056 |
22.261215 |
3.903508 |
7.127434 |
57.352543 |
Амурская область |
9.936603 |
16.870734 |
3.401017 |
5.771771 |
62.842003 |
Архангельская область |
8.898740 |
15.938395 |
5.777772 |
10.453311 |
57.971458 |
Нужно переименовать столбцы в базе perc . Давайте сделаем это по-умному: возьмем названия столбцов в perc и приклеим к ним часть с _perc , чтобы названия столбцов с показателями в процентах отличались от показателей в абсолютных числах.
In [28]:
old_cols = list(perc.columns) old_cols
Out[28]:
['Zh', 'Zu', 'Mi', 'Pr', 'Pu']
In [29]:
new_cols = [x + "_perc" for x in old_cols] new_cols
Out[29]:
['Zh_perc', 'Zu_perc', 'Mi_perc', 'Pr_perc', 'Pu_perc']
In [30]:
perc.columns = new_cols
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/11. Библиотека pandas. Продолжение.ipynb |
12/19 |
19.11.2022, 13:26 11. Библиотека pandas. Продолжение - Jupyter Notebook
In [31]: perc.head(3) Out[31]:
|
Zh_perc |
Zu_perc |
Mi_perc |
Pr_perc |
Pu_perc |
region |
|
|
|
|
|
|
|
|
|
|
|
Алтайский край |
8.334056 |
22.261215 |
3.903508 |
7.127434 |
57.352543 |
Амурская область |
9.936603 |
16.870734 |
3.401017 |
5.771771 |
62.842003 |
Архангельская область |
8.898740 |
15.938395 |
5.777772 |
10.453311 |
57.971458 |
Ура! Последний аккорд: соединим нашу таблицу regs с таблицей perc , чтобы все показатели были в одном месте. Способов объединять датафреймы много, но давайте обсудим их в следующий раз. А пока просто склеим две таблицы по столбцам с помощью метода .concat() .
In [32]:
final = pd.concat([regs, perc], axis = 1) # axis = 1 - по столбцам
In [33]: final.head() Out[33]:
|
|
|
total |
invalid |
valid |
|
Zh |
Zu |
Mi |
Pr |
Pu |
|
|
region |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Алтайский |
1961328.0 |
12004.0 |
1163426.0 |
97961.0 |
261665.0 |
45883.0 |
83778.0 |
674139.0 |
|
|
|
край |
|
|
|
|
|
|
|
|
|
|
|
Амурская |
662320.0 |
4708.0 |
394996.0 |
39717.0 |
67433.0 |
13594.0 |
23070.0 |
251182.0 |
|
|
|
область |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Архангельская |
988678.0 |
5522.0 |
569492.0 |
51169.0 |
91648.0 |
33223.0 |
60108.0 |
333344.0 |
||
|
|
область |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Астраханская |
769608.0 |
5107.0 |
427496.0 |
21918.0 |
67662.0 |
18595.0 |
21873.0 |
297448.0 |
||
|
|
область |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Белгородская |
1210590.0 |
10209.0 |
889764.0 |
59561.0 |
211079.0 |
35601.0 |
49807.0 |
533716.0 |
||
|
|
область |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Приличную базу мы получили, можно перейти к чему-то более содержательному.
Еще немного про визуализацию данных
В прошлый раз мы познакомились с тем, как строить графики для переменных в базе данных. Мы уже обсудили два типа графиков для количественных данных: гистограмму и ящик с усами. Давайте посмотрим на диаграммы рассеяния ‒ графики, которые позволяют увидеть совместное распределение пары количественных показателей.
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/11. Библиотека pandas. Продолжение.ipynb |
13/19 |
19.11.2022, 13:26 |
11. Библиотека pandas. Продолжение - Jupyter Notebook |
In [34]:
import matplotlib # загружаем библиотеку для графиков
In [36]:
%matplotlib inline
Атеперь сама диаграмма рассеяния (scatterplot) для показателей явка в процентах и процент за Зюганова:
In [37]:
final.plot.scatter('turnout_perc', 'Zu_perc')
Out[37]:
<matplotlib.axes._subplots.AxesSubplot at 0x7ffb577007f0>
Можем привести график в порядок. Добавить заголовок и подписи к осям, плюс, изменить цвет точек. Для этого основной график сохраним в переменную ax , а затем применим к ней методы, которые отвечают за добавление заголовка и названиям осей x и y.
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/11. Библиотека pandas. Продолжение.ipynb |
14/19 |
19.11.2022, 13:26 11. Библиотека pandas. Продолжение - Jupyter Notebook
In [38]:
ax = final.plot.scatter('turnout_perc', 'Zu_perc', color = "magenta") # цвет magenta ax.set_title('Scatterplot') # заголовок для объекта ax
ax.set_xlabel('turnout rate (%)') # подпись для оси x ax.set_ylabel('votes for Zuganov (%)') # подпись для оси y
Out[38]:
<matplotlib.text.Text at 0x7ffb573f9320>
По графику видно, что, в целом, чем выше явка, тем ниже процент голосов за Зюганова. Углубляться в разные настройки графиков и в статистику не будем, но познакомимся с примером графика средствами библиотеки pandas. Построим матрицу диаграмм рассеяния (scatterplot matrix), сетку с диаграммами рассеяния для всех пар показателей.
Логично будет строить такой график для переменных в базе perc , поскольку правильнее смотреть на связи между показателями в процентах.
In [39]:
from pandas.plotting import scatter_matrix # импортируем функцию
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/11. Библиотека pandas. Продолжение.ipynb |
15/19 |
19.11.2022, 13:26 |
11. Библиотека pandas. Продолжение - Jupyter Notebook |
In [40]:
scatter_matrix(perc, diagonal='hist', figsize=(10, 10)) # строим график
Out[40]:
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7ffb5737ceb8>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb5731c8d0>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb572e9da0>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb572ab518>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb5727a940>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x7ffb571be278>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb5718a2b0>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb57142b70>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb57116588>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb570d59b0>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x7ffb570a0e80>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb570657f0>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb57033cf8>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb56fc9400>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb56f43a20>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x7ffb56f11d30>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb56ed4780>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb56ea1a90>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb56e655f8>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb56e34550>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x7ffb56df6438>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb56d44588>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb56d08278>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb56cd3748>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb56c9b0b8>]],
dtype=object)
|
|
|
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/11. Библиотека pandas. Продолжение.ipynb |
16/19 |
|
19.11.2022, 13:26 |
11. Библиотека pandas. Продолжение - Jupyter Notebook |
|
|
|
|
|
|
|
|
|
|
Аргумент diagonal отвечает за тип графика, который будет находиться на диагонали (в нашем случае гистограмма ‒ 'hist' ), а аргумент figsize ‒ за размер графика (по горизонтали и по вертикали). На диагоналях также можно построить сглаженные графики плотности распределения показателей:
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/11. Библиотека pandas. Продолжение.ipynb |
17/19 |
19.11.2022, 13:26 |
11. Библиотека pandas. Продолжение - Jupyter Notebook |
In [41]:
scatter_matrix(perc, diagonal='kde', figsize=(10, 10)) # kde - от kernel density estimation
Out[41]:
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7ffb56a8c7b8>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb56a6f160>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb55a2a860>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb559e49b0>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb559afcc0>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x7ffb55976710>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb558c2748>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb5588a0f0>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb55857518>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb5581a7b8>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x7ffb557e7cc0>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb557ae5f8>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb557779e8>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb556bc438>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb5568a828>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x7ffb55699e80>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb55619668>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb555e8978>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb50cda3c8>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb50ca56d8>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x7ffb56dc7e10>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb50c16908>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb50bdb9b0>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb50b27eb8>, <matplotlib.axes._subplots.AxesSubplot object at 0x7ffb50aeb7f0>]],
dtype=object)
|
|
|
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/11. Библиотека pandas. Продолжение.ipynb |
18/19 |
|
19.11.2022, 13:26 |
11. Библиотека pandas. Продолжение - Jupyter Notebook |
|
|
|
|
|
|
|
На этом пока всё.
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/11. Библиотека pandas. Продолжение.ipynb |
19/19 |
