岩手県 コロナ情報検 検査件数・検査の陽性率を作成

import datetime
import re

import pandas as pd

JST = datetime.timezone(datetime.timedelta(hours=+9))
dt_now = datetime.datetime.now(JST)

title = [
    "PCR検査 行政検査件数",
    "PCR検査 民間検査件数",
    "PCR検査 実施数",
    "PCR検査 陽性者数",
    "PCR検査 陰性者数",
    "抗原検査 実施数",
    "抗原検査 陽性者数",
    "抗原検査 陰性者数",
    "検査件数 合計",
    "陽性者数 合計",
    "陰性者数 合計",
]


def str2date(s):

    n = re.findall("[0-9]{1,2}", s)

    y = dt_now.year

    if len(n) == 2:
        m, d = map(int, n)
        return datetime.date(y, m, d)

    else:
        return pd.NaT


def kensa_calc(df_tmp):

    df_tmp.index = df_tmp.index.map(str2date)

    df = (
        pd.concat(
            [
                items.astype(str).str.extractall("([0-9,]+)")
                for label, items in df_tmp.iteritems()
            ],
            axis=1,
        )
        .set_axis(df_tmp.columns, axis=1)
        .rename(index={0: "検査数", 1: "陽性者数"}, level=1)
        .unstack()
        .fillna(0)
        .astype(int)
    )

    df.columns = [" ".join(col).strip() for col in df.columns.values]

    df.rename(
        columns={
            "行政検査件数 (PCR検査) 検査数": "PCR検査 行政検査件数",
            "行政検査件数 (PCR検査) 陽性者数": "PCR検査 行政陽性者数",
            "民間検査件数 (PCR検査) 検査数": "PCR検査 民間検査件数",
            "民間検査件数 (PCR検査) 陽性者数": "PCR検査 民間陽性者数",
            "抗原検査件数 検査数": "抗原検査 実施数",
            "抗原検査件数 陽性者数": "抗原検査 陽性者数",
            "合計 検査数": "検査件数 合計",
            "合計 陽性者数": "陽性者数 合計",
        },
        inplace=True,
    )

    df.index.name = "日付"

    df["PCR検査 実施数"] = df["PCR検査 行政検査件数"] + df["PCR検査 民間検査件数"]
    df["PCR検査 陽性者数"] = df["PCR検査 行政陽性者数"] + df["PCR検査 民間陽性者数"]
    df["PCR検査 陰性者数"] = df["PCR検査 実施数"] - df["PCR検査 陽性者数"]

    df["抗原検査 陰性者数"] = df["抗原検査 実施数"] - df["抗原検査 陽性者数"]

    df["検査件数 合計"] = df["PCR検査 実施数"] + df["抗原検査 実施数"]
    df["陽性者数 合計"] = df["PCR検査 陽性者数"] + df["抗原検査 陽性者数"]
    df["陰性者数 合計"] = df["PCR検査 陰性者数"] + df["抗原検査 陰性者数"]

    df.sort_index(ascending=True, inplace=True)

    return df.reindex(columns=title)


if __name__ == "__main__":

    dfs = pd.read_html(
        "https://www.pref.iwate.jp/kurashikankyou/iryou/covid19/index.html", index_col=0
    )

    df1 = kensa_calc(dfs[1].T.iloc[1:-1])

    df2 = (
        pd.read_csv(
            "https://raw.githubusercontent.com/MeditationDuck/covid19/development/data/csv/%E5%B2%A9%E6%89%8B%E7%9C%8C%20%E3%82%B3%E3%83%AD%E3%83%8A%E6%83%85%E5%A0%B1%20-%20%E6%A4%9C%E6%9F%BB%E4%BB%B6%E6%95%B0%E3%83%BB%E6%A4%9C%E6%9F%BB%E3%81%AE%E9%99%BD%E6%80%A7%E7%8E%87.csv",
            index_col="日付",
            parse_dates=True,
            dtype={
                "PCR検査 行政検査件数": "Int64",
                "PCR検査 民間検査件数": "Int64",
                "PCR検査 実施数": "Int64",
                "PCR検査 陽性者数": "Int64",
                "PCR検査 陰性者数": "Int64",
                "抗原検査 実施数": "Int64",
                "抗原検査 陽性者数": "Int64",
                "抗原検査 陰性者数": "Int64",
                "検査件数 合計": "Int64",
                "陽性者数 合計": "Int64",
                "陰性者数 合計": "Int64",
            },
        )
        .reindex(columns=title)
        .sort_index(ascending=False)
    )

    df = df2.reindex(df2.index.union(df1.index))
    df.update(df1)

    df = df.astype("Int64")

    df["検査件数(7日間移動平均)"] = df["検査件数 合計"].rolling(window=7).mean().round(2)
    df["陽性者数(7日間移動平均)"] = df["陽性者数 合計"].rolling(window=7).mean().round(2)
    df["陽性率"] = (
        df["陽性者数 合計"].rolling(window=7).mean()
        / df["検査件数 合計"].rolling(window=7).mean()
        * 100
    ).round(2)

    df.sort_index(ascending=False, inplace=True)

    df.to_csv("岩手県 コロナ情報 - 検査件数・検査の陽性率.csv")