def split_to_segments(csv_text: str, yaml_doc): csv_rows = read_csv(csv_text) segment_definitions = InstructionSet(yaml_doc).by_segment for pdef in segment_definitions: start, end = pdef.select_applicable_boundaries(csv_rows) csv_segment = pop_rows(csv_rows, start, end) yield csv_segment, pdef yield csv_rows, InstructionSet(yaml_doc).default
def test_parsers(): doc2 = """Объем ВВП, млрд.рублей / Gross domestic product, bln rubles 1999 4823 901 1102 1373 1447 2000 7306 1527 1697 2038 2044""" csv_rows = read_csv(doc2) tables = list(split_to_tables(csv_rows)) t1 = u(r1(tables[0])) datapoints = [x for x in t1.yield_values()] assert datapoints[0] == { 'freq': 'a', 'label': ('GDP', 'bln_rub'), 'time_index': pd.Timestamp('1999-12-31'), 'value': 4823 } assert datapoints[1] == { 'freq': 'q', 'label': ('GDP', 'bln_rub'), 'time_index': pd.Timestamp('1999-03-31'), 'value': 901 } assert datapoints[2] == { 'freq': 'q', 'label': ('GDP', 'bln_rub'), 'time_index': pd.Timestamp('1999-06-30'), 'value': 1102 } assert datapoints[3] == { 'freq': 'q', 'label': ('GDP', 'bln_rub'), 'time_index': pd.Timestamp('1999-09-30'), 'value': 1373 } assert datapoints[4] == { 'freq': 'q', 'label': ('GDP', 'bln_rub'), 'time_index': pd.Timestamp('1999-12-31'), 'value': 1447 }
def make(csv_text: str): rows = read_csv(csv_text) return list(split_to_tables(rows))
'млн.кв.м общей площади': 'mln_m2', '% к соответствующему периоду предыдущего года': 'yoy' }) tables = make(doc) for x in [u, r1, r2]: tables = map(x, tables) tables = list(tables) assign_trailing_units(tables, required1) assert includes_required(tables, required1) for t in tables: t.set_reader() values = list(yield_values(tables)) #test 2 csv_rows = read_csv(doc) tables2 = render(csv_rows, unit_dict={ 'млрд.рублей': 'bln_rub', 'млн.кв.м общей площади': 'mln_m2', '% к соответствующему периоду предыдущего года': 'yoy' }, headers_dict={ 'GDP': ['Валовый внутренний продукт', 'Объем ВВП'], 'DWELL': ['Ввод в действие жилых домов организациями'] }, required={ 'GDP': ['bln_rub', 'yoy'], 'DWELL': ['mln_m2'] },
pdef = Instruction( boundaries=[ dict(start='1.6. Инвестиции в основной капитал', end='1.6.1. Инвестиции в основной капитал организаций'), dict(start='1.7. Инвестиции в основной капитал', end='1.7.1. Инвестиции в основной капитал организаций') ], commands=[ dict(var='INVESTMENT', header=['Инвестиции в основной капитал'], unit=['bln_rub', 'yoy', 'rog']) ], ) # actions tables = render(read_csv(csv_text), units, pdef.headers_dict, pdef.required, pdef.reader) # checks def test_check_parsing_result(): assert len(tables) == 3 assert [t.unit for t in tables] == ['bln_rub', 'yoy', 'rog'] assert [t.name for t in tables] == ['INVESTMENT'] * 3 if __name__ == "__main__": import pytest pytest.main([__file__])
в % к соответствующему периоду предыдущего года / percent of corresponding period of previous year 1999 105,3 93,8 99,2 105,0 117,4 92,2 93,8 95,1 94,7 99,2 102,9 102,1 101,9 111,1 114,8 112,1 122,6 """ required1 = {'GDP': ['bln_rub', 'yoy'], 'DWELL': ['mln_m2']} r1 = var_parser(name='GDP', headers=['Валовый внутренний продукт', 'Объем ВВП']) r2 = var_parser(name='DWELL', headers=['Ввод в действие жилых домов организациями']) u = unit_parser({ 'млрд.рублей': 'bln_rub', 'млн.кв.м общей площади': 'mln_m2', '% к соответствующему периоду предыдущего года': 'yoy' }) csv_rows = read_csv(doc) tables = list(split_to_tables(csv_rows)) for x in [u, r1, r2]: tables = map(x, tables) tables = list(tables) assign_trailing_units(tables, required1) for t in tables: t.set_reader() values = [x for t in tables for x in t.yield_values()] tables2 = render(csv_rows, unit_dict={ 'млрд.рублей': 'bln_rub', 'млн.кв.м общей площади': 'mln_m2', '% к соответствующему периоду предыдущего года': 'yoy' },