мета-данные страницы
Загрузка не удалась. Возможно, проблемы с правами доступа?
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
python:week21 [08/10/2018 03:55] – [Применение функции к элементам структуры] ybezrukov | python:week21 [08/10/2018 13:42] (текущий) – [Группировка] ybezrukov | ||
---|---|---|---|
Строка 54: | Строка 54: | ||
</ | </ | ||
+ | Функцию можно применить и ко всему столбцу | ||
+ | <code python> | ||
+ | df.apply(np.sum, | ||
+ | </ | ||
+ | |||
+ | или строке | ||
+ | |||
+ | <code python> | ||
+ | df.apply(np.sum, | ||
+ | </ | ||
+ | |||
+ | ===== Группировка ===== | ||
+ | |||
+ | Группировкой будем считать один или несколько следующих шагов: | ||
+ | |||
+ | * **Разделение** данных на группы по какому-нибудь критерию | ||
+ | * **Применение** функции независимо к каждой группе | ||
+ | * **Комбинирование** результатов в общую структуру | ||
+ | |||
+ | Посмотрим на примеры: | ||
+ | |||
+ | Создадим датафрейм | ||
+ | |||
+ | <code python> | ||
+ | df = pd.DataFrame({' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | print(df) | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | | ||
+ | 0 foo one -1.202872 -0.055224 | ||
+ | 1 bar one -1.814470 | ||
+ | 2 foo two 1.018601 | ||
+ | 3 bar three -0.595447 | ||
+ | 4 foo two 1.395433 | ||
+ | 5 bar two -0.392670 -0.136473 | ||
+ | 6 foo one 0.007207 -0.561757 | ||
+ | 7 foo three 1.928123 -1.623033 | ||
+ | </ | ||
+ | |||
+ | Сгруппируем данные по первому столбцу и найдем сумму элементов в каждой группе | ||
+ | |||
+ | <code python> | ||
+ | df.groupby(' | ||
+ | |||
+ | print(df) | ||
+ | </ | ||
+ | |||
+ | Обратите внимание, | ||
+ | |||
+ | < | ||
+ | C D | ||
+ | A | ||
+ | bar -2.802588 | ||
+ | foo 3.146492 -0.63958 | ||
+ | </ | ||
+ | |||
+ | Группировать можно и иерархически, | ||
+ | |||
+ | <code python> | ||
+ | df.groupby([' | ||
+ | print(df) | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | C D | ||
+ | A | ||
+ | bar one | ||
+ | three -0.595447 | ||
+ | two | ||
+ | foo one | ||
+ | three 1.928123 -1.623033 | ||
+ | two 2.414034 | ||
+ | </ | ||
+ | |||
+ | Все значения из столбцов можно объединить с помощью другой функции | ||
+ | |||
+ | <code python> | ||
+ | df.groupby([' | ||
+ | </ | ||
+ | |||
+ | Или | ||
+ | |||
+ | <code python> | ||
+ | df.groupby([' | ||
+ | </ | ||
+ | |||
+ | |||
+ | После группировки столбцы A и B стали элементами составного индекса. Но это не помешает фильтровать строки по значениями этого индекса | ||
+ | <code python> | ||
+ | df.index.get_level_values(' | ||
+ | </ | ||
+ | |||
+ | ===== Временные последовательности ===== | ||
+ | |||
+ | Временная последовательность отражает зависимость некоторого параметра от времени, | ||
+ | |||
+ | Создадим такую временную последовательность | ||
+ | |||
+ | <code python> | ||
+ | |||
+ | rng = pd.date_range(' | ||
+ | |||
+ | ts = pd.Series(np.random.randn(len(rng)), | ||
+ | |||
+ | print(ts.head()) | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | 2011-01-01 00: | ||
+ | 2011-01-01 01: | ||
+ | 2011-01-01 02: | ||
+ | 2011-01-01 03: | ||
+ | 2011-01-01 04: | ||
+ | Freq: H, dtype: float64 | ||
+ | </ | ||
+ | |||
+ | Посчитаем, | ||
+ | |||
+ | <code python> | ||
+ | print(ts.resample(' | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | 2011-01-01 | ||
+ | 2011-01-02 | ||
+ | 2011-01-03 | ||
+ | Freq: D, dtype: float64 | ||
+ | </ | ||
+ | |||
+ | Здесь мы встретились с операцией передискретизации или ресемплинга. Эта операция изменяет частоту с которой записаны значения параметра, | ||
+ | |||
+ | ===== Диаграммы ===== | ||
+ | pandas был бы не pandas если бы не давал возможности легко нарисовать таблицу на диаграмме. Для отображения картинки библиотека использует уже знакомый matplotlib. | ||
+ | |||
+ | Например | ||
+ | |||
+ | <code python> | ||
+ | ts = pd.Series(np.random.randn(1000), | ||
+ | ts = ts.cumsum() # Посчитаем кумулятивную сумму для всех значений | ||
+ | |||
+ | ts.plot() # и отобразим ее на экране | ||
+ | </ | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Можно рисовать значения и из таблиц с множеством столбцов | ||
+ | |||
+ | <code python> | ||
+ | df = pd.DataFrame(np.random.randn(1000, | ||
+ | df = df.cumsum() | ||
+ | plt.figure() | ||
+ | df.plot() | ||
+ | plt.legend(loc=' | ||
+ | </ | ||
+ | |||
+ | ====== Задача 6 ====== | ||
+ | Решить задачу 5 с помощью функции группировки | ||
+ | |||
+ | |||
+ | ====== Задача 7 ====== | ||
+ | Найти наибольшую и наименьшую температуры | ||
+ | - за всю историю наблюдений | ||
+ | - за год | ||
+ | - за месяц | ||
+ | |||
+ | ====== Задача 8 ====== | ||
+ | Нарисовать среднее значение температуры по годам и месяцам | ||
+ | |||
+ | ====== Задача 9 ====== | ||
+ | Найти год с самым жарким месяцем | ||