Анализ данных с помощью pandas. Часть 2: Выбор данных и нахождение наиболее частых жалоб

В этой части мы будем использовать новый набор данных, чтобы показать, как быть с большими объёмами данных. Это данные о 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 KeyCreated DateClosed DateAgencyAgency NameComplaint TypeDescriptorLocation TypeIncident ZipIncident Address...Bridge Highway NameBridge Highway DirectionRoad RampBridge Highway SegmentGarage Lot NameFerry DirectionFerry Terminal NameLatitudeLongitudeLocation
02658965110/31/2013 02:08:41 AMNaNNYPDNew York City Police DepartmentNoise - Street/SidewalkLoud TalkingStreet/Sidewalk1143290-03 169 STREET...NaNNaNNaNNaNNaNNaNNaN40.708275-73.791604(40.70827532593202, -73.79160395779721)
12659369810/31/2013 02:01:04 AMNaNNYPDNew York City Police DepartmentIllegal ParkingCommercial Overnight ParkingStreet/Sidewalk1137858 AVENUE...NaNNaNNaNNaNNaNNaNNaN40.721041-73.909453(40.721040535628305, -73.90945306791765)
22659413910/31/2013 02:00:24 AM10/31/2013 02:40:32 AMNYPDNew York City Police DepartmentNoise - CommercialLoud Music/PartyClub/Bar/Restaurant100324060 BROADWAY...NaNNaNNaNNaNNaNNaNNaN40.843330-73.939144(40.84332975466513, -73.93914371913482)
32659572110/31/2013 01:56:23 AM10/31/2013 02:21:48 AMNYPDNew York City Police DepartmentNoise - VehicleCar/Truck HornStreet/Sidewalk10023WEST 72 STREET...NaNNaNNaNNaNNaNNaNNaN40.778009-73.980213(40.7780087446372, -73.98021349023975)
42659093010/31/2013 01:53:44 AMNaNDOHMHDepartment of Health and Mental HygieneRodentCondition Attracting RodentsVacant Lot10027WEST 124 STREET...NaNNaNNaNNaNNaNNaNNaN40.807691-73.947387(40.80769092704951, -73.94738703491433)

5 rows × 52 columns

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

Чтобы выбрать столбец, мы берём имя столбца в качестве индекса (как в словаре), например так:

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[['Complaint Type', 'Borough']]
Out[6]:
Complaint TypeBorough
0Noise - Street/SidewalkQUEENS
1Illegal ParkingQUEENS
2Noise - CommercialMANHATTAN
3Noise - VehicleMANHATTAN
4RodentMANHATTAN
5Noise - CommercialQUEENS
6Blocked DrivewayQUEENS
7Noise - CommercialQUEENS
8Noise - CommercialMANHATTAN
9Noise - CommercialBROOKLYN
10Noise - House of WorshipBROOKLYN
11Noise - CommercialMANHATTAN
12Illegal ParkingMANHATTAN
13Noise - VehicleBRONX
14RodentBROOKLYN
15Noise - House of WorshipMANHATTAN
16Noise - Street/SidewalkSTATEN ISLAND
17Illegal ParkingBROOKLYN
18Street Light ConditionBROOKLYN
19Noise - CommercialMANHATTAN
20Noise - House of WorshipBROOKLYN
21Noise - CommercialMANHATTAN
22Noise - VehicleQUEENS
23Noise - CommercialBROOKLYN
24Blocked DrivewaySTATEN ISLAND
25Noise - Street/SidewalkSTATEN ISLAND
26Street Light ConditionBROOKLYN
27Harboring Bees/WaspsMANHATTAN
28Noise - Street/SidewalkMANHATTAN
29Street Light ConditionSTATEN ISLAND
.........
111039Noise - CommercialMANHATTAN
111040Noise - CommercialMANHATTAN
111041NoiseBROOKLYN
111042Noise - Street/SidewalkMANHATTAN
111043Noise - CommercialBROOKLYN
111044Noise - Street/SidewalkMANHATTAN
111045Water SystemMANHATTAN
111046NoiseBROOKLYN
111047Illegal ParkingQUEENS
111048Noise - Street/SidewalkMANHATTAN
111049Noise - CommercialBROOKLYN
111050NoiseMANHATTAN
111051Noise - CommercialMANHATTAN
111052Water SystemMANHATTAN
111053Derelict VehiclesQUEENS
111054Noise - Street/SidewalkBROOKLYN
111055Noise - CommercialBROOKLYN
111056Street Sign - MissingQUEENS
111057NoiseMANHATTAN
111058Noise - CommercialBROOKLYN
111059Noise - Street/SidewalkMANHATTAN
111060NoiseMANHATTAN
111061Noise - CommercialQUEENS
111062Water SystemMANHATTAN
111063Water SystemMANHATTAN
111064Maintenance or FacilityBROOKLYN
111065Illegal ParkingQUEENS
111066Noise - Street/SidewalkMANHATTAN
111067Noise - CommercialBROOKLYN
111068Blocked DrivewayBROOKLYN

111069 rows × 2 columns

Посмотрим первые 10 строк:

In [7]:
complaints[['Complaint Type', 'Borough']][:10]
Out[7]:
Complaint TypeBorough
0Noise - Street/SidewalkQUEENS
1Illegal ParkingQUEENS
2Noise - CommercialMANHATTAN
3Noise - VehicleMANHATTAN
4RodentMANHATTAN
5Noise - CommercialQUEENS
6Blocked DrivewayQUEENS
7Noise - CommercialQUEENS
8Noise - CommercialMANHATTAN
9Noise - CommercialBROOKLYN

Какой самый частый тип жалобы?

Это очень простой вопрос для 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]:

Для вставки кода на Python в комментарий заключайте его в теги <pre><code class="python3">Ваш код</code></pre>
Опечатка в тексте:
Послать сообщение об ошибке автору?