def send_bundle_to_ODLI(a): # загружаем из витрины исследования, которые нужно отправить load_data_research() if len(db_lab) == 0: raise my_except('Некого отправлять, витрина пуста') # начинаем отправлять по одному for row in db_lab: # начнем с генерации PDF исследования encoded_pdf = generate_pdf(row) # Адрес АПИ url = get_dir('odli_http_test') # Заголовок джейсона headers = {'content-type': 'application/json', 'Authorization': get_dir('odli_key_test')} # Настройка прокси моего компа proxies = {'http': os.getenv('http_proxy')} # Создаем джейсон json_bundle = generate_json_new(row,encoded_pdf) # на всякий случай сохраняю бандл в файлик data=json.dumps(json_bundle, ensure_ascii=False) with open(get_dir('temp') + r'\data.json', 'w', encoding='utf8') as f: f.write(data) # отправка бандла на сервера #response = requests.post(url, data=data.encode('utf-8'), headers=headers, proxies=proxies) # чтение ответа #otvet = response.json() # отправляем id бандла, которое получили от сервера в базу #send_otvet_id(int(row.ID),otvet["id"]) # так как это тест, то остановимся на 1 исследовании #return 'успешно отправлен бандл ' + otvet["id"] return get_dir('temp') + r'\data.json' return 'Было отправлено ' + len(db_lab) + ' бандлов'
def cvod_26_covid(a): sql = open('sql/parus/covid_26_svod.sql', 'r').read() with cx_Oracle.connect(userName, password, userbase, encoding="UTF-8") as con: df = pd.read_sql(sql, con) df['type'] = 'parus' old_file = get_dir('punct_zabor') + '/' + datetime.datetime.now().strftime( '%d.%m.%Y') + ' Пункты отбора.xlsx' values = {6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0, 12: 0, 13: 0, 14: 0} try: old = pd.read_excel(old_file, skiprows=3, header=None, sheet_name='Соединение') except: old = pd.DataFrame() else: old = old.loc[~(old[2].isnull() & old[3].isnull() & old[5].isnull())].fillna(value=values) del old[0] del old[14] old['type'] = 'file' if len(old.columns) == len(df.columns): old.columns = df.columns old_file = get_dir('punct_zabor') + '/' + datetime.datetime.now().strftime( '%d.%m.%Y') + ' Пункты отбора.xlsx' new_df = pd.concat([df, old], ignore_index=True).drop_duplicates( subset=['LAB_UTR_MO', 'ADDR_PZ', 'LAB_UTR_02']) date = (datetime.datetime.now() + datetime.timedelta(days=1)).strftime('%d_%m_%Y') new_name = date + '_26_COVID_19_cvod.xlsx' shablon_path = get_dir('help') shutil.copyfile(shablon_path + '/26_COVID_19_svod.xlsx', shablon_path + '/' + new_name) wb = openpyxl.load_workbook(shablon_path + '/' + new_name) ws = wb['Из паруса'] rows = dataframe_to_rows(df, index=False, header=False) for r_idx, row in enumerate(rows, 5): for c_idx, value in enumerate(row, 2): ws.cell(row=r_idx, column=c_idx, value=value) ws = wb['Из файла'] rows = dataframe_to_rows(old, index=False, header=False) for r_idx, row in enumerate(rows, 5): for c_idx, value in enumerate(row, 2): ws.cell(row=r_idx, column=c_idx, value=value) ws = wb['Соединение'] rows = dataframe_to_rows(new_df, index=False, header=False) for r_idx, row in enumerate(rows, 5): for c_idx, value in enumerate(row, 2): ws.cell(row=r_idx, column=c_idx, value=value) wb.save(shablon_path + '/' + new_name) return shablon_path + '/' + new_name
def generate_pdf(stroka): pdf_path = get_dir('odli_pdf') + '\\' +stroka.Surname +' '+ stroka.Firstname +' '+ stroka.Patronymic logo_image = r'miaclogo.png' pdf = Document(pdf_path) pdf.packages.add(Package('babel',options='russian')) pdf.packages.add(Package('pdfx', options= NoEscape('a-1b') )) pdf.packages.add(Package('inputenc',options='utf8')) pdf.packages.add(Package('fontenc',options='T2A')) pdf.packages.add(Package('geometry',options='a5paper')) first_page = PageStyle("firstpage") with first_page.create(Head("L")) as header_left: with header_left.create(MiniPage(width=NoEscape(r"0.49\textwidth"),pos='l')) as logo_wrapper: logo_wrapper.append(StandAloneGraphic(image_options="width=120px",filename=logo_image)) with header_left.create(MiniPage(width=NoEscape(r"0.49\textwidth"),pos='c')) as logo_wrapper: logo_wrapper.append(NoEscape("Сгенерированно в СПб ГБУЗ МИАЦ")) logo_wrapper.append(NewLine()) logo_wrapper.append(NoEscape("В основе данные, предоставленные лабораториями")) pdf.preamble.append(first_page) pdf.change_document_style("firstpage") pdf.add_color(name="lightgray", model="gray", description="0.80") pdf.append(HorizontalSpace(size="500px")) with pdf.create(Section(NoEscape("Исследование на COVID-19"),numbering=False)): pdf.append(NoEscape("Наименование лаборатории: " + stroka.Name_Lab )) pdf.append(NewLine()) pdf.append(NoEscape("Дата исследования: " + stroka.Date_Test)) pdf.append(NewLine()) pdf.append(NoEscape("Ответственный за исследование: ")) pdf.append(NewLine()) pdf.append(NoEscape(stroka.lab_familia +' '+ stroka.lab_name +' '+ stroka.lab_secondname)) with pdf.create(Section(NoEscape("Пациент: ") ,numbering=False)): pdf.append(LargeText(NoEscape(stroka.Surname +' '+ stroka.Firstname +' '+ stroka.Patronymic))) pdf.append(NewLine()) pdf.append(NewLine()) pdf.append(NoEscape("Дата рождения: " + stroka.Birthday)) pdf.append(NewLine()) pdf.append(NoEscape("Паспорт: " + stroka.Passport)) pdf.append(NewLine()) pdf.append(NoEscape("СНИЛС: " + stroka.Snils)) pdf.append(NewLine()) pdf.append(NoEscape("ОМС: " + stroka.Policy_OMS)) pdf.append(NewLine()) pdf.append(NoEscape("Контактный номер: " + stroka.Phone)) pdf.append(NewLine()) with pdf.create(Section(NoEscape("Результат: "),numbering=False)): pdf.append(NoEscape("Качественное обнаружение короновируса SARS 2 в различных образцах: ")) pdf.append(NewLine()) pdf.append(NewLine()) if stroka.Result_Test == 'ND': pdf.append(TextColor('green',LargeText(NoEscape('Не обнаружено')))) if stroka.Result_Test == 'DET': pdf.append(TextColor('red',LargeText(NoEscape('Обнаружено')))) pdf.generate_pdf(clean_tex=True,compiler='pdflatex') with open(pdf_path+'.pdf', "rb") as pdf_file: encoded_pdf = base64.b64encode(pdf_file.read()).decode() return encoded_pdf
def no_lab(a): df = pd.read_sql(sql_no_lab, conn) put_svod(df, 'нет лабораторного подтверждения') put_excel_for_mo(df, 'нет лабораторного подтверждения') return get_dir( 'temp' ) + '\\' + 'отчет по разложению нет лабораторного подтверждения.xlsx'
def search_coordinats(a): TOKENS = open('/home/sshuser/jupyter/tmp/yandex_api.txt', 'r').read().split('\n') file = get_dir('path_robot') + '/прикрепления/zone+coordinats.xlsx' #df = pd.read_excel(file) for TOKEN in TOKENS: #df = pd.read_sql("""select top(1000) * from [dbo].[zone_and_coordinates] where coordinats = 'не найдено'""", con) sql = """SELECT top(1000) [idUMSRS],[adress],[coordinats] FROM [COVID].[robo].[UMSRS_coordinates] where [adress] is not null and [coordinats] is null""" df = pd.read_sql(sql, con) send('admin', 'Использую токен под номером ' + str(TOKENS.index(TOKEN) + 1)) for i in df.index: try: ADDRESS = df.at[i, 'adress'].replace(' г', '') #ADDRESS = str(df.at[i,'TOWN_NAME'].replace('г.',''))+'+'+str(df.at[i,'GEONIM_NAME']) +"+"+ str(df.at[i,'HOUSE']) +'+'+ str(df.at[i,'KORPUS']) +'+'+ str(df.at[i,'TOWN_AREA_NAME']) #ADDRESS = df.at[i,'TOWN_NAME'] +"+"+df.at[i,'TOWN_AREA_NAME'] + "+" +df.at[i,'GEONIM_NAME'] + "+" +df.at[i,'GEONIM_TYPE_NAME'] + "+" +df.at[i,'HOUSE'] +'+'+ df.at[i,'KORPUS'] except: continue else: ADDRESS = ADDRESS.replace(' ', '+').replace('++', '') coordinats = get_coordinat(ADDRESS, TOKEN) if not coordinats is None: update_table(int(df.at[i, 'idUMSRS']), coordinats) #df.loc[i,'coordinats'] = coordinats else: update_table(int(df.at[i, 'idUMSRS']), 'не найдено') send('admin', 'Закончил искать адреса на сегодня.') return 1
def check_robot(a): date = datetime.datetime.today().strftime("%Y_%m_%d") path = get_dir('path_robot') + '/' + date + '/*' spisok = 'В директории Robot сейчас лежат файлы:' for file in glob.glob(path): spisok += '\n' + file.rsplit('/', 1)[-1] return spisok
def svod_vachine_dates(a): sql = """SELECT [Date],[District],[Name],[Vsego_day_v1],[Vsego_day_v2] FROM [COVID].[robo].[vaccine_potrebnost] where [Type] = 'Пункт вакцинации' and [Name] <> '0' and [Date] != '2021-01-30' order by [Date]""" df = pd.read_sql(sql, con) res = df.pivot_table(index=['District', 'Name'], columns=['Date'], values=['Vsego_day_v1', 'Vsego_day_v2'], fill_value=0, aggfunc=np.sum) summ = df.pivot_table(index=['District'], columns=['Date'], values=['Vsego_day_v1', 'Vsego_day_v2'], fill_value=0, aggfunc=np.sum) total = pd.DataFrame(summ.sum()).T res['Район'] = res.index.get_level_values(0) res['Пункт вакцинации'] = res.index.get_level_values(1) summ['Район'] = summ.index.get_level_values(0) summ['Пункт вакцинации'] = 'Всего' total['Район'] = 'Весь город' total['Пункт вакцинации'] = 'Все' itog = pd.concat([total, summ, res], ignore_index=True) itog = itog.set_index(['Район', 'Пункт вакцинации']) excel = get_dir('temp') + '/vaccine_dates.xlsx' itog.to_excel(excel) return excel
def put_excel_for_mo(df, name): stat = pd.DataFrame() for org in df['Медицинская организация'].unique(): k = len(stat) stat.loc[k, 'Медицинская организация'] = org part = df[df['Медицинская организация'] == org] part.index = range(1, len(part) + 1) part.fillna(0, inplace=True) part = part.applymap(str) root = get_path_mo(org) if root: path_otch = root + 'Замечания Мин. Здравоохранения' try: os.makedirs(path_otch) except OSError: pass file = path_otch + '\\' + str( datetime.datetime.now().date()) + ' ' + name + '.xlsx' with pd.ExcelWriter(file) as writer: part.to_excel(writer, sheet_name='унрз') stat.loc[k, 'Статус'] = 'Файл положен' stat.loc[k, 'Имя файла'] = file else: stat.loc[k, 'Статус'] = 'Не найдена директория для файла' stat.index = range(1, len(stat) + 1) with pd.ExcelWriter( get_dir('Temp') + r'\отчет по разложению ' + name + '.xlsx') as writer: stat.to_excel(writer, sheet_name='унрз')
def medical_personal_sick(a): medPers = pd.read_sql('EXEC med.p_StartMedicalPersonalSick', con) date = datetime.datetime.today().strftime("%Y_%m_%d_%H_%M") file = get_dir('med_sick') + '/Заболевшие медики ' + date + '.xlsx' with pd.ExcelWriter(file) as writer: medPers.to_excel(writer, sheet_name='meducal', index=False) return 'Создан файл по заболевшим сотрудникам'
def cvod_42_covid(a): sql = open('sql/parus/covid_42_svod.sql', 'r').read() with cx_Oracle.connect(userName, password, userbase, encoding="UTF-8") as con: df = pd.read_sql(sql, con) date = str(df['DAY'].unique()[0]) del df['DAY'] del df['ORGANIZATION'] new_name = date + '_42_COVID_19.xlsx' shablon_path = get_dir('help') shutil.copyfile(shablon_path + '/42_COVID_19_svod.xlsx', shablon_path + '/' + new_name) wb = openpyxl.load_workbook(shablon_path + '/' + new_name) ws = wb['Свод'] rows = dataframe_to_rows(df, index=False, header=False) for r_idx, row in enumerate(rows, 4): for c_idx, value in enumerate(row, 2): ws.cell(row=r_idx, column=c_idx, value=value) wb.save(shablon_path + '/' + new_name) return shablon_path + '/' + new_name
def cvod_29_covid(a): if int(time.strftime("%H")) < 16: sql = open('sql/parus/covid_29_svod1.sql', 'r').read() date = (datetime.datetime.now() - datetime.timedelta(days=1)).strftime('%d_%m_%Y') else: sql = open('sql/parus/covid_29_svod0.sql', 'r').read() date = datetime.datetime.now().strftime('%d_%m_%Y') with cx_Oracle.connect(userName, password, userbase, encoding="UTF-8") as con: df = pd.read_sql(sql, con) new_name = date + '_29_COVID_19_cvod.xlsx' shablon_path = get_dir('help') shutil.copyfile(shablon_path + '/29_COVID_19_svod.xlsx', shablon_path + '/' + new_name) wb = openpyxl.load_workbook(shablon_path + '/' + new_name) ws = wb['Для заполнения'] rows = dataframe_to_rows(df, index=False, header=False) for r_idx, row in enumerate(rows, 3): for c_idx, value in enumerate(row, 1): ws.cell(row=r_idx, column=c_idx, value=value) wb.save(shablon_path + '/' + new_name) return shablon_path + '/' + new_name
def no_save_50(a): sql = open('sql/parus/covid_50_no_save.sql', 'r').read() with cx_Oracle.connect(userName, password, userbase, encoding="UTF-8") as con: df = pd.read_sql(sql, con) df = df.fillna(0) table_html = get_dir('temp') + '/table.html' table_png = get_dir('temp') + '/table.png' df.to_html(table_html, justify='center', index=False) command = "/usr/bin/wkhtmltoimage --encoding utf-8 -f png --width 0 " + table_html + " " + table_png try: subprocess.check_call(command, shell=True) except: raise my_except('Не удалось сделать файл\n' + subprocess.check_output(command, shell=True)) else: return table_png
def put_svod(df, name): path = get_dir('zam_svod') + '\\' + name name = str(datetime.datetime.now().date()) + ' ' + name + '.xlsx' try: os.mkdir(path) except OSError: pass df.index = range(1, len(df) + 1) df = df.applymap(str) df.fillna('пусто') with pd.ExcelWriter(path + '\\' + name) as writer: df.to_excel(writer)
def cvod_27_regiz(a): url = os.getenv('url837').replace('837', '870') data = requests.get(url).json() regiz = pd.DataFrame.from_dict(data) columns = [ 'orderresponse_assign_organization_level1_key', 'ShortNameMO', 'Кол-во тестов', 'Кол-во ПЦР тестов', 'Кол-во положительных ПЦР тестов', 'Кол-во тестов на антитела', 'Кол-во положительных тестов на антитела', 'Кол-во тестов на антитела после вакцинации', 'Кол-во положительных тестов на антитела после вакцинации' ] regiz = regiz[columns] sql = open('sql/parus/covid_27_regiz.sql', 'r').read() with cx_Oracle.connect(userName, password, userbase, encoding="UTF-8") as con: df = pd.read_sql(sql, con) sql = open('sql/covid/nsi_27.sql', 'r').read() with sqlalchemy.create_engine( f"mssql+pymssql://{user}:{passwd}@miacbase3/NsiBase", pool_pre_ping=True).connect() as con: nsi = pd.read_sql(sql, con) date = (datetime.datetime.now() - datetime.timedelta(days=2)).strftime('%d_%m_%Y') new_name = date + '_27_COVID_19_regiz.xlsx' shablon_path = get_dir('help') shutil.copyfile(shablon_path + '/27_COVID_19_regiz.xlsx', shablon_path + '/' + new_name) wb = openpyxl.load_workbook(shablon_path + '/' + new_name) ws = wb['parus'] rows = dataframe_to_rows(df, index=False, header=False) for r_idx, row in enumerate(rows, 4): for c_idx, value in enumerate(row, 1): ws.cell(row=r_idx, column=c_idx, value=value) ws = wb['regiz'] rows = dataframe_to_rows(regiz, index=False, header=True) for r_idx, row in enumerate(rows, 2): for c_idx, value in enumerate(row, 2): ws.cell(row=r_idx, column=c_idx, value=value) ws = wb['nsi'] rows = dataframe_to_rows(nsi, index=False, header=True) for r_idx, row in enumerate(rows, 1): for c_idx, value in enumerate(row, 1): ws.cell(row=r_idx, column=c_idx, value=value) wb.save(shablon_path + '/' + new_name) return shablon_path + '/' + new_name
def delete_old_files(date): path = get_dir( 'covid' ) + f"\\EPID.COVID.*\\EPID.COVID.*\\Замечания Мин. Здравоохранения\\{date.strftime('%Y-%m-%d')}*.xlsx" files = glob.glob(path) if len(files) == 0: return 'Нет файлов за это число!' for file in files: try: os.remove(file) except: pass return f"Я все поудалял за дату {date.strftime('%Y-%m-%d')}"
def sbor_death_week_files(a): date_start = (datetime.datetime.today() + relativedelta.relativedelta(weeks=-2, weekday=3)).date() date_end = (datetime.datetime.today() + relativedelta.relativedelta(weeks=-1, weekday=3)).date() path = get_dir( 'covid' ) + f'\EPID.COVID.*\EPID.COVID.*\Умершие за неделю\*{date_start} по {date_end}*.xlsx' new_path = get_dir('death_week') + f'\с {date_start} по {date_end}' try: os.mkdir(new_path) except: pass for file in glob.glob(path): shutil.copyfile( file, new_path + '\\' + file.split('\\')[-1 - 2] + ' ' + file.split('\\')[-1]) return f'Файлы с {date_start} по {date_end} собраны в папку'
def sbor_death_week_files(a): #date_end = '2022-01-05' #date_start = '2021-12-23' date_end = (datetime.datetime.today() + relativedelta.relativedelta(weeks=-1, weekday=2)).date() date_start = date_end - datetime.timedelta(days=6) path = get_dir( 'covid' ) + f'/EPID.COVID.*/EPID.COVID.*/Умершие за неделю/*{date_start} по {date_end}*.xlsx' new_path = get_dir('death_week') + f'/с {date_start} по {date_end}' try: os.mkdir(new_path) except: pass for file in glob.glob(path): shutil.copyfile( file, new_path + '/' + file.split('/')[-1 - 2] + ' ' + file.split('/')[-1]) return f'Файлы с {date_start} по {date_end} собраны в папку'
def covid_53_svod(a): sql = open('sql/parus/covid_53_svod.sql', 'r').read() with cx_Oracle.connect(userName, password, userbase, encoding="UTF-8") as con: df = pd.read_sql(sql, con) date = df['DAY'].unique()[0] del df['DAY'] sm = df.groupby(by="ORGANIZATION", as_index=False).sum() sm['TYPE'] = 'Медицинская организация' for i in range(len(sm)): k = len(df) for col in df.columns: try: df.loc[k, col] = sm.at[i, col] except: pass df = df.sort_values(by=["ORGANIZATION", "POK02"], na_position='first', ignore_index=True).fillna('') new_name = '53_COVID_БОТКИНА_' + date + '.xlsx' shablon_path = get_dir('help') shutil.copyfile(shablon_path + '/53_COVID_19_svod.xlsx', shablon_path + '/' + new_name) wb = openpyxl.load_workbook(shablon_path + '/' + new_name) ws = wb['Для заполнения(Спутник-М)'] rows = dataframe_to_rows(df, index=False, header=False) for r_idx, row in enumerate(rows, 5): for c_idx, value in enumerate(row, 2): ws.cell(row=r_idx, column=c_idx, value=value) wb.save(shablon_path + '/' + new_name) return shablon_path + '/' + new_name
def medical_waste(a): sql = open('sql/parus/medical_waste.sql', 'r').read() with cx_Oracle.connect(userName, password, userbase, encoding="UTF-8") as con: df = pd.read_sql(sql, con) for col in df.columns: try: df[col] = pd.to_numeric(df[col], errors='ignore') except: pass new_name = datetime.datetime.now().strftime( '%d_%m_%Y') + '_медицинские_отходы.xlsx' shablon_path = get_dir('help') shutil.copyfile(shablon_path + '/medical_waste.xlsx', shablon_path + '/' + new_name) wb = openpyxl.load_workbook(shablon_path + '/' + new_name) ws = wb['SVOD'] rows = dataframe_to_rows(df, index=False, header=False) for r_idx, row in enumerate(rows, 5): for c_idx, value in enumerate(row, 2): ws.cell(row=r_idx, column=c_idx, value=value) dolg = set(df.loc[df['YEAR'] == datetime.datetime.now().year -1 , 'ORGANIZATION' ].unique()) \ - set(df.loc[df['YEAR'] == datetime.datetime.now().year, 'ORGANIZATION' ].unique()) dolg = pd.DataFrame(dolg) ws = wb['DOLG'] rows = dataframe_to_rows(dolg, index=False, header=False) for r_idx, row in enumerate(rows, 2): for c_idx, value in enumerate(row, 2): ws.cell(row=r_idx, column=c_idx, value=value) wb.save(shablon_path + '/' + new_name) return shablon_path + '/' + new_name
def o_40_covid_by_date(a): sql = open('sql/parus/covid_40_by_date.sql', 'r').read() with cx_Oracle.connect(userName, password, userbase, encoding="UTF-8") as con: df = pd.read_sql(sql, con) df = df.loc[df.TVSP.notnull()] df = df.loc[~df.TVSP.isin(['Пункт вакцинации'])] df.V_1 = pd.to_numeric(df.V_1) df.V_2 = pd.to_numeric(df.V_2) df.DAY = df.DAY.dt.date res = df.pivot_table(index=['DIST', 'TVSP'], columns=['DAY'], values=['V_1', 'V_2'], fill_value=0, aggfunc=np.sum) summ = df.pivot_table(index=['DIST'], columns=['DAY'], values=['V_1', 'V_2'], fill_value=0, aggfunc=np.sum) total = pd.DataFrame(summ.sum()).T res['Район'] = res.index.get_level_values(0) res['Пункт вакцинации'] = res.index.get_level_values(1) summ['Район'] = summ.index.get_level_values(0) summ['Пункт вакцинации'] = 'Всего' total['Район'] = 'Весь город' total['Пункт вакцинации'] = 'Все' itog = pd.concat([total, summ, res], ignore_index=True) itog = itog.set_index(['Район', 'Пункт вакцинации']) file = get_dir('temp') + '/Вакцинация по датам.xlsx' with pd.ExcelWriter(file) as writer: itog.V_1.to_excel(writer, sheet_name='Первый компонент вакцины') itog.V_2.to_excel(writer, sheet_name='Второй компонент вакцины') return file
def patient_amb_stac(a): sql = open('sql/covid/patient_amb_stac.sql', 'r').read() with sqlalchemy.create_engine( f"mssql+pymssql://{user}:{passwd}@{server}/{dbase}", pool_pre_ping=True).connect() as con: df = pd.read_sql(sql, con) date_otch = datetime.datetime.now().strftime('%d_%m_%Y') new_name = date_otch + '_Пациенты на амб и стац лечении.xlsx' shablon_path = get_dir('help') shutil.copyfile(shablon_path + '/patient_amb_stac.xlsx', shablon_path + '/' + new_name) wb = openpyxl.load_workbook(shablon_path + '/' + new_name) ws = wb['Лист1'] rows = dataframe_to_rows(df, index=False, header=False) for r_idx, row in enumerate(rows, 2): for c_idx, value in enumerate(row, 1): ws.cell(row=r_idx, column=c_idx, value=value) wb.save(shablon_path + '/' + new_name) return shablon_path + '/' + new_name
def cvod_51_covid(a): sql1 = open('sql/parus/covid_51_svod.sql', 'r').read() sql2 = open('sql/parus/covid_51_svod_all.sql', 'r').read() with cx_Oracle.connect(userName, password, userbase, encoding="UTF-8") as con: df = pd.read_sql(sql1, con) with cx_Oracle.connect(userName, password, userbase, encoding="UTF-8") as con: df_all = pd.read_sql(sql2, con) date = df['DAY'].unique()[0] del df['DAY'] df = df.append(df.sum(numeric_only=True), ignore_index=True) df.loc[len(df) - 1, 'COV_02'] = 'ИТОГО:' new_name = date + '_51_COVID_19_cvod.xlsx' shablon_path = get_dir('help') shutil.copyfile(shablon_path + '/51_COVID_19_svod.xlsx', shablon_path + '/' + new_name) wb = openpyxl.load_workbook(shablon_path + '/' + new_name) ws = wb['Свод по МО'] rows = dataframe_to_rows(df, index=False, header=False) for r_idx, row in enumerate(rows, 4): for c_idx, value in enumerate(row, 2): ws.cell(row=r_idx, column=c_idx, value=value) ws = wb['Свод по всем МО'] rows = dataframe_to_rows(df_all, index=False, header=False) for r_idx, row in enumerate(rows, 4): for c_idx, value in enumerate(row, 1): ws.cell(row=r_idx, column=c_idx, value=value) wb.save(shablon_path + '/' + new_name) return shablon_path + '/' + new_name
def svod_43_covid_19(a): sql = open('sql/parus/covid_43_svod.sql', 'r').read() if datetime.datetime.today().weekday() == 0: sql1 = open('sql/parus/covid_43_svod_old3.sql', 'r').read() else: sql1 = open('sql/parus/covid_43_svod_old1.sql', 'r').read() with cx_Oracle.connect(userName, password, userbase, encoding="UTF-8") as con: df = pd.read_sql(sql, con) df_old = pd.read_sql(sql1, con) df.index = range(1, len(df) + 1) df_old.index = range(1, len(df_old) + 1) date_otch = datetime.datetime.now().strftime('%d_%m_%Y') new_name = date_otch + '_43_COVID_19_cvod.xlsx' shablon_path = get_dir('help') shutil.copyfile(shablon_path + '/43 COVID 19.xlsx', shablon_path + '/' + new_name) wb = openpyxl.load_workbook(shablon_path + '/' + new_name) ws = wb['Разрез по МО'] rows = dataframe_to_rows(df, index=True, header=False) for r_idx, row in enumerate(rows, 4): for c_idx, value in enumerate(row, 1): ws.cell(row=r_idx, column=c_idx, value=value) wb.save(shablon_path + '/' + new_name) wb = openpyxl.load_workbook(shablon_path + '/' + new_name) ws = wb['Вчера'] rows = dataframe_to_rows(df_old, index=True, header=False) for r_idx, row in enumerate(rows, 4): for c_idx, value in enumerate(row, 1): ws.cell(row=r_idx, column=c_idx, value=value) wb.save(shablon_path + '/' + new_name) return shablon_path + '/' + new_name
def generate_pptx(date): def create_slide(title, type_error, type_org, date_start, date_end, dynamic): if type_org == 'Частные': chastn = 'in' type_org = 'Амбулаторная' else: chastn = 'not in' sql = f"""select distinct case when d1.[Медицинская организация] is null then d2.[Медицинская организация] when d2.[Медицинская организация] is null then d1.[Медицинская организация] else d1.[Медицинская организация] end as "Медицинская организация" ,d1.eror1 , d2.eror2 , d2.eror2 - d1.eror1 as 'Динамика' from ( SELECT [Медицинская организация] , isnull([{type_error}],0) as 'eror1' FROM [COVID].[robo].[cv_Zamechania_fr] where [дата отчета] = '{date_start}' and [Тип организации] = '{type_org}' ) as d1 full join ( SELECT [Медицинская организация] , isnull([{type_error}],0) as 'eror2' FROM [COVID].[robo].[cv_Zamechania_fr] where [дата отчета] = '{date_end}' and [Тип организации] = '{type_org}' ) as d2 on (d1.[Медицинская организация] = d2.[Медицинская организация]) where d2.eror2 is not null and d1.eror1 is not null and d1.[Медицинская организация] {chastn} ('ООО "ЛАХТА КЛИНИКА"','ООО «Городские поликлиники»', 'ООО "Современная медицина"', 'ООО «Медицентр ЮЗ»','АНО "Медицинский центр "Двадцать первый век"', 'ООО "ЦСМ "21 ВЕК"', 'ООО Ава-Петер','ЧУЗ «КБ «РЖД-МЕДИЦИНА» Г. С-ПЕТЕРБУРГ"','ООО «ММЦ «СОГАЗ»') and d1.[Медицинская организация] <> 'МО другого региона' order by [Динамика] DESC, d1.eror1 DESC""" #send('',sql) df = pd.read_sql(sql, con) df.fillna(0, inplace=True) if dynamic: df['Динамика'] = pd.to_numeric(df['Динамика']) df.loc[(df != 0).any(1)] df.index = range(len(df)) else: df = df.sort_values(by=['eror2'], ascending=False) df = df.loc[df['eror2'] != 0] df.loc[(df != 0).any(1)] df.index = range(len(df)) if not len(df): return 1 sum_err1 = df['eror1'].sum() sum_err2 = df['eror2'].sum() title_only_slide_layout = prs.slide_layouts[5] slide = prs.slides.add_slide(title_only_slide_layout) shapes = slide.shapes shapes.title.text = title shapes.title.text_frame.paragraphs[0].font.color.rgb = RGBColor( 255, 0, 0) shapes.title.text_frame.paragraphs[0].font.size = Pt(30) body_shape = shapes.placeholders[0] tf = body_shape.text_frame p = tf.add_paragraph() p.text = 'Общее число замечаний на ' + date_start + ' — ' + str( sum_err1).replace('.0', '') p.font.color.rgb = RGBColor(20, 20, 20) p.font.size = Pt(18) p = tf.add_paragraph() p.text = 'На ' + date_end + ' — ' + str(sum_err2).replace('.0', '') p.font.color.rgb = RGBColor(20, 20, 20) p.font.size = Pt(18) p = tf.add_paragraph() p.text = 'Общая динамика: ' + str(sum_err2 - sum_err1).replace( '.0', '') p.font.color.rgb = RGBColor(20, 20, 20) p.font.size = Pt(18) # Первая таблица if dynamic: if len(df.loc[~(df['Динамика'] < 0)]) > 16: rows = 17 else: rows = len(df.loc[~(df['Динамика'] < 0)]) + 1 else: #send('', type_error + str(len(df))) if len(df) > 16: rows = 17 else: rows = len(df) + 1 if dynamic: cols = 5 else: cols = 3 left = Inches(0.5) top = Inches(2) width = Inches(5) height = Inches(0.1) shape = shapes.add_table(rows, cols, left, top, width, height) table = shape.table tbl = shape._element.graphic.graphicData.tbl style_id = '{9DCAF9ED-07DC-4A11-8D7F-57B35C25682E}' tbl[0][-1].text = style_id # set column widths table.columns[0].width = Inches(0.5) table.columns[1].width = Inches(3.5) table.columns[2].width = Inches(1.5) if dynamic: table.columns[1].width = Inches(2.5) table.columns[3].width = Inches(1.5) table.columns[4].width = Inches(1.5) # write column headings table.cell(0, 0).text = '№' table.cell(0, 1).text = 'Медицинская организация' if dynamic: table.cell(0, 2).text = date_start table.cell(0, 3).text = date_end table.cell(0, 4).text = 'Динамика' else: table.cell(0, 2).text = date_end k = 0 if dynamic: if len(df.loc[~(df['Динамика'] < 0)]): for i in df.loc[~(df['Динамика'] < 0)].head(16).index: table.cell(k + 1, 0).text = str(i + 1) table.cell(k + 1, 0).text_frame.paragraphs[0].font.size = Pt(12) table.cell(k + 1, 1).text = df.at[i, 'Медицинская организация'] table.cell(k + 1, 1).text_frame.paragraphs[0].font.size = Pt(10) table.cell(k + 1, 2).text = str(df.at[i, 'eror1']).replace('.0', '') table.cell(k + 1, 2).text_frame.paragraphs[0].font.size = Pt(12) table.cell(k + 1, 3).text = str(df.at[i, 'eror2']).replace('.0', '') table.cell(k + 1, 3).text_frame.paragraphs[0].font.size = Pt(12) table.cell(k + 1, 4).text = str(df.at[i, 'Динамика']).replace( '.0', '') table.cell(k + 1, 4).text_frame.paragraphs[0].font.size = Pt(12) k += 1 if k > 16: break else: for i in df.head(16).index: table.cell(k + 1, 0).text = str(k + 1) table.cell(k + 1, 0).text_frame.paragraphs[0].font.size = Pt(12) table.cell(k + 1, 1).text = df.at[i, 'Медицинская организация'] table.cell(k + 1, 1).text_frame.paragraphs[0].font.size = Pt(10) table.cell(k + 1, 2).text = str(df.at[i, 'eror2']).replace('.0', '') table.cell(k + 1, 2).text_frame.paragraphs[0].font.size = Pt(12) df.drop(i, inplace=True) k += 1 # Вторая таблица if dynamic: if len(df.loc[df['Динамика'] < 0]) > 16: rows = 17 else: rows = len(df.loc[df['Динамика'] < 0]) + 1 else: #send('','2' + type_error + str(len(df))) if len(df) > 16: rows = 17 else: rows = len(df) + 1 if rows < 2: #send('', str(df.head())) return 1 if dynamic: cols = 5 else: cols = 3 left = Inches(8.25) top = Inches(2) width = Inches(5) height = Inches(0.1) shape = shapes.add_table(rows, cols, left, top, width, height) table = shape.table tbl = shape._element.graphic.graphicData.tbl style_id = '{9DCAF9ED-07DC-4A11-8D7F-57B35C25682E}' tbl[0][-1].text = style_id # set column widths table.columns[0].width = Inches(0.5) table.columns[1].width = Inches(3.5) table.columns[2].width = Inches(1.5) if dynamic: table.columns[1].width = Inches(2.5) table.columns[3].width = Inches(1.5) table.columns[4].width = Inches(1.5) # write column headings table.cell(0, 0).text = '№' table.cell(0, 1).text = 'Медицинская организация' if dynamic: table.cell(0, 2).text = date_start table.cell(0, 3).text = date_end table.cell(0, 4).text = 'Динамика' else: table.cell(0, 2).text = date_end k = 0 if dynamic: if len(df.loc[df['Динамика'] < 0]): for i in df.loc[df['Динамика'] < 0].sort_values( by=['Динамика']).head(16).index: table.cell(k + 1, 0).text = str(i + 1) table.cell(k + 1, 0).text_frame.paragraphs[0].font.size = Pt(12) table.cell(k + 1, 1).text = df.at[i, 'Медицинская организация'] table.cell(k + 1, 1).text_frame.paragraphs[0].font.size = Pt(10) table.cell(k + 1, 2).text = str(df.at[i, 'eror1']).replace('.0', '') table.cell(k + 1, 2).text_frame.paragraphs[0].font.size = Pt(12) table.cell(k + 1, 3).text = str(df.at[i, 'eror2']).replace('.0', '') table.cell(k + 1, 3).text_frame.paragraphs[0].font.size = Pt(12) table.cell(k + 1, 4).text = str(df.at[i, 'Динамика']).replace( '.0', '') table.cell(k + 1, 4).text_frame.paragraphs[0].font.size = Pt(12) k += 1 if k > 16: break else: for i in df.head(16).index: table.cell(k + 1, 0).text = str(k + 17) table.cell(k + 1, 0).text_frame.paragraphs[0].font.size = Pt(12) table.cell(k + 1, 1).text = df.at[i, 'Медицинская организация'] table.cell(k + 1, 1).text_frame.paragraphs[0].font.size = Pt(10) table.cell(k + 1, 2).text = str(df.at[i, 'eror2']).replace('.0', '') table.cell(k + 1, 2).text_frame.paragraphs[0].font.size = Pt(12) k += 1 date1 = date.split(',')[0] date2 = date.split(',')[1] date_start_sql = date1 date_end_sql = date2 date_start = pd.to_datetime(date1).strftime("%d.%m.%Y") date_end = pd.to_datetime(date2).strftime("%d.%m.%Y") prs = Presentation() prs.slide_height = Inches(9) prs.slide_width = Inches(16) title_slide_layout = prs.slide_layouts[0] slide = prs.slides.add_slide(title_slide_layout) title = slide.shapes.title subtitle = slide.placeholders[1] # Первый слайд title.text = "Замечания по ведению Федерального регистра лиц, больных COVID-19" subtitle.text = "По состоянию на " + date_end # Второй слайд bullet_slide_layout = prs.slide_layouts[5] slide = prs.slides.add_slide(bullet_slide_layout) shapes = slide.shapes title_shape = shapes.title body_shape = shapes.placeholders[0] title_shape.text = 'Группы замечаний по ведению Регистра на ' + date_end tf = body_shape.text_frame date_in_text = (pd.to_datetime(date2) - datetime.timedelta(30)).strftime("%d.%m.%Y") text = f"""Срок создания регистровой записи (УНРЗ) не соответствует дате установки диагноза – более 7 дней между датами (МЗ оценивает регион) (Количество регистровых записей, внесённых с задержкой больше недели, за последний месяц) Отсутствие информации о номере Полиса ОМС в разделе «Медицинское страхование» Не заполнен Раздел «Результаты ежедневного наблюдения» (дневниковые записи) – по данным МЗ РФ Поле «исход заболевания» заполнено «переведён в другую МО» без открытия следующего этапа лечения («зависшие» пациенты более 7 дней от даты перевода в др. МО) Поле «исход заболевания» не заполнено с датой установки диагноза ранее {date_in_text} (длительность болезни более 30 дней) Количество УНРЗ с заполненным полем «исход заболевания» «выздоровление» не соответствует оперативной отчётности поликлиник Количество УНРЗ с пустым полем «исход заболевания» (находящиеся под медицинским наблюдением в амбулаторных условиях) не соответствует оперативной отчётности поликлиник Поле «Вид лечения» ошибочно заполнено «стационарный» - у пациентов, находящихся под медицинским наблюдением в амбулаторных условиях Количество УНРЗ с заполненным Разделом «Результаты ежедневного наблюдения» в части поля «ИВЛ» не соответствует оперативной отчётности стационаров Количество УНРЗ пациентов, находящихся под медицинским наблюдением в стационарных условиях, не соответствует оперативной отчётности стационаров Дублированные УНРЗ в одном МО Отсутствие прикреплённого файла патологоанатомического заключения""" rows = 12 cols = 2 left = Inches(0.5) top = Inches(2) width = Inches(8) height = Inches(0.1) shape = shapes.add_table(rows, cols, left, top, width, height) tbl = shape._element.graphic.graphicData.tbl table = shape.table style_id = '{2D5ABB26-0587-4C30-8999-92F81FD0307C}' tbl[0][-1].text = style_id table.columns[0].width = Inches(0.5) table.columns[1].width = Inches(8.0) i = 0 for t in text.split('\n'): table.cell(i, 0).text = str(i + 1) + ')' table.cell(i, 0).text_frame.paragraphs[0].font.size = Pt(12) table.cell(i, 1).text = t table.cell(i, 1).text_frame.paragraphs[0].font.size = Pt(11) i += 1 # Третий слайд bullet_slide_layout = prs.slide_layouts[2] slide = prs.slides.add_slide(bullet_slide_layout) shapes = slide.shapes title_shape = shapes.title title_shape.text = '1 группа замечаний' title_shape.text_frame.paragraphs[0].font.color.rgb = RGBColor(255, 0, 0) body_shape = shapes.placeholders[1] tf = body_shape.text_frame #df = pd.read_sql("Select count(*) from cv_fedreg where DATEDIFF(day,[Дата создания РЗ],getdate() ) < 31", con) df = pd.read_sql( """ select count(*) from cv_fedreg where DATEDIFF(day,[Дата создания РЗ],getdate() ) < 31 and (DATEDIFF(day,[Дата создания РЗ],[Диагноз установлен] ) > 7 or DATEDIFF(day,[Дата создания РЗ],[Диагноз установлен] ) < -7 ) """, con) p = tf.add_paragraph() p.text = 'за последние 30 дней: + ' + str(df.iat[0, 0]) + ' УНРЗ' p.font.color.rgb = RGBColor(255, 0, 0) p.font.size = Pt(30) df = pd.read_sql( """ select count(*) from cv_fedreg where (DATEDIFF(day,[Дата создания РЗ],[Диагноз установлен] ) > 7 or DATEDIFF(day,[Дата создания РЗ],[Диагноз установлен] ) < -7 ) """, con) p = tf.add_paragraph() p.text = 'за всё время: ' + str(df.iat[0, 0]) + ' УНРЗ' p.font.color.rgb = RGBColor(255, 0, 0) p.font.size = Pt(30) p = tf.add_paragraph() p = tf.add_paragraph() p.text = 'Срок создания регистровой записи (УНРЗ) не соответствует дате установки диагноза: разница более 7 дней после даты установки диагноза, количество взято за последний месяц' p.font.size = Pt(20) for title, type_error, type_org, dynamic in valume: try: create_slide(title, type_error, type_org, date_start_sql, date_end_sql, dynamic) except Exception as e: send('', type_error + '\n' + type_org + '\n' + str(e)) pptx_file = get_dir('temp') + '/dynamic.pptx' prs.save(pptx_file) return pptx_file
def svod_unique_patient(date_global): def search(fio, birthday): for i in range(len(svod_list)): if birthday == svod_list[i].birthday: if fio == svod_list[i].fio: return svod_list[i].number_row return None if date_global.weekday() in [1, 2, 3, 4]: date_svod = (date_global - datetime.timedelta(days=1)).strftime("%Y-%m-%d") svod = pd.read_excel(get_dir('cov_list') + '/Автосвод ' + date_svod + '.xlsx', sheet_name='Свод', dtype=str) list_ = [] date_rpn = date_global.strftime("%d.%m.%Y") file = get_dir( 'covid' ) + '/EPID.COVID.RPN/Заболевшие covid в ФС за ' + date_rpn + '.xlsx' file2 = get_dir( 'covid' ) + '/EPID.COVID.RPN/Заболевшие covid в ФС за ' + date_rpn + '.xls' try: rpn = pd.read_excel(file, dtype=str) except: rpn = pd.read_excel(file2, dtype=str) rpn['Дата отчета'] = date_rpn if date_global.weekday() in [0]: date_svod = (date_global - datetime.timedelta(days=3)).strftime("%Y-%m-%d") svod = pd.read_excel(get_dir('cov_list') + '/Автосвод ' + date_svod + '.xlsx', sheet_name='Свод', dtype=str) list_ = [] for i in range(3): date_rpn = (date_global - datetime.timedelta(days=i)).strftime("%d.%m.%Y") file = get_dir( 'covid' ) + '/EPID.COVID.RPN/Заболевшие covid в ФС за ' + date_rpn + '.xlsx' file2 = get_dir( 'covid' ) + '/EPID.COVID.RPN/Заболевшие covid в ФС за ' + date_rpn + '.xls' try: excel = pd.read_excel(file, dtype=str) except: excel = pd.read_excel(file2, dtype=str) excel['Дата отчета'] = date_rpn list_.append(excel) rpn = pd.DataFrame rpn = pd.concat(list_) rpn['Unnamed: 0'] = range(len(rpn)) if date_global.weekday() in [0, 1, 2, 3, 4]: svod_1 = svod svod_1['дата рождения'] = pd.to_datetime(svod_1['дата рождения'], errors='coerce') svod_1 = svod_1[svod_1['дата рождения'].notnull()] svod_1.index = range(len(svod_1)) rpn_1 = rpn rpn_1['Дата рождения '] = pd.to_datetime(rpn_1['Дата рождения '], errors='coerce') rpn_1 = rpn_1[rpn_1['Дата рождения '].notnull()] rpn_1.index = range(len(rpn_1)) rpn_1['Номер строки'] = range(len(rpn_1)) svod_list = [] rpn_list = [] human = namedtuple('hunan', ['fio', 'birthday', 'number_row', 'dubl_row']) for i in range(len(svod_1)): svod_list.append( human( str(svod_1.at[i, 'Фио']).lower(), svod_1.at[i, 'дата рождения'].strftime('%d.%m.%Y'), svod_1.at[i, '№п/п'], -1)) for i in range(len(rpn_1)): rpn_list.append( human( str(rpn_1.at[i, 'фио']).lower(), rpn_1.at[i, 'Дата рождения '].strftime('%d.%m.%Y'), rpn_1.at[i, 'Unnamed: 0'], search( str(rpn_1.at[i, 'фио']).lower(), rpn_1.at[i, 'Дата рождения '].strftime('%d.%m.%Y')))) dubli = pd.DataFrame() for human in rpn_list: if human.dubl_row != None: k = len(dubli) dubli.loc[k, 'Номер строки'] = human.number_row dubli.loc[k, 'Фио'] = human.fio dubli.loc[k, 'Дата рождения'] = human.birthday dubli.loc[k, 'Номер строки в своде'] = human.dubl_row for human in rpn_list: if human.dubl_row != None: svod.loc[svod['№п/п']==human.dubl_row,'Дата занесения в базу'] = \ str(svod.loc[svod['№п/п'] == human.dubl_row,'Дата занесения в базу'].unique()[0] ) \ + " , " \ + rpn.loc[rpn['Unnamed: 0'] == human.number_row, 'Дата отчета'].unique()[0] for human in rpn_list: if human.dubl_row != None: rpn = rpn[rpn['Unnamed: 0'] != human.number_row] file = get_dir('cov_list') + '/Автосвод ' + date_global.strftime( "%Y-%m-%d") + '.xlsx' with pd.ExcelWriter(file) as writer: svod.to_excel(writer, index=False, sheet_name='Свод') rpn.to_excel(writer, index=False, sheet_name='РПН') dubli.to_excel(writer, index=False, sheet_name='Дубли') return 'Свод сделан!' else: return 'Не буду я работать по выходным дням!'
def vacine_talon(a): url = os.getenv('url845').replace('845', '852') data = requests.get(url).json() df = pd.DataFrame.from_dict(data) if not len(df): raise my_except('Нет данных от нетрики') mo = pd.read_json(get_dir('help') + '/mo64.json') log = '' for i in range(len(df)): key = df.at[i, 'moLev2_key'] try: df.loc[i, 'Краткое стандартизованное наименование'] = mo.loc[ mo['Код'] == key, 'Краткое стандартизованное наименование'].unique()[0] except: log += '\nне удалось найти название для: ' + key try: df.loc[i, 'Долгота'] = mo.loc[mo['Код'] == key, 'Долгота'].unique()[0] df.loc[i, 'Широта'] = mo.loc[mo['Код'] == key, 'Широта'].unique()[0] except: log += '\nне удалось получить координаты для: ' + key try: orgid = mo.loc[mo['Код'] == key, 'orgid'].unique()[0] df.loc[i, 'организация'] = mo.loc[ mo['Код'] == orgid, 'Краткое стандартизованное наименование'].unique()[0] except: log += '\nне удалось найти название организации: ' + key try: df.loc[i, 'link'] = mo.loc[mo['Код'] == key, 'link'].unique()[0] except: log += '\nне удалось найти ссылку для:' + key if len(log): pass # send('',log) lat = pd.to_numeric(df['Широта']) lon = pd.to_numeric(df['Долгота']) elevation = pd.to_numeric(df['cntAppointments']) name = df['Краткое стандартизованное наименование'] org = df['организация'] cab = df['doctorFio'] ndate = df['cntAvailableDates'] date = df['Ближайший доступный талон'] link = df['link'] def color_change(elev): if (elev > 100): return ('green') elif (50 <= elev < 100): return ('orange') else: return ('red') m = folium.Map( name='test', location=[59.95020, 30.31543], zoom_start=11, max_zoom=14, min_zoom=10, min_lat=59.5, max_lat=60.5, min_lon=29.5, max_lon=31, max_bounds=True, prefer_canvas=True, #tiles = "CartoDB positron", #tiles = "CartoDB dark_matter", ) lgd_txt = '<span style="color: {col};">{txt}</span>' marker_cluster = MarkerCluster().add_to(m) for lat, lon, elevation, org, name, cab, ndate, date, link in zip( lat, lon, elevation, org, name, cab, ndate, date, link): html = """<style> .table { font-family: Helvetica, Arial, sans-serif; width: 300px; } .table__heading, .table__cell { padding: .5rem 0; } .table__heading { text-align: left; font-size: 1.5rem; border-bottom: 1px solid #ccc; } .table__cell { line-height: 2rem; } .table__cell--highlighted { font-size: 1.25rem; font-weight: 300; } .table__button { display: inline-block; padding: .75rem 2rem; margin-top: 1rem; font-weight: 300; text-decoration: none; text-transform: uppercase; color: #fff; background-color: #f82; border-radius: .10rem; } .table__button:hover { background-color: #e62; }""" + f""" </style> <table cellpadding="1" cellspacing="1" bordercolor="white" border="1" class="table"> <thead> <tr> <th colspan="2" scope="col" class="table__heading">{org}</th> </tr> </thead> <tbody> <tr> <td colspan="2" class="table__cell table__cell--highlighted">{name}</td> </tr> <tr> <td colspan="2" class="table__cell table__cell--highlighted">{cab}</td> </tr> <tr> <td class="table__cell">Доступно талонов:</td> <td class="table__cell table__cell--highlighted">{elevation}</td> </tr> <tr> <td class="table__cell">Количество дней в ближайшие 2 месяца, на которые есть талоны:</td> <td class="table__cell table__cell--highlighted">{ndate}</td> </tr> <tr> <td class="table__cell">Ближайший доступный талон:</td> <td class="table__cell table__cell--highlighted">{date}</td> </tr> <tr> <td colspan="2" class="table__cell"> <a href={link} target="_blank" class="table__button">Записаться</a> </td> </tr> </tbody> </table> """ iframe = folium.Html(html, script=True) popup = folium.Popup(iframe) try: folium.CircleMarker(location=[lat, lon], radius=13, popup=popup, fill_color=color_change(elevation), color="gray", fill_opacity=0.8).add_to(marker_cluster) except: pass #send('','не удалось') file = get_dir('temp') + '/map_light.html' m.save(file) command = f"/usr/bin/scp {file} vacmap@miacsitenew:/home/vacmap/vacmap/vacmap.html" os.system(command) return 1
def sbor_death_week_svod(a): #date_end = '2022-01-05' #date_start = '2021-12-23' date_end = (datetime.datetime.today() + relativedelta.relativedelta(weeks=-1, weekday=2)).date() date_start = date_end - datetime.timedelta(days=6) path = get_dir( 'death_week') + f'/с {date_start} по {date_end}/[!~]*[!вод]*.xlsx' send('', path) df = pd.DataFrame() list_ = [] for excel in glob.glob(path): chast = pd.read_excel(excel) chast['file'] = excel.rsplit('/', 1)[1] list_.append(chast) df = pd.concat(list_) df_file = get_dir('temp') + '/df_file.xlsx' df.to_excel(df_file) #send('',str(len(df)) + ' , ' + str(len(glob.glob(path)))) df = df.loc[~df['Медицинская организация'].isnull()] df['Ndays'] = ( pd.to_datetime(df['Дата госпитализации'], errors='coerce') - pd.to_datetime(df['Дата начала заболевания'], errors='coerce')).dt.days df = df.loc[~df['ФИО'].isnull()] df.index = range(len(df)) cheak_diagnoz = df[['ФИО', 'Дата рождения', 'Посмертный диагноз']].to_sql('cheak_diagnoz', con, schema='tmp', if_exists='replace', index=True) sql = """select c.*,fr.[Посмертный диагноз] as 'Посмертный диагноз новый' from ( select * from tmp.cheak_diagnoz ) as c left join (select * from robo.v_FedReg where [Исход заболевания] = 'Смерть') as fr on (c.[ФИО] = fr.[ФИО] and c.[Дата рождения] = fr.[Дата рождения]) where c.[Посмертный диагноз] <> fr.[Посмертный диагноз] order by [index] """ cheak = pd.read_sql(sql, con) for i in range(len(cheak)): index = int(cheak.at[i, 'index']) diagnoz = cheak.at[i, 'Посмертный диагноз новый'] df.loc[index, 'Посмертный диагноз'] = diagnoz send('', f"exec robo.death_week_value'{date_start}','{date_end}'") svod = pd.read_sql( f"exec robo.death_week_value'{date_start}','{date_end}'", con) svod = svod.fillna(0) MOs = svod['Медицинская организация'].unique() for org in df['Медицинская организация'].unique(): if not org in MOs: send('epid', 'Неправильная организация! \n' + org) for MO in MOs: svod.loc[svod['Медицинская организация'].isin([MO]),'J'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Факт обращения за медицинской помощью на амбулаторном этапе (да/нет)'].isin(['да','Да']) &\ df['Посмертный диагноз'].isin(['U07.1']) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'K'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Факт обращения за медицинской помощью на амбулаторном этапе (да/нет)'].isin(['да','Да']) &\ df['Посмертный диагноз'].isin(['U07.2']) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'L'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Факт обращения за медицинской помощью на амбулаторном этапе (да/нет)'].isin(['да','Да']) &\ df['Посмертный диагноз'].isin(['J18.9']) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'M'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Факт получения бесплатной лекарственной терапии (БЛТ) на амбулаторном этапе (да/нет)'].isin(['да','Да']) &\ df['Посмертный диагноз'].isin(['U07.1']) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'N'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Факт получения бесплатной лекарственной терапии (БЛТ) на амбулаторном этапе (да/нет)'].isin(['да','Да']) &\ df['Посмертный диагноз'].isin(['U07.2']) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'O'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Посмертный диагноз'].isin(['U07.1']) & (df['Ndays'] > 5) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'P'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Посмертный диагноз'].isin(['U07.2']) & (df['Ndays'] > 5) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'Q'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Посмертный диагноз'].isin(['J18.9']) & (df['Ndays'] > 5) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'R'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Посмертный диагноз'].isin(['U07.1']) \ & (df['Степень тяжести состояния при госпитализации (легкая, ср.тяжести, тяжелая)'].str.contains('яжел') ) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'S'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Посмертный диагноз'].isin(['U07.2']) \ & (df['Степень тяжести состояния при госпитализации (легкая, ср.тяжести, тяжелая)'].str.contains('яжел') ) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'T'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Посмертный диагноз'].isin(['J18.9']) \ & (df['Степень тяжести состояния при госпитализации (легкая, ср.тяжести, тяжелая)'].str.contains('яжел') ) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'U'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Посмертный диагноз'].isin(['U07.1']) & \ df['Поступление в ОРИТ при госпитализации (да/нет)'].isin(['да','Да']) \ & (df['Степень тяжести состояния при госпитализации (легкая, ср.тяжести, тяжелая)'].str.contains('яжел') ) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'V'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Посмертный диагноз'].isin(['U07.2']) & \ df['Поступление в ОРИТ при госпитализации (да/нет)'].isin(['да','Да']) \ & (df['Степень тяжести состояния при госпитализации (легкая, ср.тяжести, тяжелая)'].str.contains('яжел') ) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'W'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Посмертный диагноз'].isin(['J18.9']) & \ df['Поступление в ОРИТ при госпитализации (да/нет)'].isin(['да','Да']) \ & (df['Степень тяжести состояния при госпитализации (легкая, ср.тяжести, тяжелая)'].str.contains('яжел') ) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'X'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Посмертный диагноз'].isin(['U07.1']) & \ df['Факт выполнения КТ на амбулаторном этапе (да/нет)'].isin(['да','Да']) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'Y'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Посмертный диагноз'].isin(['U07.2']) & \ df['Факт выполнения КТ на амбулаторном этапе (да/нет)'].isin(['да','Да']) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'Z'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Посмертный диагноз'].isin(['J18.9']) & \ df['Факт выполнения КТ на амбулаторном этапе (да/нет)'].isin(['да','Да']) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'AA'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Посмертный диагноз'].isin(['U07.1']) & \ df['Факт выполнения ПЦР-SARS-CoV-2 на амбулаторном этапе (да/нет)'].isin(['да','Да']) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'AB'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Посмертный диагноз'].isin(['U07.2']) & \ df['Факт выполнения ПЦР-SARS-CoV-2 на амбулаторном этапе (да/нет)'].isin(['да','Да']) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'AC'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Посмертный диагноз'].isin(['J18.9']) & \ df['Факт выполнения ПЦР-SARS-CoV-2 на амбулаторном этапе (да/нет)'].isin(['да','Да']) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'AP'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Посмертный диагноз'].isin(['U07.1']) & \ df['Факт получения антицитокиновой терапии в стационаре (да/нет)'].isin(['да','Да']) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'AQ'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Посмертный диагноз'].isin(['U07.2']) & \ df['Факт получения антицитокиновой терапии в стационаре (да/нет)'].isin(['да','Да']) ]) svod.loc[svod['Медицинская организация'].isin([MO]),'AR'] = len(df[df['Медицинская организация'].isin([MO]) & \ df['Посмертный диагноз'].isin(['J18.9']) & \ df['Факт получения антицитокиновой терапии в стационаре (да/нет)'].isin(['да','Да']) ]) svod.rename(columns={ 'Умерло за истекшую неделю': 'Умерло за истекшую неделю (учитываются пациенты, по которым запись о летальном исходе внесена в ФР в течение отчетной недели)', 'Из них: Основная причина смерти COVID-19': 'Из них (по данным ПАЗ или по данным Посмертного клинического диагноза): основная причина смерти - COVID-19 U07.1', 'Из них: U07.2': 'Из них, U07.2', 'Из них: Внебольничные пневмонии': 'Из них, Внебольничные пневмонии', 'Умерших в возрасте до 60 лет': 'Количество умерших в возрасте до 60 лет (от всех заболеваний)', 'Умерших в возрасте до 60 лет (u07.1)': 'Количество умерших в возрасте до 60 лет (U07.1)', 'Умерших в возрасте до 60 лет (u07.2)': 'Количество умерших в возрасте до 60 лет (U07.2)', 'Умерших в возрасте до 60 лет (пневмонии)': 'Количество умерших в возрасте до 60 лет (пневмонии)', 'J': 'Количество пациентов, умерших от U07.1, обращавшихся за медицинской помощью на амбулаторном этапе', 'K': 'Количество пациентов, умерших от U07.2, обращавшихся за медицинской помощью на амбулаторном этапе', 'L': 'Количество пациентов, умерших от внебольничной пневмонии, обращавшихся за медицинской помощью на амбулаторном этапе', 'M': 'Количество пациентов, умерших от U07.1, получавших бесплатное лекарственное лечение амбулаторно', 'N': 'Количество пациентов, умерших от U07.2, получавших бесплатное лекарственное лечение амбулаторно', 'O': 'Количество пациентов, умерших от U07.1, поступивших в стационар после 5 дней после начала заболевания', 'P': 'Количество пациентов, умерших от U07.2, поступивших в стационар после 5 дней после начала заболевания', 'Q': 'Количество пациентов, умерших от внебольничной пневмонии, поступивших в стационар после 5 дней после начала заболевания', 'R': 'Количество пациентов, умерших от U07.1, поступивших в стационар в тяжелом состоянии', 'S': 'Количество пациентов, умерших от U07.2, поступивших в стационар в тяжелом состоянии', 'T': 'Количество пациентов, умерших от ВБП, поступивших в стационар в тяжелом состоянии', 'U': 'Количество пациентов, умерших от U07.1, поступивших в стационар в тяжелом состоянии в ОРИТ', 'V': 'Количество пациентов, умерших от U07.2, поступивших в стационар в тяжелом состоянии в ОРИТ', 'W': 'Количество пациентов, умерших от ВБП, поступивших в стационар в тяжелом состоянии в ОРИТ', 'X': 'Количество пациентов, умерших от U07.1, которым на амбулаторном этапе выполнялась КТ', 'Y': 'Количество пациентов, умерших от U07.2, которым на амбулаторном этапе выполнялась КТ', 'Z': 'Количество пациентов, умерших от ВБП, которым на амбулаторном этапе выполнялась КТ', 'AA': 'Количество пациентов, умерших от U07.1, которым на амбулаторном этапе выполнялась ПЦР-SARS-CoV-2', 'AB': 'Количество пациентов, умерших от U07.2, которым на амбулаторном этапе выполнялась ПЦР-SARS-CoV-2', 'AC': 'Количество пациентов, умерших от ВБП, которым на амбулаторном этапе выполнялась ПЦР-SARS-CoV-2', 'Умершие от U07.1 имеющие СД': 'Количество пациентов, умерших от U07.1, имеющих СД', 'Умершие от U07.2 имеющие СД': 'Количество пациентов, умерших от U07.2, имеющих СД', 'Умершие от ВПБ имеющие СД': 'Количество пациентов, умерших от ВБП, имеющих СД', 'Умершие от U07.1 имеющие АГ': 'Количество пациентов, умерших от U07.1, имеющих АГ', 'Умершие от U07.2 имеющие АГ': 'Количество пациентов, умерших от U07.2, имеющих АГ', 'Умершие от ВПБ имеющие АГ': 'Количество пациентов, умерших от ВБП, имеющих АГ', 'Умершие от U07.1 имеющие ИБС': 'Количество пациентов, умерших от U07.1, имеющих ИБС', 'Умершие от U07.2 имеющие ИБС': 'Количество пациентов, умерших от U07.2, имеющих ИБС', 'Умершие от ВПБ имеющие ИБС': 'Количество пациентов, умерших от ВБП, имеющих ИБС', 'Умершие от U07.1 имеющие ожирение': 'Количество пациентов, умерших от U07.1, имеющих ожирение', 'Умершие от U07.2 имеющие ожирение': 'Количество пациентов, умерших от U07.2, имеющих ожирение', 'Умершие от ВПБ имеющие ожирение': 'Количество пациентов, умерших от ВБП, имеющих ожирение', 'AP': 'Количество пациентов, умерших от U07.1, получавших в стационаре антицитокиновую терапию (АЦТ)', 'AQ': 'Количество пациентов, умерших от U07.2, получавших в стационаре АЦТ', 'AR': 'Количество пациентов, умерших от ВБП, получавших в стационаре АЦТ' }, inplace=True) sp = pd.DataFrame() summ = svod['Из них (по данным ПАЗ или по данным Посмертного клинического диагноза): основная причина смерти - COVID-19 U07.1'].sum() \ + svod['Из них, U07.2'].sum() + svod['Из них, Внебольничные пневмонии'].sum() def add_stroka_one(name, u071, u072, vpb): k = len(sp) sp.loc[k, 'Столбец'] = name sp.loc[k, 'Всего'] = u071 + u072 + vpb sp.loc[k, 'U07.1'] = u071 sp.loc[k, 'U07.1 (процент)'] = round(100 * u071 / summ, 1) sp.loc[k, 'U07.2'] = u072 sp.loc[k, 'U07.2 (процент)'] = round(100 * u072 / summ, 1) sp.loc[k, 'Пневмонии'] = vpb sp.loc[k, 'Пневмонии (процент)'] = round(100 * vpb / summ, 1) def add_stroka(name, u071, u072, vpb): k = len(sp) sp.loc[k, 'Столбец'] = name sp.loc[k, 'Всего'] = u071 + u072 + vpb sp.loc[k, 'U07.1'] = u071 sp.loc[k, 'U07.1 (процент)'] = round(100 * u071 / sp.at[0, 'U07.1'], 1) sp.loc[k, 'U07.2'] = u072 sp.loc[k, 'U07.2 (процент)'] = round(100 * u072 / sp.at[0, 'U07.2'], 1) sp.loc[k, 'Пневмонии'] = vpb sp.loc[k, 'Пневмонии (процент)'] = round( 100 * vpb / sp.at[0, 'Пневмонии'], 1) def add_stroka_free(name, u071, u072): k = len(sp) sp.loc[k, 'Столбец'] = name sp.loc[k, 'Всего'] = u071 + u072 sp.loc[k, 'U07.1'] = u071 sp.loc[k, 'U07.1 (процент)'] = round(100 * u071 / sp.at[2, 'U07.1'], 1) sp.loc[k, 'U07.2'] = u072 sp.loc[k, 'U07.2 (процент)'] = round(100 * u072 / sp.at[2, 'U07.2'], 1) add_stroka_one( 'Умерли U07.1, U07.2, пневмонии за неделю', svod[ 'Из них (по данным ПАЗ или по данным Посмертного клинического диагноза): основная причина смерти - COVID-19 U07.1'] .sum(), svod['Из них, U07.2'].sum(), svod['Из них, Внебольничные пневмонии'].sum()) add_stroka( 'Умерших в возрасте до 60 лет', svod['Количество умерших в возрасте до 60 лет (U07.1)'].sum(), svod['Количество умерших в возрасте до 60 лет (U07.2)'].sum(), svod['Количество умерших в возрасте до 60 лет (пневмонии)'].sum()) add_stroka( 'Обращались за медицинской помощью на догоспитальном этапе', svod[ 'Количество пациентов, умерших от U07.1, обращавшихся за медицинской помощью на амбулаторном этапе'] .sum(), svod[ 'Количество пациентов, умерших от U07.2, обращавшихся за медицинской помощью на амбулаторном этапе'] .sum(), svod[ 'Количество пациентов, умерших от внебольничной пневмонии, обращавшихся за медицинской помощью на амбулаторном этапе'] .sum()) add_stroka_free( 'Получавшие бесплатную лекарственную терапию', svod[ 'Количество пациентов, умерших от U07.1, получавших бесплатное лекарственное лечение амбулаторно'] .sum(), svod[ 'Количество пациентов, умерших от U07.2, получавших бесплатное лекарственное лечение амбулаторно'] .sum()) add_stroka( 'Поступили через 5 дней и более от начала заболевания', svod[ 'Количество пациентов, умерших от U07.1, поступивших в стационар после 5 дней после начала заболевания'] .sum(), svod[ 'Количество пациентов, умерших от U07.2, поступивших в стационар после 5 дней после начала заболевания'] .sum(), svod[ 'Количество пациентов, умерших от внебольничной пневмонии, поступивших в стационар после 5 дней после начала заболевания'] .sum()) add_stroka( 'Поступили в тяжелом состоянии', svod[ 'Количество пациентов, умерших от U07.1, поступивших в стационар в тяжелом состоянии'] .sum(), svod[ 'Количество пациентов, умерших от U07.2, поступивших в стационар в тяжелом состоянии'] .sum(), svod[ 'Количество пациентов, умерших от ВБП, поступивших в стационар в тяжелом состоянии'] .sum()) add_stroka( 'Поступили в тяжелом состоянии (поступили в ОРИТ)', svod[ 'Количество пациентов, умерших от U07.1, поступивших в стационар в тяжелом состоянии в ОРИТ'] .sum(), svod[ 'Количество пациентов, умерших от U07.2, поступивших в стационар в тяжелом состоянии в ОРИТ'] .sum(), svod[ 'Количество пациентов, умерших от ВБП, поступивших в стационар в тяжелом состоянии в ОРИТ'] .sum()) add_stroka( 'Выполнялась КТ на амбулаторном этапе', svod[ 'Количество пациентов, умерших от U07.1, которым на амбулаторном этапе выполнялась КТ'] .sum(), svod[ 'Количество пациентов, умерших от U07.2, которым на амбулаторном этапе выполнялась КТ'] .sum(), svod[ 'Количество пациентов, умерших от ВБП, которым на амбулаторном этапе выполнялась КТ'] .sum()) add_stroka( 'Выполнялась ПЦР на амбулаторном этапе', svod[ 'Количество пациентов, умерших от U07.1, которым на амбулаторном этапе выполнялась ПЦР-SARS-CoV-2'] .sum(), svod[ 'Количество пациентов, умерших от U07.2, которым на амбулаторном этапе выполнялась ПЦР-SARS-CoV-2'] .sum(), svod[ 'Количество пациентов, умерших от ВБП, которым на амбулаторном этапе выполнялась ПЦР-SARS-CoV-2'] .sum()) add_stroka( 'Получали антицитокиновую терапию', svod[ 'Количество пациентов, умерших от U07.1, получавших в стационаре антицитокиновую терапию (АЦТ)'] .sum(), svod[ 'Количество пациентов, умерших от U07.2, получавших в стационаре АЦТ'] .sum(), svod[ 'Количество пациентов, умерших от ВБП, получавших в стационаре АЦТ'] .sum()) add_stroka( 'Сопутствующая ИБС', svod['Количество пациентов, умерших от U07.1, имеющих ИБС'].sum(), svod['Количество пациентов, умерших от U07.2, имеющих ИБС'].sum(), svod['Количество пациентов, умерших от ВБП, имеющих ИБС'].sum()) add_stroka( 'Сопутствующий СД', svod['Количество пациентов, умерших от U07.1, имеющих СД'].sum(), svod['Количество пациентов, умерших от U07.2, имеющих СД'].sum(), svod['Количество пациентов, умерших от ВБП, имеющих СД'].sum()) add_stroka( 'Сопутствующий артериальная гипертония', svod['Количество пациентов, умерших от U07.1, имеющих АГ'].sum(), svod['Количество пациентов, умерших от U07.2, имеющих АГ'].sum(), svod['Количество пациентов, умерших от ВБП, имеющих АГ'].sum()) add_stroka( 'Сопутствующий ожирение', svod['Количество пациентов, умерших от U07.1, имеющих ожирение'].sum(), svod['Количество пациентов, умерших от U07.2, имеющих ожирение'].sum(), svod['Количество пациентов, умерших от ВБП, имеющих ожирение'].sum()) # ========== Расчёт районов ================== empty = '' for i in df.loc[df['Район проживания'].isnull()].index: empty += 'Пустой район в ' + str( df.at[i, 'Медицинская организация']) + '\n' if len(empty): send('epid', empty) df['Район проживания'] = df['Район проживания'].fillna('Пустое значение') df['Район проживания'] = df['Район проживания'].str.lower() districts = df['Район проживания'].unique() zone = pd.DataFrame() for area in districts: k = len(zone) zone.loc[k, 'Район проживания'] = area zone.loc[k, 'Количество умерших'] = len( df.loc[df['Район проживания'] == area]) zone.loc[k,'из них: в первые сутки'] = len(df.loc[(df['Район проживания'] == area) \ & (df['Смерть наступила в первые сутки с момента госпитализации (да/нет)'].isin(['да']))]) zone.loc[k,'из них: возраст старше 60'] = len(df.loc[(df['Район проживания'] == area) \ & (df['Смерть наступила в первые сутки с момента госпитализации (да/нет)'].isin(['да'])) \ & (df['Возраст'] >= 60) ]) file_svod = get_dir( 'temp') + f'/Умершие за неделю с {date_start} по {date_end} свод.xlsx' with pd.ExcelWriter(file_svod) as writer: svod.to_excel(writer, sheet_name='Свод по МО', index=False) sp.to_excel(writer, sheet_name='Проценты', index=False) zone.to_excel(writer, sheet_name='Умершие по районам', index=False) cheak.to_excel(writer, sheet_name='Изменившиеся диагнозы', index=False) try: shutil.copyfile(file_svod, new_path + '/свод.xlsx') except: pass return file_svod + ';' + df_file
def svod_40_COVID_19(a): path = get_dir('40_covid_19') + '/[!~]*.xlsx' list_ = [] usecolumns = 'A,B,C,D,F,G,I,J,L,M,O,P,R,S,U,V,X,Y,AA,AB,AC,AD,AF,AG,AI,AJ,AK' date_otch = None for xlsx in glob.glob(path): try: mo = pd.read_excel(xlsx, header=2, usecols=usecolumns, sheet_name='Для заполнения') except: raise my_exception('Проблема с файлом ' + xlsx) mo = mo[mo[2].notnull() & (~mo[2].isin(['Пункт вакцинации']))] if date_otch is None: date_otch = pd.to_datetime( xlsx.split('/')[-1].split('_Основной')[0][-1 - 9:], format="%d.%m.%Y").date() if len(mo.index) > 1: for i in mo.index: if i: mo.loc[i, 0] = 'Пункт вакцинации' mo.loc[i, 1] = mo.at[i, 2].split(' ')[0] mo.loc[i, 2] = str(mo.at[i, 2].split(' ', 1)[1]) else: mo.loc[i, 0] = 'Медицинская организация' list_.append(mo) if len(list_): df = pd.concat(list_) cols = list(df.columns.values) cols = cols[-1:] + cols[:-1] df = df[cols] df.index = range(1, len(df) + 1) itog = pd.DataFrame() potreb = pd.DataFrame() for col in df.columns: if col not in [0, 1, 2, 24, 26, 27, 28]: itog.loc[0, col] = df.loc[df[0] == 'Медицинская организация', col].sum() for i in range(len(df)): k = len(potreb) potreb.loc[k, 'Date'] = date_otch potreb.loc[k, 'District'] = df.iat[i, 1] potreb.loc[k, 'Type'] = df.iat[i, 0] potreb.loc[k, 'Name'] = df.iat[i, 2] potreb.loc[k, 'Vsego_day_v1'] = df.iat[i, 21] potreb.loc[k, 'Vsego_day_v2'] = df.iat[i, 23] potreb.loc[ k, 'Ostatok_v1'] = df.iat[i, 4] - df.iat[i, 20] - df.iat[i, 24] potreb.loc[k, 'Ostatok_v2'] = df.iat[i, 4] - df.iat[i, 22] potreb.loc[k, 'Potrebnost_v1'] = df.iat[i, 21] potreb.loc[k, 'Potrebnost_v2'] = df.iat[i, 23] pd.read_sql( f"delete from robo.vaccine_potrebnost where cast([Date] as date) = '{str(date_otch)}' select 1", con) potreb.to_sql('vaccine_potrebnost', con, schema='robo', if_exists='append', index=False) new_name = str(date_otch) + '_40_COVID_19_cvod.xlsx' shablon_path = get_dir('help') shutil.copyfile(shablon_path + '/40_COVID_19_svod.xlsx', shablon_path + '/' + new_name) wb = openpyxl.load_workbook(shablon_path + '/' + new_name) ws = wb['Пунты вакцинации'] rows = dataframe_to_rows(df, index=False, header=False) for r_idx, row in enumerate(rows, 5): for c_idx, value in enumerate(row, 1): ws.cell(row=r_idx, column=c_idx, value=value) wb.save(shablon_path + '/' + new_name) return (shablon_path + '/' + new_name) else: raise my_exception('Пустая папка!')
def sort_death_mg(a): def search_mo(street, house): for mo in mo_org: if mo.Street == street: if mo.House == house: return mo.Name_MO #print('Не найдено МО ' + street + ' ' + house) return 0 date_otch = (datetime.datetime.today() - datetime.timedelta(days=0)).strftime("%d.%m.%Y") file = get_dir( 'sort_death_mg') + r'/[!~]*Умершие от Covid-19*' + date_otch + '*.xlsx' excel = glob.glob(file) if len(excel) == 0: return 'Я не нашёл файлик за сегодня!' cols = [ '№ п/п', 'Возраст', 'Субъект', 'Улица смерти', 'Дом смерти', 'Краткое наименование', 'Место смерти' ] df = pd.read_excel(excel[0], header=1, usecols=cols) df = df[(df['№ п/п'].notnull()) & (df['№ п/п'] != 0)] df.index = range(len(df)) mo = namedtuple('mo', ['Name_MO', 'Street', 'House']) sql = """ SELECT [Name_MO],[Street],[House] FROM [COVID].[Nsi].[Address_MO] """ mo_org = [] for row in con.execute(sql): mo_org.append(mo(*row)) df.loc[~df['Место смерти'].isin(['в стационаре']), 'Name_MO'] = 'БСМЭ\ПАБ' for i in df.loc[df['Место смерти'].isin(['в стационаре'])].index: if search_mo(df.at[i, 'Улица смерти'], df.at[i, 'Дом смерти']): df.loc[i, 'Name_MO'] = search_mo(df.at[i, 'Улица смерти'], df.at[i, 'Дом смерти']) else: df.loc[i, 'Name_MO'] = df.at[i, 'Краткое наименование'] otchet = df[df['Субъект'] != 'Ленинградская обл'].groupby( by='Name_MO', as_index=False, ).count() for column in otchet.columns: if column not in ('Name_MO', '№ п/п'): del otchet[column] otchet.rename(columns={'№ п/п': 'Всего СПб'}, inplace=True) otchet = otchet.merge(df[df['Субъект'] == 'Ленинградская обл'].groupby( by='Name_MO', as_index=False, ).count(), how='outer', left_on='Name_MO', right_on='Name_MO') otchet.rename(columns={ 'Name_MO': 'Медицинская организация', '№ п/п': 'Всего ЛО' }, inplace=True) df = df.fillna(0) for column in otchet.columns: if column not in ('Медицинская организация', 'Всего СПб', 'Всего ЛО'): del otchet[column] vozrast = [18, 65, 150] status = [ 'Дети до 18 СПб', 'Взрослые до 65 СПб', 'Пенсионеры после 65 СПб', 'Дети до 18 ЛО', 'Взрослые до 65 ЛО', 'Пенсионеры после 65 ЛО' ] for i in range(len(otchet)): for stat in status: otchet.loc[i, stat] = 0 for k in range(len(df)): if df.at[k, 'Субъект'] != 'Ленинградская обл': if int(df.at[k, 'Возраст']) < vozrast[0]: otchet.loc[otchet['Медицинская организация'] == df.at[ k, 'Name_MO'], status[0]] += 1 else: if int(df.at[k, 'Возраст']) < vozrast[1]: otchet.loc[otchet['Медицинская организация'] == df.at[ k, 'Name_MO'], status[1]] += 1 else: if int(df.at[k, 'Возраст']) < vozrast[2]: otchet.loc[otchet['Медицинская организация'] == df.at[ k, 'Name_MO'], status[2]] += 1 else: if int(df.at[k, 'Возраст']) < vozrast[0]: otchet.loc[otchet['Медицинская организация'] == df.at[ k, 'Name_MO'], status[3]] += 1 else: if int(df.at[k, 'Возраст']) < vozrast[1]: otchet.loc[otchet['Медицинская организация'] == df.at[ k, 'Name_MO'], status[4]] += 1 else: if int(df.at[k, 'Возраст']) < vozrast[2]: otchet.loc[otchet['Медицинская организация'] == df.at[ k, 'Name_MO'], status[5]] += 1 shablon = get_dir('help') + '/ШаблонМГ.xlsx' file = get_dir( 'sort_death_mg') + '/Свод по возрастам ' + date_otch + '.xlsx' shutil.copyfile(shablon, file) wb = openpyxl.load_workbook(file) ws = wb['Свод по возрастам'] rows = dataframe_to_rows(otchet, index=False, header=False) for r_idx, row in enumerate(rows, 2): for c_idx, value in enumerate(row, 1): ws.cell(row=r_idx, column=c_idx, value=value) wb.save(file) otchet = otchet.fillna(0) new = pd.DataFrame() for i in range(len(otchet)): k = len(new) new.loc[k, 'Медицинская организация'] = otchet.at[ i, 'Медицинская организация'] new.loc[k, 'Всего СПб'] = otchet.at[i, 'Всего СПб'] new.loc[k, 'Всего ЛО'] = otchet.at[i, 'Всего ЛО'] new.loc[k + 1, 'Медицинская организация'] = 'Дети до 18' new.loc[k + 1, 'Всего СПб'] = otchet.at[i, 'Дети до 18 СПб'] new.loc[k + 1, 'Всего ЛО'] = otchet.at[i, 'Дети до 18 ЛО'] new.loc[k + 2, 'Медицинская организация'] = 'Взрослые до 65' new.loc[k + 2, 'Всего СПб'] = otchet.at[i, 'Взрослые до 65 СПб'] new.loc[k + 2, 'Всего ЛО'] = otchet.at[i, 'Взрослые до 65 ЛО'] new.loc[k + 3, 'Медицинская организация'] = 'Пенсионеры после 65' new.loc[k + 3, 'Всего СПб'] = otchet.at[i, 'Пенсионеры после 65 СПб'] new.loc[k + 3, 'Всего ЛО'] = otchet.at[i, 'Пенсионеры после 65 ЛО'] # Удалить нули #new = new.loc[(new['Всего СПб']!=0) | (new['Всего ЛО'] != 0 ) ] wb = openpyxl.load_workbook(file) ws = wb['Перевернутый свод'] rows = dataframe_to_rows(new, index=False, header=False) for r_idx, row in enumerate(rows, 2): for c_idx, value in enumerate(row, 1): ws.cell(row=r_idx, column=c_idx, value=value) wb.save(file) return 'Сгенерирован файл ' + file.split('/')[-1]
def razlojit_death_week(a): #date_end = '2022-01-05' #date_start = '2021-12-23' date_end = (datetime.datetime.today() + relativedelta.relativedelta(weeks=-1, weekday=2)).date() date_start = date_end - datetime.timedelta(days=6) sql = f""" select dbo.get_Gid(idPatient) as 'Gid',[Медицинская организация],[ФИО],[Дата рождения] ,dbo.[f_calculation_age]([Дата рождения],[Дата исхода заболевания]) as 'Возраст' ,[Посмертный диагноз] from robo.v_FedReg where [Исход заболевания] = 'Смерть' and [Дата исхода заболевания] BETWEEN '{date_start}' AND '{date_end}' -- and YEAR([Дата исхода заболевания]) = YEAR(getdate()) and ([Посмертный диагноз] in ('U07.1','U07.2') or [Посмертный диагноз] like 'J1[2-8]%' ) and [Субъект РФ] = 'г. Санкт-Петербург' """ df = pd.read_sql(sql, con) columns = [ 'Район проживания', 'Дата начала заболевания', 'Факт обращения за медицинской помощью на амбулаторном этапе (да/нет)', 'Дата обращения за медицинской помощью на амбулаторном этапе', 'Факт выполнения КТ на амбулаторном этапе (да/нет)', 'Факт выполнения ПЦР-SARS-CoV-2 на амбулаторном этапе (да/нет)', 'Факт получения бесплатной лекарственной терапии (БЛТ) на амбулаторном этапе (да/нет)', 'Дата госпитализации', 'Степень тяжести состояния при госпитализации (легкая, ср.тяжести, тяжелая)', 'Поступление в ОРИТ при госпитализации (да/нет)', 'Смерть наступила в первые сутки с момента госпитализации (да/нет)', 'Факт получения антицитокиновой терапии в стационаре (да/нет)' ] for col in columns: df[col] = '' MOs = df['Медицинская организация'].unique() mo_directory = pd.read_sql( 'SELECT [Наименование в ФР], [user] from robo.directory', con) report_1 = pd.DataFrame() for MO in MOs: try: directory = get_dir('covid') + mo_directory.loc[ mo_directory['Наименование в ФР'] == MO.replace(' (стац)', ''). replace(' (амб.)', ''), 'user'].unique()[0] except: print('Не найдена организация', MO) else: try: os.mkdir(directory + 'Умершие за неделю') except: pass otchet = df[df['Медицинская организация'] == MO] del otchet['Gid'] if '(стац)' in MO: file = directory + 'Умершие за неделю' + '/умершие (стац) с ' + str( date_start) + ' по ' + str(date_end) + '.xlsx' elif '(амб.)' in MO: file = directory + 'Умершие за неделю' + '/умершие (амб.) с ' + str( date_start) + ' по ' + str(date_end) + '.xlsx' else: file = directory + 'Умершие за неделю' + '/умершие с ' + str( date_start) + ' по ' + str(date_end) + '.xlsx' print(MO + ';' + file) # with pd.ExcelWriter(file) as writer: # otchet.to_excel(writer,index=False) shutil.copyfile(get_dir('help') + '/death_week_shablon.xlsx', file) wb = openpyxl.load_workbook(file) ws = wb['death_week'] rows = dataframe_to_rows(otchet, index=False, header=False) for r_idx, row in enumerate(rows, 2): for c_idx, value in enumerate(row, 1): ws.cell(row=r_idx, column=c_idx, value=value) wb.save(file) k = len(report_1) report_1.loc[k, 'Медицинская организация'] = MO report_1.loc[k, 'файл'] = file report_file = get_dir('temp') + '/разложенные файлы.xlsx' with pd.ExcelWriter(report_file) as writer: report_1.to_excel(writer, sheet_name='файлы', index=False) df.to_excel(writer, sheet_name='свод', index=False) report = pd.DataFrame(df['Gid']) report['time'] = datetime.datetime.now() report['Dates'] = str(date_start) + ' - ' + str(date_end) report.to_sql(name='report_deth_week', con=con, schema='robo', if_exists='append', index=False) return report_file