Панды, 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. Если вы уже подписались, не забудьте подписаться, если хотите получать электронные письма всякий раз, когда я публикую новую статью.

Спасибо за чтение. Пожалуйста, дайте мне знать, если у вас есть какие-либо отзывы.