проверяем правильность при помощи контрольных значений
Комментарий к исходным данным и алгоритму
Исходные данные в CSV файле были записаны из файлов Word (делается тут и только под Windows, сейчас не рассматриваем). В этом СSV файле, как правило, идет название таблицы, размерность, сама таблица, другая размерность, еще таблица и так далее.
Структура этих данных нечеткая:
иногда название размерности указано в заголовке таблицы, иногда отдельным подзаголовком
иногда заголовок задает группу показателей (например, "Налоги"), а подзаголовки -
конкретные показатели (такой налог или другой), для которых потом еще и меняется размерность
(млрд. руб и % доходов бюджета всего).
всякие другие дикие случаи форматирования таблиц c примечаниями и прочими ужасами
от месяца к месяцу заголовки таблиц и их структура может немного или сильно поменяться
Исходя из кривизны данных были приняты решения:
дампим файлы из Ворда в CSV, дальше разбираемся с файлом CSV
не строим иллюзий относительнос структурированности данных в этом CSV
разбираем CSV строку за строкой, модифицируя привязку строк к названиям переменных
альтернатива - восстановить структуру документа в виде заголовок, подзаголовок, таблица данных,
но есть ощущение, что это тупиковое решение - слишком кривая и нестабильная структура таблиц.
Что еще выяснилось при реалзации:
чтобы вытащить все переменные нужно разбивать CSV на сегменты и применять к сегментам
свои параметры парсинга.
на данном этапе мы применяем только набор параметров парсинга
CSV файл обернут классом CSV_Reader(path) в
kep2.csv_data
строки файлы выплевываются методом .yield_dicts() в виде словарей с ключами head, data, label
мы отошли от правила использовать ридер стандартной библиотеки csv, так как файл кривой
и желательно на более низком уровне понимать, что мы читаем
2. параметры парсинга (parsing_defintions.py)
параметры парсинга сохранены в виде YAML файлов в директории parsing_definitions
история формата этих файлов такова - нужен простой способ привязать заголовки таблиц к названиям переменных и их размерности,
генерировался закомментированный список заголовков, который вручную размечался как YAML файл.
параметры парсинга загружаются из файла через класс ParsingDefinition(path) в
parsing_defintions.py
Datapoints(row_dicts, spec).emit(freq) генерирует итоговые данные (заменяет функцию входаstream_by_freq())
Основные шаги:
label_rows():
просматриваем CSV на предмет заголовков из параметров парсинга
модифицируем название текущей переменной иcходя из привязки заголовков к названию переменной и размерности
считаем, текущая переменная из заголовка распространяется на ряды данных под заголовком
получаем привязку строк к названиям переменных
get_datapoints():
разбираем строки на годовые, квартальные и месячные данные
Datapoints().emit():
возвращаем эти данные в формате \<имя переменной> - \<год, квартал или месяц> - \<значение>
Что поменялось в коде:
вынес метки в label.py
добавлены функции разбора ряда split*
добавлен более полный разбор значений в ячейке filter_value()
4. проверяем правильность (reader.py)
сейчас end-to-end тестиирование это файл reader.py
проверку предлагается сделать скучным ручным способом - взять по одному значению из каждого ряда
и проверить, если ли оно в итоговых данных, это надо сделать для годовых, месячных и квартальных данных
сейчас проверка не срабатывает в двух местах в начале файла мы получаем разные значения для одной и той же переменной
это происзодит из-за того, что по какой-то причине не перещелкивается размерность показателя.
Что делает этот конкретный модуль
Ежемесячный парсинг основной публикации Росстата "Краткосрочные экономические показатели" с проверкой правильности данных
Сценарий работы модуля
Комментарий к исходным данным и алгоритму
Исходные данные в CSV файле были записаны из файлов Word (делается тут и только под Windows, сейчас не рассматриваем). В этом СSV файле, как правило, идет название таблицы, размерность, сама таблица, другая размерность, еще таблица и так далее.
Структура этих данных нечеткая:
Исходя из кривизны данных были приняты решения:
Что еще выяснилось при реалзации:
Куски сценария и модули программы
Текущая ветка: https://github.com/epogrebnyak/data-rosstat-kep/tree/kep2/kep2
1. исходные данные из CSV файла (csv_data.py))
CSV_Reader(path)
в kep2.csv_data.yield_dicts()
в виде словарей с ключами head, data, labelcsv
, так как файл кривой и желательно на более низком уровне понимать, что мы читаем2. параметры парсинга (parsing_defintions.py)
ParsingDefinition(path)
в parsing_defintions.py3. генерируем итоговые данные (datapoints.py)
Datapoints(row_dicts, spec).emit(freq)
генерирует итоговые данные (заменяет функцию входаstream_by_freq()
)Основные шаги:
Datapoints().emit():
Что поменялось в коде:
4. проверяем правильность (reader.py)