You are currently viewing Запрос фрейма данных Pandas с помощью SQL

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

Мотивация

Библиотека Python Pandas и язык структурированных запросов (SQL) являются одними из важнейших инструментов в наборе инструментов Data Scientist. В то время как Pandas является мощным инструментом для обработки данных, многие специалисты по обработке данных знакомы с этим и предпочитают вместо этого использовать SQL для обработки данных. В этой статье мы рассмотрим, как выполнять манипуляции с данными фрейма данных Pandas с помощью SQL с библиотекой.pandasql

Что такое Pandasql?

Pandasql-это библиотека python, которая выполняет всеoоперации с фреймом данных Pandas с использованием SQL. Под капотом Pandasql создает таблицу SQLite из интересующего фрейма данных Pandas и позволяет пользователям выполнять запросы из таблицы SQLite с помощью SQL.

Как Работает Pandasql?

Установите пакет Pandasql.

!pip install -U pandasql

Импортируйте необходимые пакеты.

from pandasql import sqldf
import pandas as pd
from sklearn import datasets

В качестве примера мы используем набор данных iris. df_feature является фреймом данных, содержащим функции, в то время как df_target представляет собой серию, содержащую цель. Pandasql может работать как на Панд DataFrame.Series

df_feature = datasets.load_iris(as_frame = True)['data']
df_target = datasets.load_iris(as_frame = True)['target']
print (type(df_feature))
print (type(df_target))
>> <class 'pandas.core.frame.DataFrame'>
>>> >>

sqldf

  1. Строка SQL-запроса
  2. globals() или locals() функция

Типичный запрос будет выглядеть так, где q является строкой SQL-запроса. sqldf возвращает результат в виде фрейма данных.

q = "SELECT * FROM df_target LIMIT 3"
sqldf(q, globals())

globals() и locals() являются встроенной функцией в python, где хранятся функции и переменные. Давайте рассмотрим, что такое globals() функция работает.

globals()

globals() Функция возвращает словарь переменных, созданных в этом сеансе, таких как df_feature и df_target. Ключом словаря является имя переменной, а значение словаря содержит фактическое значение переменной.

print (globals().keys())
>> dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__builtin__', '__builtins__', '_ih', '_oh', '_dh', '_sh', 'In', 'Out', 'get_ipython', 'exit', 'quit', '_', '__', '___', '_i', '_ii', '_iii', '_i1', '_exit_code', '_i2', 'sqldf', 'pd', 'datasets', '_i3', 'df_feature', 'df_target', '_i4', '_4', '_i5', '_5', '_i6'])

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

globals()['df_feature']

Это вернет df_feature Фрейм данных.

Примеры

Теперь, когда мы понимаем, как globals() или locals() функция работает с Pandasql, давайте рассмотрим несколько примеров. Мы создаем новую функцию с именем pysqldf чтобы не проходить мимо globals() или locals()

pysqldf = lambda q: sqldf(q, globals())

Мы можем просто запросить фреймы данных следующим образом.

query = 'SELECT * FROM df_feature LIMIT 3'
pysqldf(query)
query = 'SELECT * FROM df_target LIMIT 3'
pysqldf(query)

Давайте соединим два кадра данных df_feature и df_target . Это можно сделать с помощью pd.concat

pd.concat([df_feature, df_target], axis = 1).head()

Если мы используем SQL, нам нужно будет создать столбец с номером текущей строки и объединить две таблицы, используя номер строки. Поскольку Pandasql использует SQLite под капотом, таблица SQLite будет иметь rowid столбец создан по умолчанию. Этот столбец содержит инкрементное целое значение, начинающееся с 1.

query = 'SELECT rowid, * FROM df_feature LIMIT 3'
pysqldf(query)

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

query = 'SELECT * FROM df_feature INNER JOIN df_target ON df_feature.rowid = df_target.rowid'
df = pysqldf(query)
df.head()

Вот примеры других операций, которые мы можем выполнить.

Нахождение средней длины чашелистика для разных целевых классов. Обратите внимание, что "sepal length (cm)" завернут в цитаты. Это необходимо только в том случае, если в именах столбцов есть пробелы.

query = 'SELECT target, AVG("sepal length (cm)") AS mean_sepal_length FROM df GROUP BY target'
pysqldf(query)

Мы также можем использовать f-строки в python для создания динамических строк SQL-запросов.

COL_NAME = '"sepal length (cm)"'
ALIAS = 'sepal_length'
AGG = 'MAX'
query = f"SELECT {AGG}({COL_NAME}) AS {ALIAS} FROM df"
pysqldf(query)

Ограничения Pandasql

  1. Поскольку Pandasql использует SQLite, он подвергается всем ограничения SQLite. Например, SQLite не реализует правильное внешнее соединение или полное внешнее соединение.
  2. Pandasql выполняет только запросы, он не может выполнять операции SQL, такие как обновление, вставка или изменение таблиц.

Вывод

Pandasql — отличное дополнение к инструментарию Data Scientist для специалистов по обработке данных, которые предпочитают синтаксис SQL Панд. В этой статье мы обсудили, как запросить фрейм данных Pandas с помощью SQL с использованием Pandasql и некоторые его ограничения.