В этом руководстве мы покажем, как использовать Ibis для создания переносимого пайплайна обработки признаков прямо в базе данных, который работает как Pandas, но полностью выполняется внутри базы данных.
Что мы делаем:
* Подключаемся к DuckDB.
* Регистрируем данные в бэкенде.
* Определяем сложные преобразования с помощью оконных функций и агрегаций, не загружая необработанные данные в локальную память.
* Пишем аналитический код один раз на Python и полагаемся на Ibis для его перевода в эффективный SQL.
Установка необходимых библиотек и инициализация среды Ibis
«`python
!pip -q install «ibis-framework[duckdb,examples]» duckdb pyarrow pandas
import ibis
from ibis import _
print(«Ibis version:», ibis.version)
con = ibis.duckdb.connect()
ibis.options.interactive = True
«`
Загрузка набора данных Penguins и регистрация его в каталоге DuckDB
«`python
try:
base_expr = ibis.examples.penguins.fetch(backend=con)
except TypeError:
base_expr = ibis.examples.penguins.fetch()
if «penguins» not in con.list_tables():
try:
con.createtable(«penguins», baseexpr, overwrite=True)
except Exception:
con.createtable(«penguins», baseexpr.execute(), overwrite=True)
t = con.table(«penguins»)
print(t.schema())
«`
Определение повторно используемого пайплайна обработки признаков
«`python
def penguinfeaturepipeline(penguins):
base = penguins.mutate(
billratio=.billlengthmm / .billdepth_mm,
ismale=(.sex == «male»).ifelse(1, 0),
)
cleaned = base.filter(
.billlength_mm.notnull()
& .billdepth_mm.notnull()
& .bodymass_g.notnull()
& .flipperlength_mm.notnull()
& _.species.notnull()
& _.island.notnull()
& _.year.notnull()
)
wspecies = ibis.window(groupby=[cleaned.species])
wislandyear = ibis.window(
group_by=[cleaned.island],
order_by=[cleaned.year],
preceding=2,
following=0,
)
feat = cleaned.mutate(
speciesavgmass=cleaned.bodymassg.mean().over(w_species),
speciesstdmass=cleaned.bodymassg.std().over(w_species),
mass_z=(
cleaned.bodymassg
— cleaned.bodymassg.mean().over(w_species)
) / cleaned.bodymassg.std().over(w_species),
islandmassrank=cleaned.bodymassg.rank().over(
ibis.window(group_by=[cleaned.island])
),
rolling3yrislandavgmass=cleaned.bodymassg.mean().over(
wislandyear
),
)
return feat.group_by([«species», «island», «year»]).agg(
n=feat.count(),
avgmass=feat.bodymass_g.mean(),
avgflipper=feat.flipperlength_mm.mean(),
avgbillratio=feat.bill_ratio.mean(),
avgmassz=feat.mass_z.mean(),
avgrolling3yrmass=feat.rolling3yrislandavg_mass.mean(),
pctmale=feat.ismale.mean(),
).order_by([«species», «island», «year»])
«`
Вызов пайплайна и компиляция его в DuckDB SQL
«`python
features = penguinfeaturepipeline(t)
print(con.compile(features))
try:
df = features.to_pandas()
except Exception:
df = features.execute()
display(df.head())
«`
Мы создали переносимый пайплайн для обработки признаков, используя Ibis. Этот пайплайн работает как Pandas, но полностью выполняется внутри базы данных. Мы показали, как подключать DuckDB, регистрировать данные в бэкенде и определять сложные преобразования с помощью оконных функций и агрегаций.
Этот подход подчёркивает основную идею Ibis: мы сохраняем вычисления рядом с данными, минимизируем ненужные перемещения данных и поддерживаем единую, многократно используемую кодовую базу Python, которая масштабируется от локальных экспериментов до производственных баз данных.
Полный код можно посмотреть здесь.
1. Какие библиотеки и инструменты используются для создания переносимых пайплайнов обработки признаков в базе данных?
В статье используется Ibis для создания переносимых пайплайнов обработки признаков, а также DuckDB, PyArrow, Pandas. Для установки необходимых библиотек применяется команда `pip install «ibis-framework[duckdb,examples]» duckdb pyarrow pandas`.
2. Какие преимущества даёт использование Ibis для обработки данных по сравнению с традиционными методами?
Использование Ibis позволяет создавать переносимые пайплайны обработки признаков, которые работают как Pandas, но полностью выполняются внутри базы данных. Это минимизирует ненужные перемещения данных, поддерживает единую, многократно используемую кодовую базу Python и масштабируется от локальных экспериментов до производственных баз данных.
3. Какие шаги необходимо выполнить для загрузки и регистрации набора данных в каталоге DuckDB?
Для загрузки набора данных Penguins и регистрации его в каталоге DuckDB необходимо выполнить следующие шаги:
* Подключиться к DuckDB.
* Зарегистрировать данные в бэкенде.
* Определить сложные преобразования с помощью оконных функций и агрегаций, не загружая необработанные данные в локальную память.
* Написать аналитический код один раз на Python и полагаться на Ibis для его перевода в эффективный SQL.
* Загрузить набор данных с помощью `ibis.examples.penguins.fetch()` и зарегистрировать его в таблице DuckDB.
4. Какие типы преобразований данных можно выполнить с помощью Ibis?
С помощью Ibis можно выполнить сложные преобразования данных, такие как агрегации и оконные функции, не загружая необработанные данные в локальную память. В статье показан пример создания пайплайна обработки признаков, который включает в себя вычисление соотношений, фильтрацию данных и агрегацию.
5. Какие функции Ibis используются для определения повторно используемого пайплайна обработки признаков?
Для определения повторно используемого пайплайна обработки признаков используются функции `mutate`, `filter`, `mean`, `std`, `rank`, `group_by`, `count`, `agg`. Эти функции позволяют выполнять сложные преобразования данных и агрегировать результаты.