Polars для аналитики Введение
Иногда вы достигаете точки, когда вы соединяете точки между разными вещами. Действительно, в настоящее время мы копаемся в SQL, и для каждой новой концепции, которую изучили, пытаемся проиллюстрировать ее с помощью проекта ruby.
Вот в чем дело, мы любим ruby, это классный язык сценариев. Но мы должны признать, что это не лучший язык для аналитики и так далее. К тому же, иногда здорово узнавать что-то новое и практиковать свои навыки другим способом. Поэтому решили использовать Polars и Python, чтобы иметь другую точку зрения.
Чего ждать? Polars не для SQL. Как можно выучить SQL, используя Polars и Python?
Наше второе замечание заключается в том, что важны концепции, а есть много концепций (полагаем, не все из них), которые являются общими как для SQL, так и для Polars. Например, реляционная алгебра или оконная функция.
Эта статья представляет собой введение в использование Polars и Python для изучения концепций SQL.
Детский шаг
Это было сказано, прежде чем погрузиться в действительно сложные темы. Сначала мы должны изучить азбуку нашего API.
Итак, в качестве первого проекта мы хотели провести базовую аналитику данных github, которые нашли на Kaggle. Если вам интересно, вот набор данных.
Как мы уже сказали, давайте осторожно возьмем Polars и посмотрим, что мы можем сделать. Давайте обнаружим наш набор данных, прочитав CSV и отобразив имя первых 5 репозиториев.
import polars as pl
df = pl.read_csv("path/to/github_dataset.csv")
first_five_repo = df.select(
pl.col("repositories").head(5)
)
print(first_five_repo)
Это эквивалентно этому в SQL, если мы предположим, что наш csv — это, скажем, имя таблицы git_repos.
SELECT repositories FROM git_repos LIMIT 5
И это дает нам такой результат:
shape: (5, 1)
┌───────────────────────────┐
│ repositories │
│ --- │
│ str │
╞═══════════════════════════╡
│ octocat/Hello-World │
│ EddieHubCommunity/support │
│ ethereum/aleth │
│ localstack/localstack │
│ education/classroom │
└───────────────────────────┘
Это хорошее начало, так что давайте немного углубимся в полярные аспекты и давайте немного больше проанализируем и отчитаемся.
Немного более продвинутый материал
Давайте посмотрим, какие 5 лучших языков в нашем csv-файле, вы будете действительно удивлены :
top_5 = df.groupby("language").agg(
[pl.count().alias("count")]
).sort("count",descending=True).head(5)
print(top_5)
Эквивалент этого в PostgreSQL будет примерно таким
SELECT COUNT(*) AS count FROM git_repos GROUP BY language ORDER BY count DESC;
И в итоге мы приходим к такому результату:
shape: (5, 2)
┌────────────┬───────┐
│ language ┆ count │
│ --- ┆ --- │
│ str ┆ u32 │
╞════════════╪═══════╡
│ JavaScript ┆ 253 │
│ Python ┆ 155 │
│ NULL ┆ 145 │
│ HTML ┆ 72 │
│ Java ┆ 44 │
└────────────┴───────┘
Да, кажется, что NULL — 3-й любимый язык людей во всем мире.
Давайте просто отфильтруем нулевые значения, чтобы получить лучшее представление о распределении языков, и тогда все будет в порядке:
filtered_language = df.filter(pl.col("language") != "NULL")
top_5 = filtered_language.groupby("language").agg(
[pl.count().alias("count")]
).sort("count",descending=True).head(5)
print(top_5)
Что в значительной степени не совсем эквивалентно чему-то вроде одного из следующих ответов.
SELECT COUNT(*) AS count FROM git_repos WHERE language IS NOT NULL GROUP BY language ORDER BY count DESC;
--OR something like that in the idea but a bit more advanced in SQL
WITH filtered_language AS (SELECT * FROM git_repos WHERE language IS NOT NULL)
SELECT COUNT(*) AS count FROM filtered_language GROUP BY count ORDER BY DESC
Что хорошего в использовании python и Polars для создания всего этого, так это то, что у вас есть несколько интересных концепций SQL или что-то почти бесплатное. Например, здесь мы объявили значение filtered_language, которое содержит все столбцы нашего DataFrame, но без NULL.
Это близко к общим табличным выражениям в SQL, как и во втором способе написания этого запроса.
Вывод
Мы должны сказать, что мы доволен гибкостью Polars, которая, конечно, близка к Pandas. Это добавляет слой абстракции поверх нашей любимой реляционной алгебры. И не выбрасываем Ruby или что-то еще, но это правда, что когда вы хотите проводить аналитику данных, менее естественно использовать Ruby, чем Python.
Тем не менее, python и pandas никогда не заменят SQL, так как они не предназначены для того же использования, и дальнейшее совершенствование наших навыков SQL по-прежнему является для нас способом идти вместе с Ruby.