Проблема
Каждое утро менеджеры выгружают из 1С Excel-файлы. В них — объединённые ячейки, плавающие заголовки (то на 3-й строке, то на 7-й), даты в трёх разных форматах (01.02.2025, 01.02.2025 14:30:00, 2025-02-01). Аналитики тратят 2+ часа на ручную чистку, прежде чем данные можно будет использовать в отчётах. Знакомо?
Что сделали?
Разработали ETL-пайплайн на Apache Airflow, который:
- Ежедневно проверяет наличие файла за предыдущий день.
- Автоматически находит строку с заголовками, даже если она не первая.
- Нормализует даты и числа.
- Загружает данные в PostgreSQL — чистыми, без дублей, с контролем ошибок.
Результат
✅ Обрабатывается 50K+ строк в день.
✅ Время чистки сократилось с 2 часов до 15 минут.
✅ Ошибки загрузки: 0 (Airflow автоматически перезапускает упавшие задачи).
✅ Аналитики наконец-то работают с инсайтами, а не с Excel.
✅ Время чистки сократилось с 2 часов до 15 минут.
✅ Ошибки загрузки: 0 (Airflow автоматически перезапускает упавшие задачи).
✅ Аналитики наконец-то работают с инсайтами, а не с Excel.
Архитектура
1С (Excel) → Airflow DAG → PostgreSQL (staging_client_orders)
↓
автоопределение заголовков
↓
нормализация и загрузкаВсё поднято в Docker: одна команда docker-compose up -d — и готово.
Ключевой фрагмент кода (автоопределение заголовков):
Ключевой фрагмент кода (автоопределение заголовков):
for i in range(min(10, len(df))):
row = df.iloc[i].astype(str)
if 'Клиент' in row.values or 'Заказ клиента.Номер' in row.values:
df = pd.read_excel(file_path, header=i)
print(f'Заголовки найдены на строке {i}')
breakНормализация дат (поддержка нескольких форматов):
def parse_date(date_value):
for fmt in ['%d.%m.%Y %H:%M:%S', '%d.%m.%Y', '%Y-%m-%d']:
try:
return datetime.strptime(str(date_value), fmt).date()
except:
continue
return NoneИдемпотентная загрузка в PostgreSQL (ON CONFLICT):
INSERT INTO staging_client_orders (...) VALUES (%s)
ON CONFLICT (order_number, load_date) DO NOTHING;Весь код открыт на GitHub: https://github.com/olkhovii/data-engineer-portfolio
Что дальше?
Подключаем API Яндекса (Метрика + Директ) и Google Sheets — чтобы все маркетинговые данные были в едином DWH. Следите за обновлениями.