Beispiel #1
0
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) + ' бандлов'
Beispiel #2
0
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
Beispiel #3
0
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 'Создан файл по заболевшим сотрудникам'
Beispiel #10
0
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
Beispiel #11
0
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
Beispiel #12
0
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)
Beispiel #14
0
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} собраны в папку'
Beispiel #18
0
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
Beispiel #19
0
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
Beispiel #20
0
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
Beispiel #22
0
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
Beispiel #23
0
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 'Не буду я работать по выходным дням!'
Beispiel #26
0
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