мета-данные страницы
Загрузка не удалась. Возможно, проблемы с правами доступа?
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
python:week21 [08/10/2018 03:48] – [Вычисления и статистика] ybezrukov | python:week21 [08/10/2018 13:42] (текущий) – [Группировка] ybezrukov | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
====== Операции с датафреймами/ | ====== Операции с датафреймами/ | ||
+ | |||
+ | ===== Математические функции и статистика ===== | ||
+ | |||
В панде уже реализовано множество математических функций для работы с данными, | В панде уже реализовано множество математических функций для работы с данными, | ||
Рассмотрим некоторые из них. | Рассмотрим некоторые из них. | ||
Строка 20: | Строка 23: | ||
* max()/min() - находят максимум и минимум | * max()/min() - находят максимум и минимум | ||
* sum()/ | * sum()/ | ||
+ | |||
+ | ===== Применение функции к элементам структуры ===== | ||
+ | |||
+ | С помощью функции apply() можно применить заданную функцию ко всей структуре сразу. | ||
+ | |||
+ | Например, | ||
+ | |||
+ | <code python> | ||
+ | df = pd.DataFrame([[4, | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | | ||
+ | 0 4 9 | ||
+ | 1 4 9 | ||
+ | 2 4 9 | ||
+ | </ | ||
+ | |||
+ | Извлечем корень из каждого элемента таблицы | ||
+ | |||
+ | <code python> | ||
+ | df.apply(np.sqrt) # здесь мы пользуемся функцией квадратного корня из библиотеки numpy, обратите внимание, | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | | ||
+ | 0 2.0 3.0 | ||
+ | 1 2.0 3.0 | ||
+ | 2 2.0 3.0 | ||
+ | </ | ||
+ | |||
+ | Функцию можно применить и ко всему столбцу | ||
+ | <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 ====== | ||
+ | Найти год с самым жарким месяцем | ||
+ |