{"id":14287,"url":"\/distributions\/14287\/click?bit=1&hash=1d1b6427c21936742162fc18778388fc58ebf8e17517414e1bfb1d3edd9b94c0","title":"\u0412\u044b\u0440\u0430\u0441\u0442\u0438 \u0438\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0434\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0437\u0430 \u0433\u043e\u0434","buttonText":"","imageUuid":""}

(Pandas + SQL) Обзор Python-библиотеки PandaSQL

Pandas уже давно является неотъемлемым инструментом в арсенале любого специалиста, работающего с данными на языке Python. Ровно также неотъемлемым навыком является знание языка SQL, предназначенного для извлечения, хранения и модификации данных из реляционных баз.

В данной статье будет рассмотрена еще одна python-библиотека PandaSQL, которая позволяет использовать язык запросов SQL для обработки табличных данных pandas (DataFrame).

Данная библиотека может быть полезна:

  • специалистам, знающим SQL, но еще не знакомых с синтаксисом pandas, при этом уже готовый код будет для них более читабельным;
  • в случаях, когда задачу выгрузки данных интуитивно легче сформулировать средствами декларативного языка запросов SQL.

Установить данную библиотеку можно следующими командами:

  • для Pip: pip install pandasql;
  • для Anaconda: conda install pandasql.

В целях демонстрации функционала данного модуля мы используем Mall Customers Dataset – открытые данные посетителей магазина (id, пол, возраст, доход, рейтинг трат) с сайта Kaggle.

Важное напоминание: c помощью PandaSQL можно обращаться только к данным в виде pandas dataframe, поэтому наряду с ним необходимо импортировать сам pandas.

Давайте выберем из исходной таблицы покупателей, чей возраст не превышает 25 лет и годовой доход составляет не менее 60 тыс. долларов.

В Pandas это можно реализовать следующим образом:

При помощи модуля PandaSQL:

Присвоим некоторой переменной sql_query запрос на языке SQLite, заключенный в тройные кавычки, а затем передадим эту переменную в функцию sqldf.

На выходе мы получаем такой же результат, как и в примере с использованием Pandas.

Помимо непосредственно sql-запроса, функция sqldf принимает также необязательные аргументы в виде словарей locals() и globals(), означающих пространство имен, используемых в запросе.

При работе с модулем PandaSQL важно помнить, что он имеет некоторые ограничения и, как упоминалось выше, реализует язык запросов СУБД SQLite, который в свою очередь также имеет ряд ограничений по сравнению с более известными MySQL, PostreSQL, MS SQL Server.

В этой связи важное уточнение:

  • PandaSQL реализует только запросы. Создание, модификация, удаление таблиц невозможны.
  • Нельзя применить операции RIGHT OUTER JOIN и FULL OUTER JOIN. Однако LEFT OUTER JOIN применяется.

Оконные функции. Группировка. Фильтрация.

Давайте вычислим средний доход и средний возраст среди 7 мужчин и 7 женщин с наиболее высоким уровнем трат (показатель Spending Score). Для этого нам понадобятся оконная функция и группировка с агрегированием.

Средствами самого Pandas необходимые нам данные можно получить следующим образом:

Как видим, нам пришлось для каждого пола создавать отдельный dataframe и соединять их через функцию concat(). Но будь у нас не 2 группы, как сейчас, а больше, это могло бы вызвать некоторые трудности в реализации. В то же время, запрос через PandaSQL работал бы так же, будь у нас и большее количество полей для группировки.

Это один из многочисленных примеров, когда язык SQL позволяет легче реализовать задачу выгрузки и отбора данных.

Таким образом, PandaSQL может служить, в некоторых случаях, дополнительным инструментом для упрощения работы и расширения возможностей специалистов, занимающихся обработкой и анализом данных.

0
9 комментариев
Написать комментарий...
Александр Петрович

Лайк! Панды рулят!

Ответить
Развернуть ветку
Алексей Мигачев

Спасибо за статью. Весьма кстати

Ответить
Развернуть ветку
NTA
Автор

Спасибо за позитивную обратную связь, всегда рады помочь!

Ответить
Развернуть ветку
Иван Павельев

Дак в pandas есть read_sql, куда тоже можно засунуть этот запрос query и передать коннекшн. А так сравниваете чтение csv и последующую обработку и из sql таблицы. Вообще не понятно такое сравнение и польза от данной библиотеки

Ответить
Развернуть ветку
Алексей Мигачев

Мало ты работал с pandas.
Статья очень полезная

Ответить
Развернуть ветку
Eugene Che

Я так понял, что тут ты можешь писать sql запросы к датафреймам, а read_sql из базы

Ответить
Развернуть ветку
Костин Андрей

В pandas можно сделать проще.
Реализация рассчитана на любое количество групп.

df = df.sort_values(['Genre', 'Spending Score (1-100)'])
b = [df[df.Genre == i].iloc[-7:, [2,3]].mean().values for i in df.Genre.unique()]
pd.DataFrame(b, index = pd.Index(df.Genre.unique(), name='Пол'), columns=['Средний возраст', 'Средний годовой доход'])

Ответить
Развернуть ветку
NTA
Автор

🔥

Ответить
Развернуть ветку
Костин Андрей

.

Ответить
Развернуть ветку
6 комментариев
Раскрывать всегда