Панды, data.table и SQL
Мы анализируем данные, чтобы извлечь информацию, найти ценную информацию или узнать то, что невидимо, просто просматривая. Сложность процессов анализа данных зависит от характеристик и структуры данных.
Тем не менее, есть некоторые основные операции, которые часто выполняются. Их можно рассматривать как азбуку анализа данных:
- Группировка
- Фильтрация
- Сортировка
В этой статье мы узнаем, как выполнять эти операции с помощью 3 наиболее часто используемых инструментов для анализа данных:
- Панды для Python
- data.table для R
- SQL
Цель состоит не в том, чтобы сравнить эти инструменты или классифицировать один как превосходящий другие. Возможно, вам придется использовать некоторые или все из них в вашей карьере в области науки о данных, потому что эти инструменты используются многими компаниями.
Как всегда, мы будем учиться на примерах, поэтому нам нужен набор данных для работы. Я подготовил набор данных о продажах с фиктивными данными. Вы можете скачать его из репозитория datasets на моей странице GitHub. Он называется данные_продаж_с_магазинами. Вот первые 5 строк этого набора данных:
Группировка
Группировка точек данных (то есть строк в табличных данных) на основе отдельных значений или категорий в столбце или столбцах обычно выполняется при исследовательском анализе данных.
Некоторые вещи, которые можно рассчитать с помощью группировки:
- Средняя цена автомобиля по марке
- Средний доход по месяцам
- День недели с наибольшим объемом продаж
Возвращаясь к нашему набору данных, мы можем найти средние продажи за последнюю неделю для каждого магазина следующим образом:
Панды
Мы используем групповые и средние функции. Сначала строки группируются по столбцу хранилища. Затем мы выбираем столбец для агрегирования и применяем соответствующую функцию.
import pandas as pd df = pd.read_csv("sales_data_with_stores.csv") df.groupby("store")["last_week_sales"].mean() # output store Daisy 66.544681 Rose 64.520000 Violet 99.206061 Name: last_week_sales, dtype: float64
data.table
Синтаксис пакета таблиц данных немного проще, чем у Pandas. Действия, которые необходимо выполнить, записываются через запятую в квадратных скобках, как показано ниже:
library(data.table) dt <- fread("sales_data_with_stores.csv") dt[, mean(last_week_sales), store] # output store V1 1: Violet 99.20606 2: Rose 64.52000 3: Daisy 66.54468
SQL
Предположим, у нас есть таблица с именем продажи, которая содержит данные в нашем наборе данных. Мы используем операторы select и group by, как показано ниже:
SELECT store, AVG(last_week_sales) FROM sales GROUP BY store
Вывод будет таким же, как и в других примерах.
Во всех примерах агрегированные столбцы не имеют понятного имени столбца, что не является идеальным случаем, особенно при работе с другими людьми. Давайте сделаем еще одну серию примеров и найдем среднюю цену продукта и общее количество товаров на складе для каждого магазина. Мы также назначим имена агрегированным столбцам.
Панды
Мы будем использовать функцию agg. Столбец для агрегирования и агрегатная функция записываются внутри кортежа, как показано ниже:
df.groupby("store").agg( avg_price = ("price", "mean"), total_stock = ("stock_qty", "sum") ) # output
data.table
Структура синтаксиса такая же, но с небольшими изменениями. Агрегации записываются в круглых скобках, которым предшествует точка.
dt[, .( avg_price = mean(price), total_stock = sum(stock_qty) ), store ]
SQL
Это очень похоже на другой пример SQL. Нам просто нужно добавить имена столбцов.
SELECT store, AVG(price) AS avg_price, SUM(stock_qty) AS total_stock FROM sales GROUP BY store
Фильтрация
Фильтрация — еще одна частая операция при анализе данных. Большинство инструментов предоставляют функции и методы для фильтрации необработанных данных на основе строковых, числовых значений и значений даты.
Мы сделаем пример, который содержит как строковые, так и числовые фильтры. Давайте выберем точки данных (т.е. строки), в которых:
- Магазин Фиолетовый
- Группа продуктов: PG1, PG3 или PG5.
- Продажи за последний месяц выше 100
Панды
В квадратных скобках пишем условия фильтрации. В случае нескольких условий каждое из них записывается в круглых скобках, а условия объединяются с соответствующим логическим оператором (например, & для конца, | для или логики).
df[ (df["store"] == "Violet") & (df["product_group"].isin(["PG1","PG3","PG5"])) & (df["last_month_sales"] > 100) ]
Результатом этого кода является DataFrame со строками, соответствующими заданному набору условий.
data.table
Логика похожая. В этом случае мы объединяем несколько условий, используя оператор and.
dt[ store == "Violet" & product_group %in% c("PG1","PG3", "PG5") & last_month_sales > 100 ]
SQL
Условия указаны в операторе where. В этом случае мы используем ключевое слово and для объединения нескольких условий.
SELECT * FROM sales WHERE store = "Violet" AND product_group in ("PG1", "PG3", "PG5") AND last_month_sales > 100
Сортировка
Иногда нам нужно отсортировать строки на основе значений в столбце или столбцах. Например, мы можем захотеть отсортировать товары по цене в порядке убывания.
Панды
Для этой задачи используется функция sort_values. Нам просто нужно написать столбцы, которые будут использоваться для сортировки. Pandas сортирует по возрастанию по умолчанию, но это поведение можно изменить с помощью параметра по возрастанию.
df_sorted = df.sort_values(by="price", ascending=False)
data.table
Используется функция заказа. Чтобы перейти от возрастания к убыванию, нам просто нужно добавить знак минус перед именем столбца.
dt_sorted <- dt[order(-price)]
SQL
Оператор order by используется в SQL для сортировки строк. Подобно data.table и Pandas, строки сортируются в порядке возрастания. Мы можем отсортировать в порядке убывания, используя ключевое слово desc.
SELECT * FROM sales ORDER BY price DESC
Мы научились выполнять 3 операции фундаментального анализа данных с помощью 3 широко используемых инструментов в экосистеме науки о данных. Мы рассмотрели простые случаи, но используемые функции и методы также могут выполнять более сложные задачи. Всегда лучше хорошо понять основы, прежде чем изучать детали.
Вы можете стать участником Medium, чтобы разблокировать полный доступ к моим материалам, а также к остальной части Medium. Если вы уже подписались, не забудьте подписаться, если хотите получать электронные письма всякий раз, когда я публикую новую статью.
Спасибо за чтение. Пожалуйста, дайте мне знать, если у вас есть какие-либо отзывы.