мета-данные страницы
Загрузка не удалась. Возможно, проблемы с правами доступа?
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| python:week21 [07/10/2018 20:55] – ybezrukov | python:week21 [08/10/2018 06:42] (текущий) – [Группировка] ybezrukov | ||
|---|---|---|---|
| Строка 24: | Строка 24: | ||
| * sum()/ | * sum()/ | ||
| - | ==== Применение функции к элементам структуры ==== | + | ===== Применение функции к элементам структуры |
| С помощью функции apply() можно применить заданную функцию ко всей структуре сразу. | С помощью функции apply() можно применить заданную функцию ко всей структуре сразу. | ||
| Строка 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 ====== | ||
| + | Найти год с самым жарким месяцем | ||