Время прочтения: 4 мин.

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