мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
python:week21 [08/10/2018 03:30] – [Операции с датафреймами/сериями] ybezrukovpython:week21 [08/10/2018 13:42] (текущий) – [Группировка] ybezrukov
Строка 1: Строка 1:
 ====== Операции с датафреймами/сериями ====== ====== Операции с датафреймами/сериями ======
 +
 +===== Математические функции и статистика =====
 +
 В панде уже реализовано множество математических функций для работы с данными, уже сохраненными в соответствующей структуре данных. Весь их список стоит посмотреть по ссылкам на общей странице (раздел "Внешняя документация") В панде уже реализовано множество математических функций для работы с данными, уже сохраненными в соответствующей структуре данных. Весь их список стоит посмотреть по ссылкам на общей странице (раздел "Внешняя документация")
-===== Вычисления и статистика =====+Рассмотрим некоторые из них.
  
-Функция mean() без параметра вычисляет среднее значение для каждого столбца датафрейма+Функция mean() без параметра (0 или столбцы подразумевается по-умолчанию) вычисляет среднее значение для каждого столбца датафрейма
  
 <code python> <code python>
 df.mean() df.mean()
 +</code>
 +
 +Если указать параметр 1, то вычислено будет среднее значение по строке
 +
 +<code python>
 +df.mean(1)
 +</code>
 +
 +
 +  * abs() - берет модуль от каждого элемента
 +  * count() - считает количество существующих (которые не равны NaN) элементов
 +  * max()/min() - находят максимум и минимум
 +  * sum()/prod() - сумма или произведение
 +
 +===== Применение функции к элементам структуры =====
 +
 +С помощью функции apply() можно применить заданную функцию ко всей структуре сразу.
 +
 +Например, создадим следующий датафрейм
 +
 +<code python>
 +df = pd.DataFrame([[4, 9],] * 3, columns=['A', 'B'])
 </code> </code>
  
 <code> <code>
-  -0.004474 +    
-  -0.383981 +  9 
-C   -0.687758 +1  4  9 
-D    5.000000 +2  4  9
-F    3.000000 +
-dtype: float64+
 </code> </code>
  
-Если указать параметр 1, то вычислено будет среднее значение по строке+Извлечем корень из каждого элемента таблицы
  
 <code python> <code python>
-df.mean(1)+df.apply(np.sqrt# здесь мы пользуемся функцией квадратного корня из библиотеки numpy, обратите внимание, что в этом контексте скобки не нужны
 </code> </code>
  
 <code> <code>
-2013-01-01    0.872735 +        B 
-2013-01-02    1.431621 +0  2.0  3.0 
-2013-01-03    0.707731 +1  2.0  3.0 
-2013-01-04    1.395042 +2  2.0  3.0 
-2013-01-05    1.883656 +</code> 
-2013-01-06    1.592306+ 
 +Функцию можно применить и ко всему столбцу 
 +<code python> 
 +df.apply(np.sum, axis=0) 
 +</code> 
 + 
 +или строке 
 + 
 +<code python> 
 +df.apply(np.sum, axis=1) 
 +</code> 
 + 
 +===== Группировка ===== 
 + 
 +Группировкой будем считать один или несколько следующих шагов: 
 + 
 +  * **Разделение** данных на группы по какому-нибудь критерию 
 +  * **Применение** функции независимо к каждой группе 
 +  * **Комбинирование** результатов в общую структуру 
 + 
 +Посмотрим на примеры: 
 + 
 +Создадим датафрейм 
 + 
 +<code python> 
 +df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 
 +                           'foo', 'bar', 'foo', 'foo'], 
 +                    'B' : ['one', 'one', 'two', 'three', 
 +                           'two', 'two', 'one', 'three'], 
 +                    'C' : np.random.randn(8), 
 +                    'D' : np.random.randn(8)}) 
 +print(df) 
 +</code> 
 + 
 +<code> 
 +          B                 D 
 +0  foo    one -1.202872 -0.055224 
 +1  bar    one -1.814470  2.395985 
 +2  foo    two  1.018601  1.552825 
 +3  bar  three -0.595447  0.166599 
 +4  foo    two  1.395433  0.047609 
 +5  bar    two -0.392670 -0.136473 
 +6  foo    one  0.007207 -0.561757 
 +7  foo  three  1.928123 -1.623033 
 +</code> 
 + 
 +Сгруппируем данные по первому столбцу и найдем сумму элементов в каждой группе 
 + 
 +<code python> 
 +df.groupby('A').sum() 
 + 
 +print(df) 
 +</code> 
 + 
 +Обратите внимание, что в результате отсутствует столбец B, так как операция суммирования к нему неприменима 
 + 
 +<code> 
 +            C        D 
 +A                      
 +bar -2.802588  2.42611 
 +foo  3.146492 -0.63958 
 +</code> 
 + 
 +Группировать можно и иерархически, например указав два столбца 
 + 
 +<code python> 
 +df.groupby(['A','B']).sum() 
 +print(df) 
 +</code>  
 + 
 +<code> 
 +                  C         D 
 +A                           
 +bar one   -1.814470  2.395985 
 +    three -0.595447  0.166599 
 +    two   -0.392670 -0.136473 
 +foo one   -1.195665 -0.616981 
 +    three  1.928123 -1.623033 
 +    two    2.414034  1.600434 
 +</code> 
 + 
 +Все значения из столбцов можно объединить с помощью другой функции 
 + 
 +<code python> 
 +df.groupby(['A', 'B']).agg(lambda x: ','.join(x)) 
 +</code> 
 + 
 +Или 
 + 
 +<code python> 
 +df.groupby(['A', 'B']).apply(list)) 
 +</code> 
 + 
 + 
 +После группировки столбцы A и B стали элементами составного индекса. Но это не помешает фильтровать строки по значениями этого индекса 
 +<code python> 
 +df.index.get_level_values('A'
 +</code> 
 + 
 +===== Временные последовательности ===== 
 + 
 +Временная последовательность отражает зависимость некоторого параметра от времени, например среднюю температуру в городе за историю наблюдений или курс акций по дням. pandas имеет простой и мощный интерфейс для работы с данными такого типа (например, если данные записаны с точностью до секунды их легко преобразовать в пятиминутные).  
 + 
 +Создадим такую временную последовательность 
 + 
 +<code python> 
 + 
 +rng = pd.date_range('1/1/2011', periods=72, freq='H') # Создадим временной диапазон: 72 часа начиная с 1 января 2011 
 + 
 +ts = pd.Series(np.random.randn(len(rng)), index=rng) # Используем его в качестве индекса для случайной величины 
 + 
 +print(ts.head()) 
 +</code> 
 + 
 +<code> 
 +2011-01-01 00:00:00    0.469112 
 +2011-01-01 01:00:00   -0.282863 
 +2011-01-01 02:00:00   -1.509059 
 +2011-01-01 03:00:00   -1.135632 
 +2011-01-01 04:00:00    1.212112 
 +Freq: H, dtype: float64 
 +</code> 
 + 
 +Посчитаем, например, среднее значение по дням  
 + 
 +<code python> 
 +print(ts.resample('D').mean()) 
 +</code>   
 + 
 +<code> 
 +2011-01-01   -0.319569 
 +2011-01-02   -0.337703 
 +2011-01-03    0.117258
 Freq: D, dtype: float64 Freq: D, dtype: float64
 </code> </code>
 +
 +Здесь мы встретились с операцией передискретизации или ресемплинга. Эта операция изменяет частоту с которой записаны значения параметра, в нашем примере мы уменьшили эту частоту в 24 раза: с 1 часа до 1 дня (resample()), в качестве нового значения выбрали среднее (mean()).
 +
 +===== Диаграммы =====
 +pandas был бы не pandas если бы не давал возможности легко нарисовать таблицу на диаграмме. Для отображения картинки библиотека использует уже знакомый matplotlib.
 +
 +Например
 +
 +<code python>
 +ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000)) # Создадим случайный набор данных с датами в качестве индекса
 +ts = ts.cumsum() # Посчитаем кумулятивную сумму для всех значений
 +
 +ts.plot() #  и отобразим ее на экране
 +</code>
 +
 +{{:python:series_plot_basic.png?400|}}
 +
 +Можно рисовать значения и из таблиц с множеством столбцов
 +
 +<code python>
 +df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index,columns=['A', 'B', 'C', 'D'])
 +df = df.cumsum()
 +plt.figure()
 +df.plot()
 +plt.legend(loc='best')
 +</code>
 +
 +====== Задача 6 ======
 +Решить задачу 5 с помощью функции группировки
 +
 +
 +====== Задача 7 ======
 +Найти наибольшую и наименьшую температуры 
 +- за всю историю наблюдений
 +- за год
 +- за месяц
 +
 +====== Задача 8 ======
 +Нарисовать среднее значение температуры по годам и месяцам
 +
 +====== Задача 9 ======
 +Найти год с самым жарким месяцем
 +