Привет! На связи Александр Грудинин, ментор курса «Аналитик данных» 👋🏻
Pandas — это отличный инструмент, но иногда попадаешь в ситуацию, где что-то идёт не так:
🟠
groupby + transform превращается в многоэтажную конструкцию;🟠 Коллега присылает готовый SQL-запрос, и его нужно «просто запустить»;
🟠 Данных много, и держать всё в памяти не хочется.
В такие моменты удобно знать, что SQLite можно поднять прямо внутри Python без сервера, без установки и даже без файла на диске. Просто
:memory: — и всё живёт в оперативке как обычный датафрейм, только запросы пишешь на SQL.Давайте покажу на примере.
Данные
import pandas as pd
import numpy as np
import sqlite3
dates = pd.date_range('2026-01-01', periods=30, freq='D')
stores = ['Москва', 'СПб', 'Казань']
df = pd.DataFrame([
{'date': d, 'store': s,
'revenue': np.random.randint(50_000, 300_000),
'orders': np.random.randint(10, 150)}
for d in dates for s in stores
])
Задача: по каждому магазину посчитать накопленную выручку, скользящее среднее за 7 дней и ранг дня по выручке.
🐼 Вариант 1: pandas
df = df.sort_values(['store', 'date'])
df['running_total'] = df.groupby('store')['revenue'].cumsum()
df['rolling_avg_7d'] = (
df.groupby('store')['revenue']
.transform(lambda x: x.rolling(7, min_periods=1).mean())
)
df['day_rank'] = (
df.groupby('store')['revenue']
.rank(method='dense', ascending=False)
)
🗄 Вариант 2: SQLite
conn = sqlite3.connect(':memory:') # всё в оперативке, налету, никаких файлов!
df.to_sql('sales', conn, index=False)
result = pd.read_sql("""
SELECT
*,
SUM(revenue) OVER (PARTITION BY store ORDER BY date) AS running_total,
ROUND(AVG(revenue) OVER (PARTITION BY store ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW), 0) AS rolling_avg_7d, DENSE_RANK() OVER (PARTITION BY store ORDER BY revenue DESC) AS day_rank
FROM sales
ORDER BY store, date
""", conn)
conn.close()Подведём итог. Когда можно использовать SQLite:
➡️ Есть готовый SQL-запрос, который жалко переписывать на pandas;
➡️ Оконная логика сложная, и
OVER читается понятнее, чем groupby + transform;➡️ Нужно произвести сложные JOIN’ы.
В целом SQLite — это не конкурент pandas, а ещё один способ решить задачу работы с данными. И порой самое элегантное решение — кинуть датафрейм в
:memory:, написать читаемый запрос и вернуть результат обратно в Python.Было полезно? Ставьте 🔥 и ждите от меня ещё больше полезных материалов!
📈 Симулейтив