Мотивация
Библиотека 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
- Строка SQL-запроса
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
- Поскольку Pandasql использует SQLite, он подвергается всем ограничения SQLite. Например, SQLite не реализует правильное внешнее соединение или полное внешнее соединение.
- Pandasql выполняет только запросы, он не может выполнять операции SQL, такие как обновление, вставка или изменение таблиц.
Вывод
Pandasql — отличное дополнение к инструментарию Data Scientist для специалистов по обработке данных, которые предпочитают синтаксис SQL Панд. В этой статье мы обсудили, как запросить фрейм данных Pandas с помощью SQL с использованием Pandasql и некоторые его ограничения.