Этот репозиторий содержит скрипты для загрузки, очистки, нормализации и подготовки данных из открытых источников Москвы для дальнейшего использования в хранилище данных (DWH).
-
01_mos_data_fetch.ipynb— скрипт для загрузки данных с портала открытых данных Москвы. Загруженные данные сохраняются вdatasets/..._raw.csv. -
02_wiki_districts_extract_transform.ipynb— скрипт для парсинга таблицы районов Москвы из Википедии. Результат сохраняется вdatasets/districts_cleaned.csv. -
03-05_*.ipynb— серия ноутбуков, содержащих этапы очистки и приведения к единому формату для дальнейшей нормализации. Данные сохраняются вdatasets/..._cleaned.csv. -
06_data_normalization.ipynb— процесс нормализации всех очищенных данных. На выходе формируются фактовые и справочные таблицы, сохраняемые в папкуdwh.
- Python >= 3.8.10
- requirements.txt
- bike_parking_raw.csv - датасет велопарковок (ID 916)
- sports_halls_raw.csv - датасет спортивных залов (ID 60622)
- dog_parks_raw.csv - датасет площадок для выгула собак (ID 2663)
- districts_cleaned.csv - датасет, составленный на основе данных из Википедии
- bike_parking_cleaned.csv
- sports_halls_cleaned.csv
- dog_parks_cleaned.csv
Почти все фактовые таблицы связаны со справочными таблицами через связи типа «многие к одному»: одна запись в справочнике может соответствовать нескольким записям в фактовой таблице. Это обеспечивает нормализацию данных и снижает избыточность.
Исключение составляет таблица dog_park, которая дополнительно связана с таблицей dog_park_elements отношением «один ко многим»: одному объекту из dog_park может соответствовать несколько элементов оборудования в dog_park_elements. Такая структура позволяет сохранить атомарность данных в таблице dog_park и вынести многозначные характеристики (элементы площадки) в отдельную таблицу.
- adm_areas_dict.csv (adm_area_id, adm_area_short, adm_area_full)
- bike_park_org.csv (org_id, org_phone)
- disability_access_dict.csv (disability_friendly, disability_friendly_id)
- dog_park_elements.csv (dog_park_id, element_id)
- dog_park_elements_dict.csv (element_name, element_id)
- lighting_types_dict.csv (lighting, lighting_id)
- parks_dict.csv (park_global_id, park_name, park_id)
- surface_types_dict.csv (surface_type_winter, surface_type_winter_id)
- winter_services_dict.csv (services_winter, services_winter_id)
- orgs_dict.csv (email, website, help_phone, org_id)
- districts.csv (district_id, district, area_km2, population, population_dens, living_area, living_area_dens, population_trend, adm_area_id)
- bike_parking.csv (global_id, id, bike_parking_name, address, capacity, longitude, latitude, district_id, org_id)
- sports_hall.csv (global_id, object_name, name_winter, address, has_equipment_rental, has_tech_service, has_dressing_room, has_eatery, has_toilet, has_wifi, has_cash_machine, has_first_aid_post, has_music, usage_period_winter, seats, paid, longitude, latitude, mon, tue, wed, thu, fri, sat, sun, length, width, square, district_id, org_id, lighting_id, surface_type_winter_id, disability_friendly_id, services_winter_id)
- dog_park.csv (address, dog_park_area, lighting, fencing, longitude, latitude, mon, tue, wed, thu, fri, sat, sun, dog_park_id, department_id, park_id, district_id)
Архитектура разбита на этапы: загрузка — очистка — нормализация — хранение. Каждый этап реализован вручную в Jupyter-ноутбуках, но при масштабировании может быть перенесён в автоматизированный пайплайн под управлением Apache Airflow.
На текущем этапе данные на всех этапах ETL сохраняются в виде CSV-файлов (папки datasets/ и dwh/). Однако архитектура проекта предполагает возможность интеграции с СУБД — например, PostgreSQL для хранения сырых и нормализованных таблиц или ClickHouse для аналитических запросов на витринах. Подключение БД не реализовано в рамках данного прототипа, но учтено в структуре потока данных.
Выбор инструментов продиктован открытостью исходных данных, объёмом загрузки и требованиями к последующей аналитике. Используются широко применяемые open-source решения.
-
ETL: Apache Airflow для оркестрации пайплайнов; pandas и SQLAlchemy для обработки и загрузки данных.
-
Хранилище данных:
- PostgreSQL — для хранения сырых, очищенных и нормализованных данных.
- ClickHouse — в случае необходимости масштабирования по объёму данных или скорости аналитических запросов.
-
Визуализация и мониторинг: Superset (дашборды на основе витрин данных), Grafana (мониторинг ETL-процессов и метрик качества данных).
В рамках демонстрации пайплайны реализованы вручную (в ноутбуках), однако в реальной системе предполагается использование Apache Airflow для автоматизации, ClickHouse — для хранения агрегатов, Superset — для построения дашбордов.
- Количество загруженных строк из каждого источника.
- Время выполнения каждого этапа (extract, transform, load).
- Ошибки загрузки (например, падение парсера, таймауты).
- Объем данных в каждой зоне (raw, cleaned, normalized).
- Актуальность данных (время последней успешной загрузки).
- Количество пропущенных записей или неконсистентных ключей.
Эти показатели можно отобразить в Grafana по логам Airflow. Также по этим метрикам настраиваются оповещения — например, при сбое загрузки, появлении orphan-записей или превышении допустимого уровня пропущенных значений.
- Процент NULL-значений в критичных колонках (например, longitude, latitude, capacity).
- Согласованность ключей между таблицами (district_id, adm_area_id, и т.п.).
- Аномалии — например, отрицательные площади, координаты вне границ Москвы.
- Проверка справочников — нет ли orphan-записей в фактах.
- Плотность данных — сколько строк на район, на парк, на организацию.
- ETL Pipeline Dashboard: загрузка по датасетам, ошибки, время, размер.
- Data Quality Overview: null-значения, нарушения связей, некорректные значения.
- Плотность покрытия: количество парковок/спортзалов/площадок по районам или округам (если возможно, то отображение на карте Москвы).
- Обновление данных: мониторинг, когда последний раз обновлялись те или иные наборы.
- Данные о транспортной доступности: расстояние до метро или до остановки общественного транспорта.
- Экология/загрязнение воздуха: уровень загрязнения в районе.
- Плотность инфраструктуры количество, плотность и рейтинги ближайших объектов (кафе, магазины, достопримечательности).
- Богатство процент безработных, данные о доходах и возрастной структуре населения по районам Москвы.

