Перейти к содержанию

172 уроков, 13 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение
Честное сравнение Вердикт с условием Бесплатные уроки

Pandas или SQL: что учить для анализа данных

Данные лежат в базе, а вы привыкли к CSV? Сравниваем SQL и pandas по 8 критериям и решаем одну задачу обеими технологиями — с настоящим выводом вместо обещаний.

Редакция Питоники

Вопрос поставлен неверно — и это хорошая новость

Привычный мир аналитика — файлы. Выгрузили CSV, открыли pandas, пара groupby — отчёт готов. А потом выясняется, что настоящие данные лежат не в файле, а в базе. Чтобы достать их, нужен SQL. Возникает вопрос «pandas или sql» — и он почти всегда поставлен неверно.

Неверно — потому что это не две конкурирующие библиотеки. SQL — язык, на котором у базы просят данные. pandas — инструмент, которым вы считаете уже выгруженное. Один без другого работает, но вместе они — ежедневный цикл аналитика: SELECT забрал таблицу, pandas её свёл, отчёт уехал заказчику.

Ниже — сравнение по 8 критериям, одна задача, решённая обеими технологиями с настоящим выводом, и вердикт с условием, на котором его можно отменить.

Короткий ответ: это не «или», это конвейер

Вердикт: SQL и pandas — не соперники, а два инструмента одного конвейера. Курс pandas учит считать выгруженное, SQL — выгружать из базы. Если данных поблизости нет, вам пока нужен только второй этаж. Отсюда практический порядок: выучите сначала pandas, а SQL подключится — начните с SELECT и GROUP BY, когда таблицы переедут в базу.

Условие, при котором вердикт отменяется: если данные уже живут в базе и от вас ждут выборок на месте — первым появится SQL. Хорошая новость: GROUP BY из SQL и groupby из pandas — родные братья, поэтому второй этаж вы доберёте быстро. Проверить связку можно прямо на этой странице, чуть ниже.

SQL появится раньше, если...

  • данные уже в базе: 1С, CRM, продакшн-таблицы, склад данных;
  • от вас ждут выборок «руками из базы», а не файлов на почте;
  • вы идёте в бэкенд — урок 7 FastAPI подключает SQLite к API;
  • BI-инструменты вашей компании говорят на SQL.

Начните с pandas, если...

  • данные — файлы CSV и Excel на вашем компьютере;
  • работа — многошаговый анализ: чистка, сводные, сортировки;
  • Python знаком хотя бы на уровне переменных и функций;
  • хотите быстрой победы — первый DataFrame собирается в первом уроке.
Курс Pandas: 10 уроков

Pandas vs SQL: сравнение по 8 критериям

Метка в последней колонке — чьё преимущество в этом пункте. Без принижения: у каждой стороны честный счёт.

Сравнение SQL и pandas по восьми критериям
КритерийSQLpandasПлюс
Что это такоеЯзык запросов к реляционным базам: SELECT, WHERE, GROUP BYБиблиотека Python: таблицы-DataFrame в памяти и операции над нимиравны
Порог входаНиже: первый SELECT срабатывает через минуту, а sqlite3 уже встроен в PythonНужны основы Python: переменные, списки, функции — без них тяжелоSQL
Для когоКто работает с живой базой: аналитики у складов данных, бэкендеры, BIКто анализирует файлы у себя: выгрузки CSV и Excel на своём компьютереравны
Типичная задача«Сколько заказов в каждом городе?» — один запрос к живой базе«Прочитай CSV, почисти, сведи, отсортируй, сохрани отчёт» — многошаговый анализравны
СинтаксисДекларативный: вы описываете результат, движок сам решает, как его получитьОбычный Python: методы через точку, шаги записываются в переменныеравны
Результат работыСтроки ответа: их ещё нужно увезти в отчёт или в кодDataFrame: с ним продолжается работа — сортировка, графики, экспортpandas
Как работают вместеОтдаёт данные: read_sql выполняет ваш SELECT и возвращает таблицу pandasЗабирает выгрузку и умеет возвращать результат в базу методом to_sqlравны
Учить первымЕсли данные уже живут в базе и от вас ждут выборок на местеЕсли начинаете с файлов и анализа — наш дефолт для самоучителяpandas

Счёт честный: SQL берёт порог входа, pandas — продолжение анализа после выгрузки. Пять позиций из восьми — «равны»: инструменты разных этажей одного конвейера. Именно поэтому наш вердикт — не выбор одного, а порядок освоения.

Одна задача — обе технологии

Датасет знакомый: шесть заказов интернет-магазина из урока 2 курса pandas. Вопрос один: сколько заказов и какая выручка в каждом городе. Сначала SQL: таблица живёт в sqlite3 в памяти, ответ приносит GROUP BY.

sql — выручка по городам
import sqlite3

conn = sqlite3.connect(":memory:")
cur = conn.cursor()

cur.execute("""
    CREATE TABLE orders (
        order_id INTEGER,
        city     TEXT,
        product  TEXT,
        price    INTEGER,
        qty      INTEGER
    )
""")

cur.executemany(
    "INSERT INTO orders VALUES (?, ?, ?, ?, ?)",
    [
        (1001, "Москва", "Ноутбук", 54990, 1),
        (1002, "Казань", "Смартфон", 24990, 2),
        (1003, "Москва", "Планшет", 31990, 1),
        (1004, "Сочи", "Наушники", 8990, 3),
        (1005, "Казань", "Ноутбук", 57990, 1),
        (1006, "Москва", "Смартфон", 25990, 1),
    ],
)
conn.commit()

cur.execute("""
    SELECT city,
           COUNT(*) AS orders_count,
           SUM(price * qty) AS revenue
    FROM orders
    GROUP BY city
    ORDER BY revenue DESC
""")

for city, orders_count, revenue in cur.fetchall():
    print(city, orders_count, revenue)
Вывод
Москва 3 112970
Казань 2 107970
Сочи 1 26970
Один SELECT заменил и подсчёт, и умножение, и сортировку. ORDER BY revenue DESC поставил сверху самый доходный город — без ручных перестановок.

Теперь тот же вопрос силами pandas: read_sql выгружает таблицу из той же базы, дальше — привычный groupby с сортировкой. Вывод совпадает со SQL-версией строка в строку: данные одни, вопрос один — ответы обязаны сходиться.

pandas — выручка по городам
import sqlite3
import pandas as pd

conn = sqlite3.connect(":memory:")
conn.executescript("""
    CREATE TABLE orders (order_id, city, product, price, qty);
    INSERT INTO orders VALUES (1001, 'Москва', 'Ноутбук', 54990, 1);
    INSERT INTO orders VALUES (1002, 'Казань', 'Смартфон', 24990, 2);
    INSERT INTO orders VALUES (1003, 'Москва', 'Планшет', 31990, 1);
    INSERT INTO orders VALUES (1004, 'Сочи', 'Наушники', 8990, 3);
    INSERT INTO orders VALUES (1005, 'Казань', 'Ноутбук', 57990, 1);
    INSERT INTO orders VALUES (1006, 'Москва', 'Смартфон', 25990, 1);
""")

# та же база, другой инструмент: SQL-выгрузка -> DataFrame
df = pd.read_sql("SELECT * FROM orders", conn)

df["revenue"] = df["price"] * df["qty"]
report = (
    df.groupby("city")
      .agg(orders_count=("order_id", "count"), revenue=("revenue", "sum"))
      .sort_values("revenue", ascending=False)
)

for city, row in report.iterrows():
    print(city, row["orders_count"], row["revenue"])
Вывод
Москва 3 112970
Казань 2 107970
Сочи 1 26970
Связка read_sql -> groupby — рабочая привычка аналитика: SQL отдаёт только нужные строки, pandas доводит их до отчёта. Аналог этого groupby разобран в уроке 5 курса pandas.

Оба блока запускаются кнопкой прямо на странице: sqlite3 входит в стандартную библиотеку Python и работает в браузерной песочнице с базой :memory:, а pandas песочница подтягивает при первом запуске. Вывод в блоках — настоящий, полученный интерпретатором Python.

Где это живёт в Питонике

Отдельного курса SQL у нас нет — зато обе технологии можно попробовать бесплатно прямо в браузере. А команды pandas из блоков выше — read_sql, groupby, sort_values — собраны в шпаргалке pandas.

Курс pandas: 10 уроков

  1. Урок 2: read_csv — первый датасет магазина из шести заказов
  2. Урок 5: groupby — сводные, как GROUP BY, только в Python
  3. Урок 10: проект по продажам с выводами и отчётом
Открыть курс Pandas

SQL на этом сайте: уроки веба

  1. FastAPI, урок 7: SQLite от sqlite3 до SQLAlchemy
  2. Flask, урок 5: база гостевой книги, SQL vs ORM
  3. BeautifulSoup, урок 7: складываем спарсенное в sqlite3
Открыть урок FastAPI про SQLite

Частые вопросы: pandas или SQL

По умолчанию — pandas: он закрывает весь цикл анализа файлов на вашем компьютере, от read_csv до готового отчёта, и живёт внутри Python, который вы уже учите. SQL подключается, когда данные обнаруживаются в базе: тогда первым рабочим инструментом становится SELECT с GROUP BY — язык, который выгружает для pandas исходную таблицу. Спорить стоит не о том, «что лучше», а о порядке: обе технологии нужны.

Нет. pandas работает с данными, которые уже выгружены в память вашего процесса: миллион строк — пожалуйста, гигабайты с боевого сервера — уже нет. Спросить что-то у настоящей базы можно только на её языке, то есть на SQL. В обратную сторону тоже честно: SQL не заменяет pandas — результат запроса ещё нужно дочистить, свести и оформить, и это территория pandas.

pd.read_sql: ей отдают текст запроса и открытое соединение — ровно так, как во втором блоке на этой странице: pd.read_sql("SELECT * FROM orders", conn), где conn получен через sqlite3.connect(":memory:"). Для базы в файле замените :memory: на путь — sqlite3.connect("shop.db"). Чтение CSV в DataFrame и первые проверки размеров разобраны в уроке 2 курса pandas.

Отдельного курса SQL в Питонике нет, и притворяться, что он есть, мы не будем. SQL появляется там, где он нужен по делу: в уроке 7 FastAPI подключают SQLite к API — от sqlite3, CREATE TABLE и SELECT до SQLAlchemy, а в уроке 5 Flask строят гостевую книгу на SQLite и Flask-SQLAlchemy. Оба урока бесплатные и с запускаемым кодом.

Да, у DataFrame есть документированный метод to_sql: он создаёт таблицу в базе и записывает туда строки DataFrame. Но честно: в уроках Питоники to_sql пока не разбирается, поэтому демонстрировать его на нашем коде мы не станем. Чтение в обратную сторону — pd.read_sql — работает прямо на этой странице, а запись данных через sqlite3 разобрана в уроках FastAPI и Flask.

Что почитать ещё

Попробуйте обе технологии за один вечер

Пройдите первый урок pandas и урок FastAPI про SQLite: интерпретатор уже встроен в страницы, регистрация не нужна. За вечер вы увидите оба этажа конвейера своими глазами.

уроки с кодом на странице sqlite3 и pandas работают в песочнице прогресс и XP бесплатно