Короткий ответ
Единственного правильного решения нет: монолитный pipeline в памяти проще и быстрее для небольших и стабильных расчётов, а модульные шаги с промежуточным сохранением лучше подходят для больших, долго выполняющихся или часто отлаживаемых пайплайнов — выбор зависит от объёма данных, частоты сбоев и потребности в отладке отдельных этапов.
Как это работает подробнее
монолитный подход выполняет все преобразования от сырых данных до финального результата в одном скрипте без сохранения промежуточных состояний, что проще писать и быстрее исполнять за счёт отсутствия лишнего ввода-вывода; модульный подход сохраняет результат каждого значимого шага на диск (parquet/csv), что позволяет перезапускать только упавший или изменившийся шаг, не пересчитывая всё с начала, и облегчает отладку через инспекцию промежуточных файлов.
Пример кода
import pandas as pd
# модульный шаг 1: очистка
raw = pd.DataFrame({'id': [1, 2, 2], 'amount': [100, None, 50]})
cleaned = raw.drop_duplicates(subset=['id']).dropna(subset=['amount'])
cleaned.to_parquet('step1_cleaned.parquet')
# модульный шаг 2: агрегация (можно перезапустить отдельно от шага 1)
cleaned_reloaded = pd.read_parquet('step1_cleaned.parquet')
summary = cleaned_reloaded['amount'].sum()
print(summary)Что использовать на практике
- На практике. для небольших и быстрых расчётов (секунды-минуты) монолитный подход обычно предпочтительнее из-за простоты; для длительных расчётов (десятки минут и часы) или нестабильных источников данных модульность с промежуточным сохранением снижает цену сбоя и упрощает диагностику, на каком именно шаге появилась проблема в данных.
- Проверка. если шаг агрегации упадёт из-за ошибки в логике, его можно перезапустить заново, читая уже сохранённый step1_cleaned.parquet, не повторяя заново более затратный шаг очистки исходных данных.
Подводные камни
- Частые ошибки. делают монолитный pipeline для тяжёлого многочасового расчёта, из-за чего любой сбой в конце требует полного перезапуска с начала; или наоборот — чрезмерно дробят простую и быструю задачу на множество промежуточных файлов, создавая ненужные накладные расходы на ввод-вывод и усложняя понимание общего потока данных.