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")