мета-данные страницы
Загрузка не удалась. Возможно, проблемы с правами доступа?
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| python:week21 [07/10/2018 20:30] – [Операции с датафреймами/сериями] ybezrukov | python:week21 [08/10/2018 06:42] (текущий) – [Группировка] ybezrukov | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== Операции с датафреймами/ | ====== Операции с датафреймами/ | ||
| + | |||
| + | ===== Математические функции и статистика ===== | ||
| + | |||
| В панде уже реализовано множество математических функций для работы с данными, | В панде уже реализовано множество математических функций для работы с данными, | ||
| - | ===== Вычисления и статистика ===== | + | Рассмотрим некоторые |
| - | Функция mean() без параметра вычисляет среднее значение для каждого столбца датафрейма | + | Функция mean() без параметра |
| <code python> | <code python> | ||
| df.mean() | df.mean() | ||
| + | </ | ||
| + | |||
| + | Если указать параметр 1, то вычислено будет среднее значение по строке | ||
| + | |||
| + | <code python> | ||
| + | df.mean(1) | ||
| + | </ | ||
| + | |||
| + | |||
| + | * abs() - берет модуль от каждого элемента | ||
| + | * count() - считает количество существующих (которые не равны NaN) элементов | ||
| + | * max()/min() - находят максимум и минимум | ||
| + | * sum()/ | ||
| + | |||
| + | ===== Применение функции к элементам структуры ===== | ||
| + | |||
| + | С помощью функции apply() можно применить заданную функцию ко всей структуре сразу. | ||
| + | |||
| + | Например, | ||
| + | |||
| + | <code python> | ||
| + | df = pd.DataFrame([[4, | ||
| </ | </ | ||
| < | < | ||
| - | A -0.004474 | + | A B |
| - | B -0.383981 | + | 0 |
| - | C -0.687758 | + | 1 4 9 |
| - | D 5.000000 | + | 2 4 9 |
| - | F 3.000000 | + | |
| - | dtype: float64 | + | |
| </ | </ | ||
| - | Если указать параметр 1, то вычислено будет среднее значение по строке | + | Извлечем корень из каждого элемента таблицы |
| <code python> | <code python> | ||
| - | df.mean(1) | + | df.apply(np.sqrt) # здесь мы пользуемся функцией квадратного корня из библиотеки numpy, обратите внимание, |
| </ | </ | ||
| < | < | ||
| - | 2013-01-01 | + | |
| - | 2013-01-02 | + | 0 2.0 3.0 |
| - | 2013-01-03 | + | 1 2.0 3.0 |
| - | 2013-01-04 | + | 2 2.0 3.0 |
| - | 2013-01-05 1.883656 | + | </ |
| - | 2013-01-06 1.592306 | + | |
| + | Функцию можно применить и ко всему столбцу | ||
| + | <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 | ||
| + | 2011-01-01 01: | ||
| + | 2011-01-01 | ||
| + | 2011-01-01 03: | ||
| + | 2011-01-01 04: | ||
| + | Freq: H, dtype: float64 | ||
| + | </ | ||
| + | |||
| + | Посчитаем, | ||
| + | |||
| + | <code python> | ||
| + | print(ts.resample(' | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | 2011-01-01 -0.319569 | ||
| + | 2011-01-02 | ||
| + | 2011-01-03 | ||
| Freq: D, dtype: float64 | 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 ====== | ||
| + | Найти год с самым жарким месяцем | ||
| + | |||