{"id":19225844,"url":"https://github.com/mementomorri/data_processing_pipeline","last_synced_at":"2025-04-21T00:32:23.372Z","repository":{"id":166156766,"uuid":"470822240","full_name":"mementomorri/data_processing_pipeline","owner":"mementomorri","description":"Проект для демонстрации базовых навыков работы с python.","archived":true,"fork":false,"pushed_at":"2022-12-05T13:31:28.000Z","size":1359,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-23T10:18:50.417Z","etag":null,"topics":["excel","pandas","python","sqlalchemy","sqlserver"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mementomorri.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-03-17T02:32:51.000Z","updated_at":"2023-12-26T19:58:48.000Z","dependencies_parsed_at":null,"dependency_job_id":"961482fa-5083-491f-a261-e948b1061b12","html_url":"https://github.com/mementomorri/data_processing_pipeline","commit_stats":null,"previous_names":["mementomorri/data_processing_pipeline"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mementomorri%2Fdata_processing_pipeline","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mementomorri%2Fdata_processing_pipeline/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mementomorri%2Fdata_processing_pipeline/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mementomorri%2Fdata_processing_pipeline/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mementomorri","download_url":"https://codeload.github.com/mementomorri/data_processing_pipeline/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249980509,"owners_count":21355448,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["excel","pandas","python","sqlalchemy","sqlserver"],"created_at":"2024-11-09T15:16:36.113Z","updated_at":"2025-04-21T00:32:23.104Z","avatar_url":"https://github.com/mementomorri.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Конвеер обработки данных на Python\n\n## Краткое описание\n\nНебольшой проект демонстрирующий мои навыки работы с Python и такими полезными библиотеками как pandas, numpy, pyodbc, sqlalchemy, openpyxl и т.д.\\\nПроект реализует обработку данных хранящихся на SQL Server, которые записываются туда с помощью SCADA системы Ignition. Входные данные сортируются по времени, медианное значение интервала между поступающими данными является нормой, а отклонения от нормы являются аномальными. Аномальные временные промежутки подсчитываются и восполняются с помощью линейной интерполяции, что делает график поступающих значений более гладким, без скачков в значениях и сестема контроля аварийных ситуаций не подает аварийный сигнал без необходимости. Все действия выполняемые программой логгируются и записываются в лог-файл.\\\nВ результате, выполненный проект расширяет функционал стандартной библиотеки Ignition, дополняя его функционалом, который был желателен для клиента. Окно с вызовом программы выглядит следующим образом.\n\n![](https://github.com/mementomorri/python_data_processing_pipeline/blob/main/images/control_window.png)\n\n## Конфигурация тестового окружения\n\nКонфигурирование будет происходить в два этапа:\n* выдача прав на чтение и запись в папку «test»;\n* исполнение скрипта на создание хранимой процедуры;\n\n### Выдача прав на чтение и запись\n\nПерейдём к первому этапу конфигурирования. Разархивируем файлы архива «test.rar» по пути «C:\\test\\», предварительно создав папку «test» при необходимости.\\\nВыдать права MSSQL на чтение и запись в данной папке, чтобы MSSQL имел возможность вносить изменения в файлы находящиеся внутри папки. Сделать это можно с помощью bat скрипта «2_grant_permissions.bat» находящегося в папке «setup_SQLserver_env». Исполняемый файл можно запустить двойным щелчком мыши или через терминал Windows.\\\nПроверить результат работы программы можно в свойствах папки «test» в разделе «безопасность».\n\n![](https://github.com/mementomorri/python_data_processing_pipeline/blob/main/images/check_permissions.png)\n\nВ случае, если выполнение скрипта невозможно, необходимо выдать права вручную.\n\n### Создание хранимой процедуры\n\nНа втором этапе конфигурации ТО нужно выполнить скрипт «1_enable_ext_langs.bat», который даст SQL Server возможность испольнять команды с помощью внешних языков, таких как Python. Если выполнить скрипт не удалось, то можно выдать это разрешение выполнив следующий SQL-запрос к SQL Server:\n\n```\nsp_configure 'external scripts enabled', 1;\n\nRECONFIGURE WITH override;\n```\n\nВ случае успеха на оповестят следующим текстом.\n\n![](https://github.com/mementomorri/python_data_processing_pipeline/blob/main/images/ext_langs_enabled.png)\n\nТаким образом мы разрешили SQL серверу выполнять скрипты сторонних языков. Теперь нужно добавить хранимые процедуры в БД. Сделать это можно посредством скрипта «3_create_procedure.bat», либо вручную выполнив следующий SQL-запрос:\n\n```\nCREATE PROCEDURE test_procedure_1\nAS\nEXECUTE sp_execute_external_script @language = N'Python'\n, @script = N'\nimport sys\nsys.path.append(\"C:\\\\test\")\nfrom main import main_call\nmain_call()\n'\n```\n\nХранимая процедура успешно добавлена, протестируем работу процедуры выполнив её с помощью скрипта «4_start_procedure_1.bat». \n\n![](https://github.com/mementomorri/python_data_processing_pipeline/blob/main/images/test_procedure.png)\n\nВ результате выполнения процедуры мы можем отследить новые записи в лог файле по пути «C:\\test\\KIUS_Lodochnoe\\log\\KIUS.log».\n\n![](https://github.com/mementomorri/python_data_processing_pipeline/blob/main/images/log_file.png)\n\nИ в выходных данных, в выходном файле экселя по пути «C:\\test\\KIUS_Lodochnoe\\data_test_output\\book1.xlsx.\n\n![](https://github.com/mementomorri/python_data_processing_pipeline/blob/main/images/output_xl.png)\n\nКак видно по скриншоту, в выходных данных имеется несколько новых столбцов с расчётами в отличие от исходных данных представленных далее.\n\n![](https://github.com/mementomorri/python_data_processing_pipeline/blob/main/images/default_input.png)\n\nПути к исходным и выходным данным конфигурируются в конфигурационном файле по пути «C:\\test\\KIUS_Lodochnoe\\config\\config.ini». В разделе «Logging» можно указать путь к файлу конфигурации логгера в переменную «config_path ». В разделе «Input_output» указываются пути к файлам экселя считающимися входными «input_excel » и выходными «output_excel », если выходной файл не существует, то пайтон создаст его сам. В переменных «output_sheet » и «input_sheet » хранятся страницы на которые мы записываем выходные данные и читаем входные соответственно\n\n![](https://github.com/mementomorri/python_data_processing_pipeline/blob/main/images/config_file.png)\n\n## Инструкция к файлу конфигурации config.ini\n\nДалее разберемкаждый из параметров файла конфигурации проекта:\n[DBconnection]  - Раздел с параметрами подключения к БД\n* connection_url = mssql+pyodbc:///?odbc_connect= - Строка формирующая подключение к БД с помощью pyodbc;\n* driver = ODBC Driver 17 for SQL Server - Драйвер подключения к БД, в нашем случае SQL Server$\n* servername = localhost - Символьное имя или IP адрес сервера;\n* database = test - Имя подключаемой БД;\n* table = sqlt_data_1_2022_02 - Таблица с данными, в которую вносятся новые записи;\n* te = sqlth_te - Таблица с объявлением тегов Ignition;\n* te_columns = id,tagpath,scid,datatype,querymode,created,retired - Заколовки в таблице с объявлением тегов;\n* UID = sa\n* PWD  = Sapassword__ - Авторизационные данные для подключения к БД;\n\n[Logging] - Раздел с параметрами логгирования\n* debugging_mode = False - Объявить режим дебаггинга, записывать больше информации в лог файл;\n* limit_log_size = 10_000_000 - Ограничить размер лог файла указываемый в байтах, в нашем случае он указан в 10 мегабайт;\n* config_path = \\config\\logging.conf - Путь к файлу конфигурации;\n\n[IO_files] - Раздел с параметрами файлов конфмигурации\n* default_columns = tagid,intvalue,floatvalue,stringvalue,datevalue,dataintegrity,t_stamp - Объявление стандартных заголовков колонок в таблице с данными;\n* columns_with_data = human_readable_stamp,t_gap,median_gap,percent_of_gaps - Объявление колонок с рассчетными данными добавляемыми в ходе рачетов по временным пропускам, именно их мы будем использовать для записи выходных данных в книгу эксель;\n* columns_with_bursts_data = t_stamp_,human_readable_stamp,t_gap,t_increment,t_speed,N_speed - Объявление колонок с рассчетными данными добавляемыми в ходе рачетов выбросов, именно их мы будем использовать для записи выходных данных в книгу эксель;\n* n_columns_to_read = 7 - Количиство колонок считываемых из книги эксель в качестве исходных данных;\n* input_excel = \\data_test_input\\test_book.xlsx - Путь к файлу эксель используемому в качестве входных данных;\n* input_sheet = Sheet3 - Имя страницы эксель используемой в качестве входных данных для пропусков по времени;\n* sheet_with_bursts= Sheet4 - Имя страницы эксель используемой в качестве входных данных для выбросов;\n* output_excel = \\data_test_output\\book1.xlsx - Путь к файлу эксель используемому в качестве выходных данных;\n* output_gaps_sheet = Sheet1 - Имя страницы эксель используемой в качестве выходных данных для пропусков по времени;\n* output_interpolated_sheet = Sheet2 - Имя страницы эксель используемой в качестве выходных данных для пропусков по времени с интрополированными данными;\n* output_sheet_with_bursts = Sheet5 - Имя страницы эксель используемой в качестве выходных данных для выбросов;\n* output_interpolated_bursts = Sheet6 - Имя страницы эксель используемой в качестве выходных данных для выбросов с интрополированными данными;\n\n[IO_tags] - Раздел с параметрами конфмигурации тегов\n* tag_creation_time = 1643677200000 - Метка создания тега для таблицы “te”;\n* tagid_gaps = 2 - id тега для записи количества временных пропусков;\n* tagid_interpolated_data = 3 - id тега для записи интрополированных данных по временным пропускам;\n* tagid_data_bursts_count = 7 - id тега для записи количества выбросов;\n* tagid_data_bursts_interpolated = 8 - id тега для записи интрополированных данных по выбросам;\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmementomorri%2Fdata_processing_pipeline","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmementomorri%2Fdata_processing_pipeline","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmementomorri%2Fdata_processing_pipeline/lists"}