From 84069e4e4102a9bcb898a7b3923a1ef3e49a0dcd Mon Sep 17 00:00:00 2001 From: Maksim Date: Tue, 2 Sep 2025 07:15:16 +0300 Subject: [PATCH] ch --- .gitignore | 18 +---- .../__pycache__/__init__.cpython-313.pyc | Bin 172 -> 0 bytes .../__pycache__/pconfig.cpython-313.pyc | Bin 8206 -> 0 bytes .../__pycache__/storage.cpython-313.pyc | Bin 7366 -> 0 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 382 -> 0 bytes .../monitoring_fuel.cpython-313.pyc | Bin 11198 -> 0 bytes .../__pycache__/svodka_ca.cpython-313.pyc | Bin 16493 -> 0 bytes .../__pycache__/svodka_pm.cpython-313.pyc | Bin 13658 -> 0 bytes .../adapters/parsers/monitoring_fuel.py | 75 +++++++++++++----- python_parser/adapters/parsers/svodka_pm.py | 29 ++----- python_parser/adapters/pconfig.py | 65 ++++++++++++++- .../app/__pycache__/__init__.cpython-313.pyc | Bin 167 -> 0 bytes .../app/__pycache__/main.cpython-313.pyc | Bin 18405 -> 0 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 615 -> 0 bytes .../monitoring_fuel.cpython-313.pyc | Bin 1690 -> 0 bytes .../__pycache__/server.cpython-313.pyc | Bin 1401 -> 0 bytes .../__pycache__/svodka_ca.cpython-313.pyc | Bin 1635 -> 0 bytes .../__pycache__/svodka_pm.cpython-313.pyc | Bin 3122 -> 0 bytes .../__pycache__/upload.cpython-313.pyc | Bin 2611 -> 0 bytes python_parser/app/schemas/monitoring_fuel.py | 16 ++++ .../core/__pycache__/__init__.cpython-313.pyc | Bin 168 -> 0 bytes .../core/__pycache__/models.cpython-313.pyc | Bin 2536 -> 0 bytes .../core/__pycache__/ports.cpython-313.pyc | Bin 5953 -> 0 bytes .../core/__pycache__/services.cpython-313.pyc | Bin 5502 -> 0 bytes 24 files changed, 141 insertions(+), 62 deletions(-) delete mode 100644 python_parser/adapters/__pycache__/__init__.cpython-313.pyc delete mode 100644 python_parser/adapters/__pycache__/pconfig.cpython-313.pyc delete mode 100644 python_parser/adapters/__pycache__/storage.cpython-313.pyc delete mode 100644 python_parser/adapters/parsers/__pycache__/__init__.cpython-313.pyc delete mode 100644 python_parser/adapters/parsers/__pycache__/monitoring_fuel.cpython-313.pyc delete mode 100644 python_parser/adapters/parsers/__pycache__/svodka_ca.cpython-313.pyc delete mode 100644 python_parser/adapters/parsers/__pycache__/svodka_pm.cpython-313.pyc delete mode 100644 python_parser/app/__pycache__/__init__.cpython-313.pyc delete mode 100644 python_parser/app/__pycache__/main.cpython-313.pyc delete mode 100644 python_parser/app/schemas/__pycache__/__init__.cpython-313.pyc delete mode 100644 python_parser/app/schemas/__pycache__/monitoring_fuel.cpython-313.pyc delete mode 100644 python_parser/app/schemas/__pycache__/server.cpython-313.pyc delete mode 100644 python_parser/app/schemas/__pycache__/svodka_ca.cpython-313.pyc delete mode 100644 python_parser/app/schemas/__pycache__/svodka_pm.cpython-313.pyc delete mode 100644 python_parser/app/schemas/__pycache__/upload.cpython-313.pyc delete mode 100644 python_parser/core/__pycache__/__init__.cpython-313.pyc delete mode 100644 python_parser/core/__pycache__/models.cpython-313.pyc delete mode 100644 python_parser/core/__pycache__/ports.cpython-313.pyc delete mode 100644 python_parser/core/__pycache__/services.cpython-313.pyc diff --git a/.gitignore b/.gitignore index 8722ece..4e1e95e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,20 +1,8 @@ # Python __pycache__ -__pycache__/ -python_parser/__pycache__/ -python_parser/core/__pycache__/ -python_parser/adapters/__pycache__/ -python_parser/tests/__pycache__/ -python_parser/tests/test_core/__pycache__/ -python_parser/tests/test_adapters/__pycache__/ -python_parser/tests/test_app/__pycache__/ -python_parser/app/__pycache__/ -python_parser/app/schemas/__pycache__/ -python_parser/app/schemas/test_schemas/__pycache__/ -python_parser/app/schemas/test_schemas/test_core/__pycache__/ -python_parser/app/schemas/test_schemas/test_adapters/__pycache__/ -python_parser/app/schemas/test_schemas/test_app/__pycache__/ +*.pyc +nin_python_parser *.py[cod] *$py.class @@ -169,5 +157,3 @@ node_modules/ npm-debug.log* yarn-debug.log* yarn-error.log* - -__pycache__/ diff --git a/python_parser/adapters/__pycache__/__init__.cpython-313.pyc b/python_parser/adapters/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index af840e817ca7d488457e8b605b9d08c50de413c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmey&%ge<80@v1LfT+hH0tOhNjL$4U##DxM22Do4l?+8pK;CDN)GcpktC-N@)S}`T z-^A=<-KrRu)Z*-t{DPQ*%94!yy!e8|BA{%1avG{YOkzr6K?z7(e0*kJW=VX!UP0w8 f4x8Nkl+v73yCPPg*&w@%L5z>gjEsy$%s>_ZAR;Zp diff --git a/python_parser/adapters/__pycache__/pconfig.cpython-313.pyc b/python_parser/adapters/__pycache__/pconfig.cpython-313.pyc deleted file mode 100644 index 34fa65daaf59b3d45658af0d60abbe9c1e495e8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8206 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 fTM1j@Q>7CuxYGq_d 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 Y8SgR}-eph)qE9R=+)Rz^MchCc08Z#^5&!@I diff --git a/python_parser/adapters/parsers/__pycache__/monitoring_fuel.cpython-313.pyc b/python_parser/adapters/parsers/__pycache__/monitoring_fuel.cpython-313.pyc deleted file mode 100644 index c8ed95cf09443ad07dd3068702aaf0a83f54e115..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11198 zcmcIqYj9KNnLfJTEK9a**^+ILx!A~n!*vp98=7EffIx^30v8(;A<4FgESYm8ZrN=p zX;RZF)8-Gq76LT8-I>ik?{{?M zOGT1D`+0oMcfR}WectDNKizh_odUw=>gE1T?Sk+p`p|==7`c5Mk(UKg5DnV|$-v)6 z$;jU($%MCYn|Z56vTU_V))195ZL@8)OLiVNZ*y#QO3tk=$;H1d+bXuYCHK}!sgi$N zw|TaDC2vTm7ZwPjEhvcg9{XC8*0)sEX9zoP(8rFjQ8jm@;yKl_D?gY{h7GE7XH1fl z($1`uLuP}N>`TeHq!jH-=IGTcWe1{iygxY*QyUJ)(y2r&my8a^q}YHQJ(9}x7c)^e zxILRm<+4&L)3-UFOz+C(V(HH0p?p%#&CNr}Tz@eSW2iu*v1l$EJt${0ac$Jv(^dSq zoiWhz_3)*`vKg>sM#(IiB#USc3X)Z{^w`!IMQczvXqN27FDwMU99Rq|rHGCmS7-gq z=C$}5tLWq<-J+{hva-i{kJ3ikQ`D*8bv$B_x9>(x)Db;BUi9N#;}pG=f6yRRi49^k z;s&W&^!0p2yJAg`5A|!x_x)A1*XU!bDf9azgn&yR4iDv0t&bl+z*hHhY)7!>%YN*}KXKb_MZYvhfgo zvfr||kZ_5O=ND4#SN^)>oN{q&dMVfuqZ5655RaFI?owU^G8GXzjir*MNVi#!ibm12 z&Jvnk%Zyr9y~Ompn|k6wv}m>ZtYKSz1CrP%yNvl$x0D~UalRx!R=qhAis*r3(RenUAIQje*HWv)?3buWEtgvS6|eJ- z^1Sk_)*5>gEx*N=>`mmo9k!?*h#^Ebn##zzSSFrST}7eI#0HY8bs(AR&nDCgO?sp8 zbWE02S0X9LrPN?9mCdN`0g^*)IEm!l4jRh^>PC46gT73IW|wJaY5c{pyn)^1V|jeT1ghaFi@!r`9J+VY=5cnncXa(dR^i%|= zXfM#IeejqXh?dYUk?f7-)43w*$!dGKliz;N@?MNp{x%*bggaKjv8d1(D%7_Xe07t) z<%)0l^}y;v{bQfGtPbZLub$n?v)dG38_(W5SexS z4c(=3Ym2drF#?PvoXVJR$aN)zZ#|Sh`Vo`fLLMy*Zi<*YX;0<^E=-0+Lf9+8dMllquG|Ee+3tJ;A42`HtoRSHt^`P8Ua zS2l^Fwvn1C*`DZ)4kTk4Sv5puI%FXpqz0-;*sivf-@0-qkzh#PiU;4e#{0()U)%8A ziH5z*UO!d6V04{Qy?n@a(<;<8O#1Ir{P&HU->_Y@U8$S!KXl49WG{H?COz{N&-~FN z%rl>P?ql}*qX>}NgYT=?MEkInNb

U_FHw(YH0;ps6eY$ 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 a5O)7T*#CPWe8-wF85WGJzbnw2H}-$F?RO#o diff --git a/python_parser/adapters/parsers/__pycache__/svodka_ca.cpython-313.pyc b/python_parser/adapters/parsers/__pycache__/svodka_ca.cpython-313.pyc deleted file mode 100644 index 991388389fab60c6b9d3a6d821d65c1707cf459b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16493 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 diff --git a/python_parser/adapters/parsers/__pycache__/svodka_pm.cpython-313.pyc b/python_parser/adapters/parsers/__pycache__/svodka_pm.cpython-313.pyc deleted file mode 100644 index 1fecb749a7dc66e495129a49bc9695348ec8a99c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13658 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 int: - """Определение индекса заголовка в Excel по ключевому слову""" - # Читаем первые max_rows строк без заголовков - df_temp = pd.read_excel( - file_path, - sheet_name=sheet, - header=None, - nrows=max_rows, - engine='openpyxl' - ) - # Ищем строку, где хотя бы в одном столбце встречается искомое значение - for idx, row in df_temp.iterrows(): - if row.astype(str).str.strip().str.contains(f"^{search_value}$", case=False, regex=True).any(): - print(f"Заголовок найден в строке {idx} (Excel: {idx + 1})") - return idx + 1 # возвращаем индекс строки (0-based) - - raise ValueError(f"Не найдена строка с заголовком '{search_value}' в первых {max_rows} строках.") def parse_single(self, file, sheet, header_num=None): ''' Собственно парсер отчетов одного объекта''' # Автоопределение header_num, если не передан if header_num is None: - header_num = self.find_header_row(file, sheet, search_value="Установка") + header_num = find_header_row(file, sheet, search_value="Установка") # Читаем весь лист, начиная с найденной строки как заголовок df_full = pd.read_excel( file, @@ -237,3 +228,47 @@ class MonitoringFuelParser(ParserPort): total.name = 'mean' return total, df_combined + + def _get_series_by_id_and_columns(self, params: dict): + """Получение временных рядов по ID и колонкам""" + # Валидируем параметры с помощью схемы Pydantic + validated_params = validate_params_with_schema(params, MonitoringFuelSeriesRequest) + + columns = validated_params["columns"] + + # Проверяем, что все колонки существуют хотя бы в одном месяце + valid_columns = set() + for month in self.df.values(): + valid_columns.update(month.columns) + + for col in columns: + if col not in valid_columns: + raise ValueError(f"Колонка '{col}' не найдена ни в одном месяце") + + # Подготавливаем результат: словарь id → {col: [значения по месяцам]} + result = {} + + # Обрабатываем месяцы от 01 до 12 + for month_key in [f"{i:02d}" for i in range(1, 13)]: + if month_key not in self.df: + print(f"Месяц '{month_key}' не найден в df_monitorings, пропускаем.") + continue + + df = self.df[month_key] + + for col in columns: + if col not in df.columns: + continue # Пропускаем, если в этом месяце нет колонки + + for idx, value in df[col].items(): + if pd.isna(value): + continue # Можно пропустить NaN, или оставить как null + + if idx not in result: + result[idx] = {c: [] for c in columns} + + result[idx][col].append(value) + + # Преобразуем ключи id в строки (для JSON-совместимости) + result_str_keys = {str(k): v for k, v in result.items()} + return result_str_keys diff --git a/python_parser/adapters/parsers/svodka_pm.py b/python_parser/adapters/parsers/svodka_pm.py index df473ca..c69b026 100644 --- a/python_parser/adapters/parsers/svodka_pm.py +++ b/python_parser/adapters/parsers/svodka_pm.py @@ -3,7 +3,7 @@ import pandas as pd from core.ports import ParserPort from core.schema_utils import register_getter_from_schema, validate_params_with_schema from app.schemas.svodka_pm import SvodkaPMSingleOGRequest, SvodkaPMTotalOGsRequest -from adapters.pconfig import OG_IDS, replace_id_in_path, data_to_json +from adapters.pconfig import SINGLE_OGS, replace_id_in_path, data_to_json, find_header_row class SvodkaPMParser(ParserPort): @@ -62,30 +62,13 @@ class SvodkaPMParser(ParserPort): self.df = self.parse_svodka_pm_files(file_path, params) return self.df - def find_header_row(self, file: str, sheet: str, search_value: str = "Итого", max_rows: int = 50) -> int: - """Определения индекса заголовка в excel по ключевому слову""" - # Читаем первые max_rows строк без заголовков - df_temp = pd.read_excel( - file, - sheet_name=sheet, - header=None, - nrows=max_rows, - engine='openpyxl' - ) - # Ищем строку, где хотя бы в одном столбце встречается искомое значение - for idx, row in df_temp.iterrows(): - if row.astype(str).str.strip().str.contains(f"^{search_value}$", case=False, regex=True).any(): - print(f"Заголовок найден в строке {idx} (Excel: {idx + 1})") - return idx # 0-based index — то, что нужно для header= - - raise ValueError(f"Не найдена строка с заголовком '{search_value}' в первых {max_rows} строках.") def parse_svodka_pm(self, file, sheet, header_num=None): ''' Собственно парсер отчетов одного ОГ для БП, ПП и факта ''' # Автоопределение header_num, если не передан if header_num is None: - header_num = self.find_header_row(file, sheet, search_value="Итого") + header_num = find_header_row(file, sheet, search_value="Итого") # Читаем заголовки header_num и 1-2 строки данных, чтобы найти INDICATOR_ID df_probe = pd.read_excel( @@ -183,7 +166,7 @@ class SvodkaPMParser(ParserPort): excel_plan_template = 'svodka_plan_pm_ID.xlsx' with zipfile.ZipFile(zip_path, 'r') as zip_ref: file_list = zip_ref.namelist() - for name, id in OG_IDS.items(): + for id in SINGLE_OGS: if id == 'BASH': continue # пропускаем BASH @@ -290,11 +273,11 @@ class SvodkaPMParser(ParserPort): ''' Служебная функция агрегации данные по всем ОГ ''' total_result = {} - for name, og_id in OG_IDS.items(): + for og_id in SINGLE_OGS: if og_id == 'BASH': continue - # print(f"📊 Обработка: {name} ({og_id})") + # print(f"📊 Обработка: {og_id}") try: data = self.get_svodka_og( pm_dict, @@ -305,7 +288,7 @@ class SvodkaPMParser(ParserPort): ) total_result[og_id] = data except Exception as e: - print(f"❌ Ошибка при обработке {name} ({og_id}): {e}") + print(f"❌ Ошибка при обработке {og_id}: {e}") total_result[og_id] = None return total_result diff --git a/python_parser/adapters/pconfig.py b/python_parser/adapters/pconfig.py index 12be990..8a5e8ab 100644 --- a/python_parser/adapters/pconfig.py +++ b/python_parser/adapters/pconfig.py @@ -3,6 +3,7 @@ from functools import lru_cache import json import numpy as np import pandas as pd +import os OG_IDS = { "Комсомольский НПЗ": "KNPZ", @@ -22,8 +23,37 @@ OG_IDS = { "Красноленинский НПЗ": "KLNPZ", "Пурнефтепереработка": "PurNP", "ЯНОС": "YANOS", + "Уфанефтехим": "UNH", + "РНПК": "RNPK", + "КмсНПЗ": "KNPZ", + "АНХК": "ANHK", + "НК НПЗ": "NovKuybNPZ", + "КНПЗ": "KuybNPZ", + "СНПЗ": "CyzNPZ", + "Нижневаторское НПО": "NVNPO", + "ПурНП": "PurNP", } +SINGLE_OGS = [ + "KNPZ", + "ANHK", + "AchNPZ", + "BASH", + "UNPZ", + "UNH", + "NOV", + "NovKuybNPZ", + "KuybNPZ", + "CyzNPZ", + "TuapsNPZ", + "SNPZ", + "RNPK", + "NVNPO", + "KLNPZ", + "PurNP", + "YANOS", +] + SNPZ_IDS = { "Висбрекинг": "SNPZ.VISB", "Изомеризация": "SNPZ.IZOM", @@ -40,7 +70,18 @@ SNPZ_IDS = { def replace_id_in_path(file_path, new_id): - return file_path.replace('ID', str(new_id)) + # Заменяем 'ID' на новое значение + modified_path = file_path.replace('ID', str(new_id)) + '.xlsx' + + # Проверяем, существует ли файл + if not os.path.exists(modified_path): + # Меняем расширение на .xlsm + directory, filename = os.path.split(modified_path) + name, ext = os.path.splitext(filename) + new_filename = name + '.xlsm' + modified_path = os.path.join(directory, new_filename) + + return modified_path def get_table_name(exel): @@ -109,6 +150,25 @@ def get_id_by_name(name, dictionary): return best_match +def find_header_row(file, sheet, search_value="Итого", max_rows=50): + ''' Определения индекса заголовка в exel по ключевому слову ''' + # Читаем первые max_rows строк без заголовков + df_temp = pd.read_excel( + file, + sheet_name=sheet, + header=None, + nrows=max_rows + ) + + # Ищем строку, где хотя бы в одном столбце встречается искомое значение + for idx, row in df_temp.iterrows(): + if row.astype(str).str.strip().str.contains(f"^{search_value}$", case=False, regex=True).any(): + print(f"Заголовок найден в строке {idx} (Excel: {idx + 1})") + return idx # 0-based index — то, что нужно для header= + + raise ValueError(f"Не найдена строка с заголовком '{search_value}' в первых {max_rows} строках.") + + def data_to_json(data, indent=2, ensure_ascii=False): """ Полностью безопасная сериализация данных в JSON. @@ -175,7 +235,6 @@ def data_to_json(data, indent=2, ensure_ascii=False): try: cleaned_data = convert_obj(data) - cleaned_data_str = json.dumps(cleaned_data, indent=indent, ensure_ascii=ensure_ascii) - return cleaned_data + return json.dumps(cleaned_data, indent=indent, ensure_ascii=ensure_ascii) except Exception as e: raise ValueError(f"Не удалось сериализовать данные в JSON: {e}") diff --git a/python_parser/app/__pycache__/__init__.cpython-313.pyc b/python_parser/app/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index c812a10f3a6b11f3367922e3766aa0ca698de86e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167 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 diff --git a/python_parser/app/schemas/__pycache__/svodka_ca.cpython-313.pyc b/python_parser/app/schemas/__pycache__/svodka_ca.cpython-313.pyc deleted file mode 100644 index 0e04d9685e33ac5b4d273a6f6f8f787c76534978..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1635 zcmaJ>&2QX96d!-C_ak3~B;ACzhAIW4kZ>ReB7~GCjcC%OB@PIXCClA)5|drq9otdE zDJ@bc5{FzWaX>2KR*6Fhq=Z72f58ivWuyuOr`#Ggh$FmbZz`okjO3r+y!p+W_vXDf z&9=52f$`5zUoQVH5b_63j)vS4n(u*dhv-D-X2>*0xoMvAD$e;CVOpeOA`3Ipv`l4{ zoFdN=UF;{iWMm9^R7|Z;)^ZXT7prVbYXiSIQd4 z#LG?);{T!>RZB=b8eB_gsvz7U2BDlzD6ex=(0MBA0+n=;%DO}|OR|<>xp~|7Xo&Xr zF*GLn70YGfqE!l+;(D}dh0f|dGN&m_F-_O1+NQ~JrdjpMQ3d6KX;m^d{)vA~qMEAzAC3zyzzJ*F9iV7X*kVMv{8QD_IIN!!4KCVYfl znHV$P3Tzq}v(`%R(g((*9jt_&Z}@BBvgewNDLA3%IktI>e2|W z%X;QjkxGVaWF%l4imp75|CE&-A$smjuEoj%E7xM>k(Ja!0cxRbl!qw{n%CQDVW~sw zWF2}E&BXY;eLb>+aK8ZS!_fu6__KJcezSfv-i^1__(5EYzkzRCt*^&B@qN(#fYUJ* zGdrYWW>rvrAMdJ1`K4IzG!L+k1*8cqU$%o1b^OrrT$ZtKSXIAbvuxFIO((Rg0h6Er z>>wKZ&-r`tR{U+e4Y&uVe5clLf%p|3SKmPIw&DkByaWE;s(*4%jIwCp3t-+IQU{}R z>8uw2h#SC44O|5awfO6}HiWinV0JHh=Kpzv(X&Xn8`ogR4&1};iDsA_TGuKND3BkI zR%?>xi=aB5?ljROJfu;=G!FAGbI?;6Dq+L2-X~HtJmI;E&eHw>7^0^U9$zz6VXE=; zENao$r1a-BnYQDk1ECWE3zc=fA3({cWo_CwLTb?-T*P)si?$DGa(W)cOT;q+6<~w> zR_JN;tDm2bi`t(&8Cc*CB;i#1BSAWy`&lWb`_BWjOIc)LX3Bq>&i(y5+ha z_Oa(;`(hwW2trB|dnfovi?|yB%Qtuz;3M+OnR5*#-+20+Mpxgby>X}7c&hs#E1i|s zFW!D-Ggr?KG>Ih12koSICLvyhIJ&0!lvb42r*2Pfc7J>+Vg21MOSwY=kVb}Q&1pHN z_-kd$g%^hkph@C^^so7jyF@W0Cfe|pQhXig3kb=Bk+}QBH7l>BZ{O>52zb~p0d9CC ma2)q58GK0k9+I9zS>XCNyEn^+1cbvv50~3?{vz;8-1-+WBG#z@ diff --git a/python_parser/app/schemas/__pycache__/svodka_pm.cpython-313.pyc b/python_parser/app/schemas/__pycache__/svodka_pm.cpython-313.pyc deleted file mode 100644 index 88553be59a01104302c7469f64003e24779a1057..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3122 zcmbVO-ESP#6`$St-0xj~$FX5+O2ekaK?Ot8QX0o`?0WI8lbav~jTk2Di9OAJac4Ke zJZ+#&9YR&3HkBU`X&)`MQlO1U332{~S@AMlsiG23ej{32y!M$iELp= zCdlMdwpCnYp%bQK%~uw!BG|NiwPsh!W|2v++D<#yRiaRhs5C@08YUqcAz>ON5gH>=8YeNDAaR-`37R5F+Cx&b zm-Ns+(o6eEA01fg&kQgrKl7`TTX<;o7XaKpxtq-^&3Bvcx%b_B&Fk*%w0p<>r+XVF z@49!Izk%83?kyN^HXF_BY4>CIk4(zu7G7u4WNtRgl*z&}pPiT_vrIaNWAR*WmWjFi zYb>0rT+Y^4E}&Iy50t5uchI1nt(#Sc-%L23$t`4=oO>;|kY{rCRkX_@Lx>|J5RwQfgdT)mgg%6RgaL#>gdv0j2*U^m0a(9bI5o3o7YwsjqxOY*&2pgD z2>4p?6Ig!gXZktEqK-aqUUH7Sqo1^#OSMW>uddXVD`lfeOk~ZpjMEGL?ZGr=wDsYp?42K z%!=`_RuR z+Ygi-m0p6lS;GFWgP{AMPe+3~!%}Ad4(oPJ!B75twSdZI-G< ziv{h)otLoMN08u3^9rU&1M4;+{U#1S1zvsvWP}2kxOu(#+cYO_1N@(F<>20}JOT>I zhDbB;M-KzAP{}SEcFig|OfG;TIXhEe?k;o>vVO)FeGe-C>+$8F*j@LN=2cwO4vM9F z)4jQa4e0*W{k!`iQwx=1y;OE`J8z=#V>pwmkaE+-5_g*)aDjmW_hFy7moMDgpgfKC zF>5342baIF?BZ%UwN+&4O3!S%B^y zZFeVhmqJuPZCrdV0BReeGKxBT;xYX(K2<4Sw3oJCgp~Z0eQ`K~({TjURXPEX5$TU{ z{1XHoj*5`mQ0ORHoVTxa#{v0Nl(?RQ1 z;Xl!SZ(zh59$CMzKIDyz{bklYc;ta94aL6|mC^8*+5tbuFCm(z%%mQ*3M!(XuNozW zfsmTzas|b$QbtYVd%Pw$Sx2gT_Ck%kI-xI150JB0Pt{JK%X3ZHRTQ0w20J_j;apM2@1K z(VrqbgMiJ^b(nY~UM-ZV?!zQOI3DqIpna6%K~75rXsKqjJz74r!8R?=K|-IFr*M=7 z$OIpzApHgUx|!wo?L0Uzg@f;TPAhg`njM^YAd5&P`H@sgJf2D&zR*c5c^rXD!3iAw z52QJXaR|rZ=TrfJG=n2PF^f*c!9o4}Rty9JUkguv rE&Sl$LjShX6X;ugeofjIV6c67ED&C|w*~myo(mkr$&LVje6{}t-fdvj diff --git a/python_parser/app/schemas/__pycache__/upload.cpython-313.pyc b/python_parser/app/schemas/__pycache__/upload.cpython-313.pyc deleted file mode 100644 index c91559a6560a7aec3797296f69a194551bc18431..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2611 zcmai0O>7fK6yEi&y=%wL4^BiN1>8aaLldAO1WJVpAwe<3foxK>Vx`r_-XsRcc4zG> zp;R(ZQD`{?sYq6(N~zidNIgIyB|u4g?`2lGI3rac^^_YZL0tRZY={y_+mZb3&YPJx zZ{B?0ThE6=0Rh^dfBZb$;}e9xvGb}ypSSr@c-#;)K@*P)F_DNd5Aj5>?>R2TWFp7B z#2fPwAGb-zm6%G@h)^%QBWUt^LG$WEwTt3n zXFdWiHw0ZEq9zcJCK5^W5LuImSCffP^Acsq7gboWKbOv$NiA>Y3-%mlf+=<(k+5u= z1#%>dFR9EB^IC*t$t@usRheoS8FR!k3>Gkqk!-S%#`mCMd|EKmiz8KrF_$=)7(>53m?-j3eho?cdG7&ZiuN*HE7Pf`Pgyk#2(se)+c;U};Y z?eFXTwnc2c+dOMGozst6_St+kr{~7a9JoDa*6lDCjcqz@tf;e85Az zx=&X$?>3mcX!miu3LH^1Wy!8;er^xw6}lhY!)O3UIZrBpC&5+^bfJ-;79yb`HCo9k z-COIm>|8cuTXR7eZhp}SNPl!L(BJ8#bA>*p)6NCwqH`@mr@5&}Z#$Ri6rH*yvWlc- zCrFC3is16XL0tUHY zg(K*xMDL*wm^8|X3u6PRS@iF*)aE#XdAiIHGP9FSyoC%{+2Z0)+zX1cT2snv?duJp~w z+HAPK6s9|dobWJMv>ADLcGH%LKHB!Vv*~=X>&j?Jy86Y8eEy}ZcmoRpfO{77zB)T5 zU}Pmb{zsucOMrf^EJTU}b{c;)n9vB|7?mbnlEAjFDjkgZ?kxUba6Re?3Ev#=eIeh-!47l^G0RpcA`AOd9s$_M=o3ki0( zPN7bOyW$@mKGAj5=v&W zSgFsJEKzxxK6k_RWDf!tDZyKOO?xikTVMdgwlUyE;YG>~9p#NJPoukTs^x7>&%M%H zYo7a6RAFFM71sQ>3ds)KeJ4T$;avnCAr~GG6F+1GZ|2{1h}T6BkX*I};OelEHuX8R z{jLuC7j<~j37>LxcxpD%IFY3LyPZh97#mkh;p?FpIX=6+>1L9Cc-q;n!@Q5jlckmk zskHxk#tAjf$ofmU0%Z!|$`tpFM?*}_jU~+teCUY;7G7zXFF%%pe;9@3jrQH=zjog0r!mn diff --git a/python_parser/app/schemas/monitoring_fuel.py b/python_parser/app/schemas/monitoring_fuel.py index 4239f05..784262a 100644 --- a/python_parser/app/schemas/monitoring_fuel.py +++ b/python_parser/app/schemas/monitoring_fuel.py @@ -32,3 +32,19 @@ class MonitoringFuelTotalRequest(BaseModel): "columns": ["total", "normativ"] } } + + +class MonitoringFuelSeriesRequest(BaseModel): + columns: List[str] = Field( + ..., + description="Массив названий выбираемых столбцов для получения временных рядов", + example=["total", "normativ"], + min_items=1 + ) + + class Config: + json_schema_extra = { + "example": { + "columns": ["total", "normativ"] + } + } diff --git a/python_parser/core/__pycache__/__init__.cpython-313.pyc b/python_parser/core/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index 876b1a052ef1516979f87d9cb688cf5d3109de6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmey&%ge<81gh88WPs?$AOZ#$p^VQgK*m&tbOudEzm*I{OhDdekkl=AXRDad;?$zz z7~jO~V%@43m(=3ylKg_0g36MN{Ji*r#3G<p$LLN+0x3yw5S0iNNSX-SfCmv7#_wv;xR1P&_|QZe8WDKcmzgwa*73m@pZZqP2NIt==gw?H+r^(r_M3C>chB8B z-#tHTnT*1~^VcumU)&`y%%3>uJc-y?`x%VejK&Z~V>RwHJI)bqoF{xgj``EVc!DIx zMIw$%M51%TX_+K-ZWohhw8U;k6OVGyUPt3Ci4wCCu<{l*6|+fTl`U*KW>dhXx3HO* z%>bL-!e&c?nyc@JV<`T&{v-b5q5M(JD?3%Q5(;Bw%M1B;s?!rz{Au(BQqpJb0=#ZBIzw2HkJDJf4>B4@ z1U;dP8vin|x&)R$Eu2eGOU^TTQWKA{AXEz0rjKxV8^BA*Yck1{lByDB&etlASvY53 zuG_A+k_4`P7{LF|pZ6aJ4gXPatsg#czTdwOGd~24UepcMwm8?%XPC7GdaU3mWk_C%2m7S04*6t!Lh*LU5|u7o7Jl0 znJBXhvx&)R&vpsQ8VUu_oaDeHB7%gII}F3c<(6T39w|@OVYy+D9^lsC$As^lJg%R2 zZQ|-@%}eg^=lYoKUh}=<@%}o3{aA>hF7#MAwX&!94t&`0wb0f>bDB08T-w-Z5%;K~5 zF2H{c7cD_#J*i7^V2Cs@B%+iOsvM>}f#Je!t!#sB>#qX%cObm)Lkv6!zQKzRu5Stq ze{o}ANN(M-YzTg73eYUs6JgSs{LHpIqgB{lMqx*mPAzwQ)7_$oy5Z9)?WkYl30(SYCH&LFqa_H7O{}rgIuFk zCHRV@z$;WrwihP}{ptx-d9G@aR8+L}`0lFLAnZ&K@O18r0I1hnaV+-qHMQ12^TJ$q zS=bk8g=;rxwO*z^0p_2z(gY&u7;jLJBE|3?I|U2aG_XoM*NMdpR9iVzA|+`g9ssBM z>j2#%ag&n4t&K|dgWCk8Kimt!eWLKoK3~WITttO@1uZ;WR5EBVV%>=L=@yJCvIzK3 zF4j~O_e2zogKA@J_E7Uki*IQyd2TdN@=Jo+-g}_&!R&>mb@S6@;Xoug?(lylKbHol zO^+@`-2#M;FQL;DsN_=AH#8CYf&js*e2nF+fWoif5$b~gAo+Z7&3_EofcG*Ss7ty6Pf2HBxyVK|bRI_9FHlfnbjjtw1y$8Blb5TUn~ ztEFcSL>q@#GphyDC79e%b*E(r^`h5L&$Ovhh4P80uZ@y7U>yrT_cp*P&$8?jj$?(V zBEzb`GeZG0^c%B%Rb;r-Q!c^2y~+Tr@i1Ja!yZZq?7>wAASQ5_r3BCJUu6Jd0*C3? XBaa^Wb&veI#|V0iP~r&(78U4kpZbul diff --git a/python_parser/core/__pycache__/ports.cpython-313.pyc b/python_parser/core/__pycache__/ports.cpython-313.pyc deleted file mode 100644 index 6bf9520b22aff7db6c5e669ad6f6df92ecf92e7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5953 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 diff --git a/python_parser/core/__pycache__/services.cpython-313.pyc b/python_parser/core/__pycache__/services.cpython-313.pyc deleted file mode 100644 index d655af45a0baa277c48328bcd3dba578ca519991..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5502 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