Data и ИИБэкендPythonSQL

DuckDB + Python: анализируем CSV через SQL без отдельного сервера

Читаем CSV прямо из DuckDB, фильтруем строки SQL-запросом, считаем выручку и получаем pandas DataFrame без настройки отдельной базы данных.

Кодик

Автор

6 мин чтения

DuckDB можно освоить на одном небольшом проекте, если сразу видеть вход, действие и результат. DuckDB запускается внутри Python-процесса и умеет читать CSV напрямую, поэтому для первого аналитического запроса не нужен сервер базы данных. Ниже вы соберёте работающий пример и проверите обычный и граничный сценарии.

Начинающий аналитик часто тратит больше времени на импорт файла и настройку СУБД, чем на сам вопрос к данным. Поэтому отделим настройку, входные данные, основное действие и проверку. В этой статье вы соберёте скрипт, который читает продажи из CSV, группирует их по категории и возвращает аккуратную таблицу. Проверка: запрос считает одинаковую сумму при повторном запуске, пропускает пустые значения по заданному правилу и показывает три строки результата.

1Соберите минимум

создать sales.csv с заголовками category, price и quantity. Не расширяйте проект до первого успешного запуска.

2Увидьте данные

фильтр оставляет только строки с положительным количеством. Проверяйте значение, а не отсутствие ошибки.

3Измените правило

После успеха добавьте категорию с двумя продажами и заранее посчитайте ожидаемую сумму. Так копирование станет практикой.

Как устроен учебный проект DuckDB

CSV остаётся исходным файлом, DuckDB выполняет SQL локально, а Python отвечает за запуск запроса и дальнейшую обработку результата. Держите ввод, логику и отображение раздельно: тогда каждый этап можно проверить отдельно.

ЭтапДействиеПроверяемый результат
Файлсоздать sales.csv с заголовками category, price и quantityCSV читается как таблица с понятными типами
Запроспроверить данные через SELECT и WHEREфильтр оставляет только строки с положительным количеством
Агрегациясгруппировать категории и посчитать price * quantitySQL возвращает сумму и число заказов по категории
Результатполучить DataFrame и отсортировать значенияв консоли видна итоговая таблица без запуска сервера

Контрольные точки: файл, запрос, агрегация и результат. Следующий шаг начинается после совпадения с ожидаемым результатом.

Путь данных в проекте DuckDB
От входных данных до видимого результата. Сначала проверяется вход, затем действие и только потом интерфейс.

Зафиксируйте первый успех Сначала выполните SELECT * FROM read_csv_auto('sales.csv') LIMIT 3 и проверьте имена и типы колонок до агрегации. Сохраните команду запуска и ожидаемый вывод.

Собираем рабочий пример шаг за шагом

Пример сверялся с актуальной документацией официальной документации DuckDB Python API на 19 октября 2026 года. Создайте окружение командой uv init, затем добавьте зависимости: uv add duckdb pandas. Проверьте текущую папку через pwd или Get-Location. Вставьте пример целиком, выполните один раз, затем разбирайте по частям.

import duckdb

query = """
SELECT
    category,
    COUNT(*) AS orders,
    ROUND(SUM(price * quantity), 2) AS revenue
FROM read_csv_auto('sales.csv')
WHERE quantity > 0 AND price IS NOT NULL
GROUP BY category
ORDER BY revenue DESC
"""

result = duckdb.sql(query).df()
print(result)
print("total:", round(result["revenue"].sum(), 2))
Что должно произойти после запуска
  • Таблица содержит колонки category, orders и revenue.
  • Категории отсортированы от большей выручки к меньшей, а итог совпадает с суммой строк.
  • Повторный запуск даёт тот же предсказуемый результат.
  • Пустой ввод получает понятное сообщение вместо падения.

SQL описывает преобразование данных, DuckDB выполняет его, а метод .df() передаёт небольшой итог в pandas. Найдите в примере вход, проверку и место формирования результата.

Хрупкий и проверяемый вариант DuckDB
Что отличает устойчивый проект от случайного запуска. Явные границы делают ошибку локальной и понятной.

Что происходит внутри и почему это работает

read_csv_auto создаёт табличное представление файла и пытается определить типы колонок. Фильтр выполняется до группировки, поэтому некорректные строки не попадают в сумму. Логику держите отдельно от вывода: функция получает аргумент и возвращает значение, а интерфейс показывает его. Для больших файлов выгоднее сначала выбрать нужные колонки и агрегировать их в DuckDB, а не загружать весь CSV в pandas.

ЧастьЗа что отвечаетЧто проверить
Источникread_csv_auto читает CSV и определяет схемуназвания, разделитель и типы совпадают с ожиданием
SQLWHERE очищает поток, GROUP BY собирает категорииручная сумма двух строк совпадает с запросом
Pythonзапускает запрос и получает небольшой итоговый DataFrameповторный запуск не зависит от старого состояния

Автоматическое определение типов удобно для старта, но не является обещанием качества данных. Если в колонке price встречается слово, тип может измениться или чтение завершится ошибкой. Для устойчивого проекта задавайте типы явно и храните проверку схемы рядом с запросом. Не прячьте поток в одном обработчике: сохраните вход, проверьте его, вызовите операцию и только затем обновите интерфейс.

Проверьте границу Добавьте строку с количеством 0 и убедитесь, что она не увеличила ни число заказов, ни выручку. Меняйте одно условие за прогон, чтобы видеть причину.

Проверяем проект и добавляем свою функцию

Добавьте колонку date и второй запрос, который считает выручку по месяцам. Не меняйте исходный CSV во время выполнения программы. До правки запишите ожидаемое поведение одним предложением. После граничного теста повторите обычный сценарий.

Проверка своими руками
  1. Сохраните ожидаемый результат: запрос считает одинаковую сумму при повторном запуске, пропускает пустые значения по заданному правилу и показывает три строки результата.
  2. Измените правило: добавьте категорию с двумя продажами и заранее посчитайте ожидаемую сумму. Сначала предскажите итог.
  3. Передайте граничное значение и убедитесь, что приложение не падает.
  4. Верните корректные данные и объясните роли трёх основных частей.
Готово, если выполняются все пункты
  • CSV читается как таблица с понятными типами
  • фильтр оставляет только строки с положительным количеством
  • SQL возвращает сумму и число заказов по категории
  • в консоли видна итоговая таблица без запуска сервера

DuckDB особенно полезен, когда SQL должен обработать много строк, а в Python нужен только компактный итог. Полезная правка проходит от нового ввода до видимого результата.

Четыре контрольные точки DuckDB
Четыре проверки перед следующим шагом. Каждый следующий этап начинается после наблюдаемого результата.

Что запомнить и куда двигаться дальше

Следующий шаг - сохранить запрос в отдельный файл, указать типы CSV и добавить проверку контрольной суммы. Сервер понадобится только когда данные и доступ должны разделять разные процессы и пользователи. Для закрепления откройте в разборе CSV через pandas, в статье про COUNT и в статье про ORDER BY.

Как изучить тему в Кодике

Сначала закрепите SELECT, WHERE, GROUP BY и ORDER BY на пяти строках, затем переносите запрос на большой CSV. Сначала восстановите главную функцию и проверьте её на трёх значениях.

ШагЧто разобратьМини-проверка
1. ОсноваТаблицы, типы, NULL и арифметику в SQLОбъясните вход и выход функции.
2. Инструментread_csv_auto, DESCRIBE и получение DataFrameПовторите команду по памяти.
3. ПроектАгрегацию продаж с фильтром и сортировкойПроверьте два сценария.
4. РефакторингЯвную схему CSV и тест контрольной суммыРазделите ввод, логику и вывод.

Если итог неверен, проверяйте не pandas, а количество строк после каждого SQL-этапа. Базовый синтаксис закрепите через курс SQL.

Неверная текущая папка

DuckDB не находит sales.csv. Печатайте абсолютный путь или запускайте скрипт из корня проекта.

Сумма текстовых значений

Цена прочитана как VARCHAR из-за грязной строки. Проверьте DESCRIBE и задайте тип.

NULL в вычислении

Любая арифметика с NULL даёт NULL. Определите правило: исключить строку или подставить значение.

SELECT * на огромном CSV

Передача всех строк в pandas тратит память. Сначала фильтруйте и агрегируйте в SQL.

Сверяйтесь с первичной документацией. Команды и ограничения примера проверены по официальной документации DuckDB Python API. Если версия инструмента изменилась, официальный источник важнее старого скриншота.

Что получится в итоге

Готовый результат проекта: DuckDB + Python: анализируем CSV через SQL без отдельного сервера
Так выглядит законченный учебный проект: есть понятный вход, видимый результат, защита от неверных данных и место для следующего улучшения.

Короткие ответы
Нужен ли отдельный сервер для DuckDB в этом примере?

Нет. База работает внутри Python-процесса и читает локальный файл напрямую.

Почему фильтр стоит до GROUP BY?

Он исключает некорректные строки до подсчёта количества и суммы.

Что проверять первым, если DuckDB не запускается?

Версию среды, текущую папку, команду запуска и первую строку ошибки.

Как понять, что проект DuckDB работает?

Проверьте основной сценарий, неверный ввод, повторный запуск и один граничный случай.

Можно ли начать с готового кода?

Да. Добейтесь результата, измените одно правило и восстановите ключевую функцию без копирования.

Сделайте один осознанный шаг дальше

Выберите одно улучшение и проведите его от ввода до результата.

Если не хватает основы, перейдите курс SQL, затем восстановите ключевую функцию без подсказки.