Шаг 115.
Python: сборник рецептов.
Кодирование и обработка данных. Суммирование данных и обсчет статистики

    На этом шаге мы продемонстрируем некоторые возможности библиотеки Pandas.

Задача

    Вам нужно обработать большие наборы данных и сгенерировать суммы или какую-то другую статистику.

Решение

    Для любого анализа данных с использованием статистики, временных рядов и прочих подобных приемов вам стоит обратиться к библиотеке Pandas.


http://pandas.pydata.org/.

    Вот пример использования Pandas для анализа городской базы крыс и грызунов Чикаго. Данный CSV-файл содержал около 74 000 записей:

>>> import pandas
>>> # Прочесть CSV-файл, пропустив последнюю строку 
>>> rats = pandas.read_csv('rats.csv', skip_footer=1)
>>> rats
<class 'pandas.core.frame.DataFrame'>
Int64Index: 74055 entries, 0 to 74054 
Data columns:
Creation Date			74055	non-null	values
Status				74055	non-null	values
Completion Date			72154	non-null	values
Service Request Number		74055	non-null	values
Type of Service Request		74055	non-null	values
Number of Premises Baited	65804	non-null	values
Number of Premises with	Garbage	65600	non-null	values
Number of Premises with	Rats	65752	non-null	values
Current Activity		66041	non-null	values
Most Recent Action		66023	non-null	values
Street Address			74055	non-null	values
ZIP Code			73584	non-null	values
X Coordinate			74043	non-null	values
Y Coordinate			74043	non-null	values
Ward				74044	non-null	values
Police District			74044	non-null	values
Community Area			74044	non-null	values
Latitude			74043	non-null	values
Longitude			74043	non-null	values
Location			74043	non-null	values
dtypes: float64(11), object(9)
>>>
>>> # Исследовать диапазон значений для определенного поля 
>>> rats['Current Activity'].unique()
array([nan, Dispatch Crew, Request Sanitation Inspector], dtype=object)
>>> # Отфильровать данные
>>> crew_dispatched = rats[rats['Current Activity'] == 'Dispatch Crew']
>>> len(crew_dispatched)
65676
>>>
>> # Найти 10 самых сильно зараженных крысами ZIP-кодов (районов) в Чикаго 
>>> crew_dispatched['ZIP Code'].value_counts()[:10]
60647	3837
60618	3530
60614	3284
60629	3251
60636	2801
60657	2465
60641	2238
60609	2206
60651	2152
60632	2071
>>>
>>> # Группируем по дате завершения 
>>> dates = crew_dispatched.groupby('Completion Date') 
<pandas.core.groupby.DataFrameGroupBy object at 0x10d0a2a10> 
>>> len(dates)
472
>>>
>>> # Определяем ежедневное количество 
>>> date_counts = dates.size()
>>> date_counts[0:10]
Completion Date 
01/03/2011	4
01/03/2012	125
01/04/2011	54
01/04/2012	38
01/05/2011	78
01/05/2012	100
01/06/2011	100
01/06/2012	58
01/07/2011	1
01/09/2012	12
>>>
>>> # Сортируем количества 
>>> date_counts.sort()
>>> date_counts[-10:]
Completion Date 
10/12/2012	313
10/21/2011	314
09/20/2011	316
10/26/2011	319
02/22/2011	325
10/26/2012	333
03/17/2011	336
10/13/2011	378
10/14/2011	391
10/07/2011	457
>>>	


Обсуждение

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

    Со следующего шага мы начнем рассматривать функции.




Предыдущий шаг Содержание Следующий шаг