From 0e83378d176102ef111d0b6ed98b215432a23b7f Mon Sep 17 00:00:00 2001 From: bn_user Date: Wed, 19 Nov 2025 10:57:46 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20dags/OSV.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dags/OSV.py | 54 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/dags/OSV.py b/dags/OSV.py index 76c8981..77c5c65 100644 --- a/dags/OSV.py +++ b/dags/OSV.py @@ -135,25 +135,41 @@ def read_data_1C(**kwargs): df = df.rename(columns=field_mapping) # Удаляем дубликаты по ключевым полям перед вставкой - conflict_columns = ['schet', 'uid_subkonto2', 'uid_subkonto1', 'uid_organizaciya', 'get_date', 'subkonto2'] - - print(f" Данные перед удалением дубликатов (первые 10 строк):") - print(f" Всего строк: {len(df)}") - print(f" Ключевые колонки для проверки дубликатов: {conflict_columns}") - - # Выводим первые 10 строк с ключевыми полями - if not df.empty: - display_columns = conflict_columns + ['summa_oborot', 'nomer'] # Добавляем еще пару полей для информации - available_columns = [col for col in display_columns if col in df.columns] - # Проверяем наличие дубликатов - duplicates = df.duplicated(subset=conflict_columns, keep=False) - if duplicates.any(): - duplicate_count = duplicates.sum() - print(f" Найдено дубликатов: {duplicate_count}") - print(f" Дата с дубликатами: {date}") - print(f" Пример дублирующихся строк:") - duplicate_samples = df[duplicates][available_columns].head(10) - print(duplicate_samples.to_string(index=False)) + group_columns = [ + 'schet', 'subkonto1', 'subkonto2', 'organizaciya', 'nomer', + 'date_begin', 'date_end', 'inn_subkonto1', 'inn_organizaciya', + 'uid_subkonto2', 'uid_subkonto1', 'uid_organizaciya', 'get_date' + ] + columns_for_sum = [ + 'summa_oborot', 'summa_oborot_dt', 'summa_oborot_kt', + 'summa_konechnyy_ostatok', 'summa_konechnyy_ostatok_dt', 'summa_konechnyy_ostatok_kt', + 'summa_konechnyy_razvernutyy_ostatok_dt', 'summa_konechnyy_razvernutyy_ostatok_kt' + ] + sum_columns = { + 'summa_oborot': 'sum', 'summa_oborot_dt': 'sum', 'summa_oborot_kt': 'sum', + 'summa_konechnyy_ostatok': 'sum', 'summa_konechnyy_ostatok_dt': 'sum', 'summa_konechnyy_ostatok_kt': 'sum', + 'summa_konechnyy_razvernutyy_ostatok_dt': 'sum', 'summa_konechnyy_razvernutyy_ostatok_kt': 'sum' + } + for col in columns_for_sum: + if col in df.columns: + # Очищаем и преобразуем числовые значения + df[col] = (df[col] + .str.replace('\xa0', '', regex=False) # Убираем неразрывные пробелы + .str.replace(' ', '', regex=False) # Убираем обычные пробелы + .str.replace(',', '.', regex=False) # Запятые -> точки для десятичных + .apply(lambda x: x if x.replace('.', '').replace('-', '').isdigit() else None) + .apply(pd.to_numeric, errors='coerce')) + + # Диагностика + original = df[col].copy() + cleaned = df[col] + failed = cleaned.isna() & original.notna() + + if failed.any(): + display(f" {col}: не преобразовано {failed.sum()} значений") + display(f" Примеры: {original[failed].head(3).tolist()}") + + df = df.groupby(group_columns, as_index=False).agg(sum_columns) with engine.begin() as conn: