SQL в Pandas с Pandasql

Использование SQL в Pandas с помощью библиотеки Pandasql

Если вы можете добавить только одну навык – и неоспоримо самый важный – в свой арсенал данных, это SQL . В экосистеме анализа данных на языке Python, однако, pandas – мощная и популярная библиотека.

Но, если вы новичок в pandas, знакомство с функциями pandas – по группировке, агрегации, объединению и т. д. – может быть ошеломляющим. Гораздо проще запросить свои фреймы данных с помощью SQL. Библиотека pandasql позволяет делать именно это!

Итак, давайте научимся использовать библиотеку pandasql для выполнения SQL-запросов в фрейме данных pandas на примере набора данных.

Первые шаги с Pandasql

Прежде чем мы продолжим, давайте настроим нашу рабочую среду.

Установка pandasql

Если вы используете Google Colab, вы можете установить pandasql с помощью `pip` и выполнить код:

  pip install pandasql  

Если вы используете Python на своем локальном компьютере, убедитесь, что у вас уже установлены pandas и Seaborn в отдельной виртуальной среде для этого проекта. Вы можете использовать встроенный пакет venv для создания и управления виртуальными средами.

Я использую Python 3.11 в Ubuntu LTS 22.04. Поэтому следующая инструкция предназначена для Ubuntu (она также должна работать на Mac). Если вы работаете на компьютере с операционной системой Windows, следуйте этим инструкциям для создания и активации виртуальных сред.

Чтобы создать виртуальную среду (v1 здесь), выполните следующую команду в своем рабочем каталоге:

  python3 -m venv v1  

Затем активируйте виртуальное окружение:

  source v1/bin/activate  

Теперь установите pandas, seaborn и pandasql:

  pip3 install pandas seaborn pandasql  

Примечание : Если у вас еще не установлен `pip`, вы можете обновить системные пакеты и установить его, выполнив команду: apt install python3-pip .

Функция `sqldf`

Чтобы выполнить SQL-запросы в фрейме данных pandas, вы можете импортировать и использовать sqldf с следующим синтаксисом:

  from pandasql import sqldf sqldf (query, globals ()) 

Здесь

  • query представляет собой SQL-запрос, который вы хотите выполнить в фрейме данных pandas. Он должен быть строкой, содержащей допустимый SQL-запрос.
  • globals () указывает глобальное пространство имен, в котором определены используемые в запросе фреймы данных.

Запрос фрейма данных pandas с помощью pandasql

Начнем с импорта необходимых пакетов и функции sqldf из pandasql:

  import pandas as pd import seaborn as sns from pandasql import sqldf  

Поскольку мы будем выполнять несколько запросов в фрейме данных, мы можем определить функцию, чтобы мы могли вызывать ее, передавая запрос в качестве аргумента:

  # Определим повторноиспользуемую функцию для выполнения SQL-запросовrun_query = lambda query: sqldf (query, globals ())  

Для всех последующих примеров мы будем использовать функцию run_query (которая использует функцию sqldf() внутри) для выполнения SQL-запроса в dataframe tips_df. Затем мы выведем полученный результат.

 

Загрузка набора данных

 

В рамках данного руководства мы будем использовать набор данных “tips”, встроенный в библиотеку Seaborn. Набор данных “tips” содержит информацию о чаевых в ресторане, включающую общую сумму счета, сумму чаевых, пол плательщика, день недели и другое.

Загрузим набор данных “tip” в dataframe tips_df:

# Загрузка набора данных "tips" в pandas dataframetips_df = sns.load_dataset("tips")

 

Пример 1 – Выбор данных

 

Далее приведен наш первый запрос – простой оператор SELECT:

# Простой запрос на выборкуquery_1 = """SELECT *FROM tips_dfLIMIT 10;"""result_1 = run_query(query_1)print(result_1)

 

Как видно, этот запрос выбирает все столбцы из dataframe tips_df и ограничивает вывод первыми 10 строками с помощью ключевого слова `LIMIT`. Это эквивалентно выполнению tips_df.head(10) в pandas:

 

 

Пример 2 – Фильтрация на основе условия

 

Теперь давайте напишем запрос для фильтрации результатов на основе условий:

# Фильтрация на основе условияquery_2 = """SELECT *FROM tips_dfWHERE total_bill > 30 AND tip > 5;"""result_2 = run_query(query_2)print(result_2)

 

Этот запрос фильтрует dataframe tips_df на основе условия, указанного в предложении WHERE. Он выбирает все столбцы из dataframe tips_df, где значение столбца ‘total_bill’ больше 30 и значение столбца ‘tip’ больше 5.

Выполнение query_2 дает следующий результат:

 

 

Пример 3 – Группировка и агрегация

 

Давайте выполним следующий запрос, чтобы получить среднюю сумму счета, сгруппированную по дням:

# Группировка и агрегацияquery_3 = """SELECT day, AVG(total_bill) as avg_billFROM tips_dfGROUP BY day;"""result_3 = run_query(query_3)print(result_3)

 

Вот результат:

  

Мы видим, что средняя сумма счета в выходные немного выше.

Давайте рассмотрим еще один пример группировки и агрегаций. Рассмотрим следующий запрос:

query_4 = """SELECT day, COUNT(*) as num_transactions, AVG(total_bill) as avg_bill, MAX(tip) as max_tipFROM tips_dfGROUP BY day;"""result_4 = run_query(query_4)print(result_4)

 

Запрос query_4 группирует данные в dataframe tips_df по столбцу ‘day’ и вычисляет следующие агрегатные функции для каждой группы:

  • num_transactions: количество транзакций, 
  • avg_bill: среднее значение столбца ‘total_bill’, и 
  • max_tip: максимальное значение столбца ‘tip’. 

Как видно, мы получаем вышеуказанные значения, сгруппированные по дням:

Пример 4 – Подзапросы

Добавим пример запроса, который использует подзапрос:

# подзапросыquery_5 = """SELECT *FROM tips_dfWHERE total_bill > (SELECT AVG(total_bill) FROM tips_df);"""result_5 = run_query(query_5)print(result_5)

Здесь,

  • Внутренний подзапрос вычисляет среднее значение столбца ‘total_bill’ из dataframe tips_df.
  • Затем внешний запрос выбирает все столбцы из dataframe tips_df, где ‘total_bill’ больше вычисленного среднего значения.

Запуск query_5 дает следующий результат:

Пример 5 – Объединение двух DataFrame

У нас есть только один dataframe. Чтобы выполнить простое объединение, давайте создадим другой dataframe следующим образом:

# Создаем еще один DataFrame для объединения с tips_dfother_data = pd.DataFrame({    'day': ['Thur','Fri', 'Sat', 'Sun'],    'special_event': ['Throwback Thursday', 'Feel Good Friday', 'Social Saturday','Fun Sunday', ]})

Dataframe other_data связывает каждый день со специальным событием.

Теперь выполним LEFT JOIN между dataframe tips_df и dataframe other_data по общему столбцу ‘day’:

query_6 = """SELECT t.*, o.special_eventFROM tips_df tLEFT JOIN other_data o ON t.day = o.day;"""result_6 = run_query(query_6)print(result_6)

Вот результат операции объединения:

Завершение и следующие шаги

В этом руководстве мы рассмотрели, как выполнять SQL-запросы на pandas-фреймворках с помощью pandasql. Хотя pandasql делает запросы к dataframe с использованием SQL очень простыми, есть некоторые ограничения.

Основное ограничение состоит в том, что pandasql может работать в несколько раз медленнее, чем нативный pandas. И что же следует делать? Если вам нужно выполнять анализ данных с помощью pandas, вы можете использовать pandasql для запросов dataframe при изучении pandas — и быстро продолжать. На более поздних этапах вы можете перейти на pandas или другую библиотеку, например Polars, когда вы будете чувствовать себя уверенно с pandas.

Для первых шагов в этом направлении попробуйте написать и запустить аналогичные запросы pandas для SQL, которые мы уже выполнили. Все примеры кода, использованные в этом руководстве, находятся на GitHub. Продолжайте программировать! Bala Priya C – разработчица и технический писатель из Индии. Ей нравится работать в области математики, программирования, науки о данных и создания контента. Ее интересы и экспертиза включают DevOps, науку о данных и обработку естественного языка. Она любит чтение, письмо, программирование и кофе! В настоящее время она работает над изучением и обменом своими знаниями с сообществом разработчиков, создавая учебники, руководства, мнения и многое другое.