В этом разделе мы будем использовать обновлённый набор данных, чтобы научиться работать с большими объёмами информации. Рассматриваемые данные касаются обращений (или жалоб) жителей по номеру 311. Этот массив представлен ресурсом NYC Open Data; скачать данные.

In [1]:
%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt

plt.style.use('ggplot')

plt.rcParams['figure.figsize'] = (10, 5)
In [2]:
complaints = pd.read_csv('data/311-service-requests.csv')
/usr/local/lib/python3.5/dist-packages/IPython/core/interactiveshell.py:2717: DtypeWarning: Columns (8) have mixed types. Specify dtype option on import or set low_memory=False.
  interactivity=interactivity, compiler=compiler, result=result)

В некоторых версиях pandas может появляться предупреждение "DtypeWarning: Columns (8) have mixed types". Это говорит о том, что pandas испытывает трудности с интерпретацией данных. Вероятно, в одной из колонок встречаются записи как текстового, так и числового типа.

На данном этапе мы охотно проигнорируем данное предупреждение, надеясь избежать последствий, но в дальнейшем стоит его исследовать или исправить.

Что за объект? (краткий обзор)

При выводе крупного dataframe отображаются лишь первые несколько строк данных.

Чтобы вывести первые 5 строк dataframe, можно использовать срез: df[:5].

In [3]:
complaints[:5]
Out[3]:
Unique Key Created Date Closed Date Agency Agency Name Complaint Type Descriptor Location Type Incident Zip Incident Address ... Bridge Highway Name Bridge Highway Direction Road Ramp Bridge Highway Segment Garage Lot Name Ferry Direction Ferry Terminal Name Latitude Longitude Location
0 26589651 10/31/2013 02:08:41 AM NaN NYPD New York City Police Department Noise - Street/Sidewalk Loud Talking Street/Sidewalk 11432 90-03 169 STREET ... NaN NaN NaN NaN NaN NaN NaN 40.708275 -73.791604 (40.70827532593202, -73.79160395779721)
1 26593698 10/31/2013 02:01:04 AM NaN NYPD New York City Police Department Illegal Parking Commercial Overnight Parking Street/Sidewalk 11378 58 AVENUE ... NaN NaN NaN NaN NaN NaN NaN 40.721041 -73.909453 (40.721040535628305, -73.90945306791765)
2 26594139 10/31/2013 02:00:24 AM 10/31/2013 02:40:32 AM NYPD New York City Police Department Noise - Commercial Loud Music/Party Club/Bar/Restaurant 10032 4060 BROADWAY ... NaN NaN NaN NaN NaN NaN NaN 40.843330 -73.939144 (40.84332975466513, -73.93914371913482)
3 26595721 10/31/2013 01:56:23 AM 10/31/2013 02:21:48 AM NYPD New York City Police Department Noise - Vehicle Car/Truck Horn Street/Sidewalk 10023 WEST 72 STREET ... NaN NaN NaN NaN NaN NaN NaN 40.778009 -73.980213 (40.7780087446372, -73.98021349023975)
4 26590930 10/31/2013 01:53:44 AM NaN DOHMH Department of Health and Mental Hygiene Rodent Condition Attracting Rodents Vacant Lot 10027 WEST 124 STREET ... NaN NaN NaN NaN NaN NaN NaN 40.807691 -73.947387 (40.80769092704951, -73.94738703491433)

Выделение строк и столбцов

Чтобы выбрать определённый столбец, его название можно использовать как индекс (подобно ключу в словаре). Пример:

In [4]:
complaints['Complaint Type'][:5]
Out[4]:
0    Noise - Street/Sidewalk
1            Illegal Parking
2         Noise - Commercial
3            Noise - Vehicle
4                     Rodent
Name: Complaint Type, dtype: object

Это работает независимо от порядка действия - можно взять как первые 5 строк определённого столбца, так и столбец из первых 5 строк.

In [5]:
complaints[:5]['Complaint Type']
Out[5]:
0    Noise - Street/Sidewalk
1            Illegal Parking
2         Noise - Commercial
3            Noise - Vehicle
4                     Rodent
Name: Complaint Type, dtype: object

Выбор нескольких столбцов

Что, если мы заинтересованы только в типе жалобы и районе? Остальные данные для нас неактуальны. С помощью Pandas можно легко выделить подмножество столбцов, используя список их названий.

In [6]:
complaints[:5][['Complaint Type', 'Borough']]
Out[6]:
Complaint Type Borough
0 Noise - Street/Sidewalk QUEENS
1 Illegal Parking QUEENS
2 Noise - Commercial MANHATTAN
3 Noise - Vehicle MANHATTAN
4 Rodent MANHATTAN

Рассмотрим первые 10 записей:

In [7]:
complaints[['Complaint Type', 'Borough']][:10]
Out[7]:
Complaint Type Borough
0 Street/Sidewalk Noise QUEENS
1 Unauthorized Parking QUEENS
2 Commercial Noise MANHATTAN
3 Vehicle Noise MANHATTAN
4 Rodent Issue MANHATTAN
5 Commercial Noise QUEENS
6 Driveway Obstruction QUEENS
7 Commercial Noise QUEENS
8 Commercial Noise MANHATTAN
9 Commercial Noise BROOKLYN

Какой вид жалобы встречается чаще всего?

Насколько просто решить эту задачу с pandas! Применим метод .value_counts() для анализа:

In [8]:
complaints['Complaint Type'].value_counts()
Out[8]:
HEATING                                 14200
GENERAL CONSTRUCTION                     7471
Street Light Condition                   7117
DOF Literature Request                   5797
PLUMBING                                 5373
PAINT - PLASTER                          5149
Blocked Driveway                         4590
NONCONST                                 3998
Street Condition                         3473
Illegal Parking                          3343
Noise                                    3321
Traffic Signal Condition                 3145
Dirty Conditions                         2653
Water System                             2636
Noise - Commercial                       2578
ELECTRIC                                 2350
Broken Muni Meter                        2070
Noise - Street/Sidewalk                  1928
Sanitation Condition                     1824
Rodent                                   1632
Sewer                                    1627
Taxi Complaint                           1227
Consumer Complaint                       1227
Damaged Tree                             1180
Overgrown Tree/Branches                  1083
Missed Collection (All Materials)         973
Graffiti                                  973
Building/Use                              942
Root/Sewer/Sidewalk Condition             836
Derelict Vehicle                          803
                                        ...
Fire Alarm - Modification                   5
Posting Advertisement                       5
Internal Code                               5
Poison Ivy                                  5
Miscellaneous Categories                    5
Ferry Complaint                             4
Transportation Provider Complaint           4
Special Natural Area District (SNAD)        4
Illegal Animal Sold                         4
Illegal Fireworks                           3
Invitation                                  3
Fire Alarm - Replacement                    3
Adopt-A-Basket                              3
Misc. Comments                              2
Legal Services Provider Complaint           2
DFTA Literature Request                     2
Opinion for the Mayor                       2
Public Assembly                             2
Window Guard                                2
Tunnel Condition                            1
Snow                                        1
X-Ray Machine/Equipment                     1
Stalled Sites                               1
Municipal Parking Facility                  1
Open Flame Permit                           1
Trans Fat                                   1
Ferry Permit                                1
DWD                                         1
Highway Sign - Damaged                      1
DHS Income Savings Requirement              1
Name: Complaint Type, dtype: int64

Топ-10 наиболее часто встречающихся жалоб:

In [9]:
complaint_counts = complaints['Complaint Type'].value_counts()
complaint_counts[:10]
Out[9]:
HEATING                   14200
GENERAL CONSTRUCTION       7471
Street Light Condition     7117
DOF Literature Request     5797
PLUMBING                   5373
PAINT - PLASTER            5149
Blocked Driveway           4590
NONCONST                   3998
Street Condition           3473
Illegal Parking            3343
Name: Complaint Type, dtype: int64

Давайте создадим графическое представление данных!

In [10]:
complaint_counts[:10].plot(kind='bar')
Out[10]:
Графическое представление данных

Вопросы для самопроверки:

  1. Как можно выбрать определённый столбец данных используя pandas?
  2. Какой метод используется для подсчёта количества различных значений в столбце?
  3. Что означает предупреждение "DtypeWarning: Columns (8) have mixed types", которое может появиться при загрузке данных?
  4. Как получить первые 5 значений определенного столбца?