Exemplo n.º 1
0
 def make_patients(self) -> None:
     self._patients_json = {
         "date": self.get_patients_last_update(),
         "data": []
     }
     for i in range(3, self.patients_count):
         data = {}
         release_str = self.patients_sheet.cell(row=i, column=2).value
         release_date = excel_date(release_str).isoformat(
         ) + ".000Z" if isinstance(release_str, int) else release_str
         data["No"] = self.patients_sheet.cell(row=i, column=1).value
         #data["リリース日"] = release_date.isoformat() + ".000Z"
         data["リリース日"] = release_date
         data["曜日"] = self.patients_sheet.cell(row=i, column=2).value
         data["職業"] = self.patients_sheet.cell(row=i, column=5).value
         if self.patients_sheet.cell(row=i, column=5).value != "dummy":
             data["職業"] = data["職業"]
         data["年代"] = str(self.patients_sheet.cell(
             row=i, column=3).value) + ("代" if isinstance(
                 self.patients_sheet.cell(row=i, column=3).value, int) else
                                        "")
         data["性別"] = self.patients_sheet.cell(row=i, column=4).value
         data["退院"] = "○" if "退院" in str(
             self.patients_sheet.cell(row=i, column=8).value) else ""
         data["date"] = excel_date(release_str).strftime(
             "%Y-%m-%d") if isinstance(release_str, int) else release_date
         self._patients_json["data"].append(data)
Exemplo n.º 2
0
 def make_patients(self) -> None:
     self._patients_json = {
         "date": self.get_patients_last_update(),
         "data": []
     }
     for i in range(3, self.patients_count):
         data = {}
         release_date = excel_date(
             self.patients_sheet.cell(row=i, column=2).value)
         data["No"] = self.patients_sheet.cell(row=i, column=1).value
         data["リリース日"] = release_date.isoformat() + ".000Z"
         data["曜日"] = self.patients_sheet.cell(row=i, column=2).value
         data["居住地"] = self.patients_sheet.cell(row=i, column=5).value
         if self.patients_sheet.cell(row=i, column=5).value == "調査中":
             data["居住地"] = data["居住地"]
         elif self.patients_sheet.cell(row=i, column=5).value != "大阪府外":
             data["居住地"] = "大阪府" + data["居住地"]
         data["年代"] = str(self.patients_sheet.cell(
             row=i, column=3).value) + ("代" if isinstance(
                 self.patients_sheet.cell(row=i, column=3).value, int) else
                                        "")
         data["性別"] = self.patients_sheet.cell(row=i, column=4).value
         data["退院"] = "○" if any(
             x in str(self.patients_sheet.cell(row=i, column=8).value)
             for x in ("退院", "解除")) else ""
         data["date"] = release_date.strftime("%Y-%m-%d")
         self._patients_json["data"].append(data)
Exemplo n.º 3
0
    def make_patients(self) -> None:
        # patients.jsonのデータを作成する
        self._patients_json = self.json_template_of_patients()

        # patients_sheetからデータを読み取っていく
        for i in range(patients_first_cell, self.patients_count):
            data = {}
            release_date = excel_date(
                self.patients_sheet.cell(row=i, column=3).value)
            data["No"] = self.patients_sheet.cell(row=i, column=2).value
            data["リリース日"] = release_date.isoformat()
            data["曜日"] = get_weekday(release_date.weekday())
            data["居住地"] = self.patients_sheet.cell(row=i, column=7).value
            # sheetには年代は数字で乗っているので、現状はこのスタイルだが、まだ「10歳未満」の表記が不明なので、それが判明次第修正する形をとる
            # TODO: 10代未満の表記に関して
            data["年代"] = str(self.patients_sheet.cell(row=i,
                                                      column=4).value) + "代"
            data["性別"] = self.patients_sheet.cell(row=i, column=5).value
            data["退院"] = None
            # No.の表記にブレが激しいので、ここで"No."に修正(統一)。また、"・"を"、"に置き換える
            data["備考"] = re.sub(
                'NO.|N0.|NO,|N0,|No,', 'No.',
                str(self.patients_sheet.cell(row=i, column=11).value)).replace(
                    "・", "、")
            data["date"] = release_date.strftime("%Y-%m-%d")
            self._patients_json["data"].append(data)

        # No.1の人からリストに追加していくと、降順になるので、reverseで昇順に戻す
        self._patients_json["data"].reverse()
Exemplo n.º 4
0
    def make_patients(self) -> None:
        # patients.jsonのデータを作成する
        self._patients_json = self.json_template_of_patients()

        # patients_sheetからデータを読み取っていく
        for i in range(patients_first_cell, self.patients_count):
            data = {}
            release_date = excel_date(self.patients_sheet.cell(row=i, column=3).value)
            data["No"] = self.patients_sheet.cell(row=i, column=2).value
            data["リリース日"] = release_date.isoformat()
            data["曜日"] = get_weekday(release_date.weekday())
            data["居住地"] = self.patients_sheet.cell(row=i, column=7).value
            # 年代を一旦取得。「10歳未満」と表記されていれば、str型と認識されるので、それを用いて判別する
            age = self.patients_sheet.cell(row=i, column=4).value
            if isinstance(age, int):
                data["年代"] = str(age) + age_display_normal
            else:
                data["年代"] = age
            data["性別"] = self.patients_sheet.cell(row=i, column=5).value
            data["退院"] = None
            # No.の表記にブレが激しいので、ここで"No."に修正(統一)。また、"・"を"、"に置き換える
            data["備考"] = re.sub(
                'NO.|N0.|NO,|N0,|No,', 'No.', str(self.patients_sheet.cell(row=i, column=11).value)
            ).replace("・", "、")
            data["date"] = release_date.strftime("%Y-%m-%d")
            self._patients_json["data"].append(data)

        # No.1の人からリストに追加していくと、降順になるので、reverseで昇順に戻す
        self._patients_json["data"].reverse()
Exemplo n.º 5
0
 def make_inspections_summary(self) -> None:
     self._inspections_summary_json = {
         "date": self.get_inspections_last_update(),
         "data": []
     }
     for i in range(3, self.inspections_count):
         data = {}
         date = excel_date(self.inspections_sheet.cell(row=i, column=1).value)
         data["日付"] = date.isoformat() + ".000Z"
         data["小計"] = self.inspections_sheet.cell(row=i, column=2).value
         self._inspections_summary_json["data"].append(data)
Exemplo n.º 6
0
    def make_news(self) -> None:
        # newsの生成
        self._news_json = {"newsItems": []}

        for i in range(news_first_cell, self.news_count):
            self._news_json["newsItems"].append({
                "date":
                excel_date(self.news_sheet.cell(
                    row=i, column=2).value).strftime("%Y/%m/%d"),
                "text":
                self.news_sheet.cell(row=i, column=3).value,
                "url":
                self.news_sheet.cell(row=i, column=4).value
            })
Exemplo n.º 7
0
    def make_transmission_route(self) -> None:
        self._transmission_route_json = {
            "date": self.get_inspections_last_update(),
            "data": {
                "感染経路不明者": [],
                "感染経路明確者": []
            },
            "labels": []
        }

        for i in range(3, self.inspections_count):
            date = {}
            date = excel_date(self.inspections_sheet.cell(row=i, column=1).value)
            self._transmission_route_json["data"]["感染経路不明者"].append(self.inspections_sheet.cell(row=i, column=11).value)
            self._transmission_route_json["data"]["感染経路明確者"].append(self.inspections_sheet.cell(row=i, column=3).value - self.inspections_sheet.cell(row=i, column=11).value)
            self._transmission_route_json["labels"].append(f'{date.month}/{date.day}')
Exemplo n.º 8
0
 def make_patients(self) -> None:
     self._patients_json = {
         "data": [],
         "last_update": self.get_last_update()
     }
     for i in range(5, self.patients_count):
         data = {}
         release_date = excel_date(self.sheets.cell(row=i, column=3).value)
         data["No"] = self.sheets.cell(row=i, column=2).value
         data["リリース日"] = release_date.isoformat()
         data["曜日"] = get_weekday(release_date.weekday())
         data["居住地"] = self.sheets.cell(row=i, column=7).value
         data["年代"] = str(self.sheets.cell(row=i, column=4).value) + "代"
         data["性別"] = self.sheets.cell(row=i, column=5).value
         data["退院"] = None
         data["備考"] = re.sub('NO.|N0.|NO,|N0,|No,', 'No.', str(self.sheets.cell(row=i, column=11).value)).replace("・", "、")
         data["date"] = release_date.strftime("%Y-%m-%d")
         self._patients_json["data"].append(data)
     self._patients_json["data"].reverse()
Exemplo n.º 9
0
    def make_age_summary(self) -> None:
        # 内部データテンプレート
        def make_data():
            data = {}
            for i in range(11):
                data[str(i * 10)] = 0
            return data

        # age_summary.jsonを作成する
        self._age_summary_json = {
            "data": {},
            "labels": [],
            "last_update": self.get_patients_last_update()
        }

        # 初期化
        for i in range(11):
            if i != 10:
                suffix = age_display_normal
                if i == 0:
                    i = 1
                    suffix = age_display_min
                elif i == 9:
                    suffix = age_display_max
                self._age_summary_json["data"][str(i * 10) + suffix] = []
            else:
                self._age_summary_json["data"][age_display_unpublished] = []

        # 以前のデータを保管する
        # これは、前の患者データと日付が同じであるか否かを比較するための変数
        patients_age_data = []
        for i in range(patients_first_cell, self.patients_count):
            # 10歳未満と、年代非公表者を判別するため、一旦ageに代入し、
            # 年代非公表者は例外として100歳代、10歳未満は便宜上0歳代として扱わせる
            # また、90代や100歳以上の人は90歳以上としてまとめて扱う
            age = self.patients_sheet.cell(row=i, column=4).value
            if isinstance(age, str):
                if age_display_unpublished in age:
                    age = 100
                else:
                    age = 0
            else:
                if age >= 90:
                    age = 90
            age_data = {
                "年代": age,
                "date": excel_date(self.patients_sheet.cell(row=i, column=3).value).replace(tzinfo=jst).isoformat()
            }
            patients_age_data.append(age_data)
        patients_age_data.sort(key=lambda x: x['date'])

        prev_data = {}
        for patient in patients_age_data:
            date = patient["date"]
            if prev_data:
                prev_date = datetime.strptime(prev_data["date"], "%Y-%m-%dT%H:%M:%S+09:00")
                # 前のデータと日付が離れている場合、その分0のデータを埋める必要があるので、そのために差を取得する
                patients_zero_days = (datetime.strptime(date, "%Y-%m-%dT%H:%M:%S+09:00") - prev_date).days
                # 前のデータと日付が同じ場合、前のデータに人数を加算していく
                if prev_data["date"] == date:
                    # 接尾語は扱いづらいので、数字だけに置き換えた辞書で代用している
                    # popで10歳未満や90代以上などの扱いづらいデータを全部0~90に置き換えたものを取り出し、
                    # その後取り出したものに加算し、insertで置き換え直して代入する
                    data = self.pop_age_value()
                    data[str(patient["年代"])] += 1
                    self.insert_age_value(data)
                    continue
                else:
                    # 前のデータとの日付の差が2日以上の場合は空いている日にち分、0を埋める
                    if patients_zero_days >= 2:
                        for i in range(1, patients_zero_days):
                            self.insert_age_value(make_data())
                            self._age_summary_json["labels"].append(
                                month_and_day((prev_date + timedelta(days=i)).replace(tzinfo=jst))
                            )

            data = make_data()
            data[str(patient["年代"])] += 1
            # 作成したデータをリストにinsert
            self.insert_age_value(data)
            # 日時取得のため、前のデータを登録
            prev_data = patient
            self._age_summary_json["labels"].append(
                month_and_day(datetime.strptime(prev_data["date"], "%Y-%m-%dT%H:%M:%S+09:00"))
            )

        prev_date = datetime.strptime(prev_data["date"], "%Y-%m-%dT%H:%M:%S+09:00")
        # 最終更新のデータから日付が開いている場合、0で埋める
        patients_zero_days = (datetime.now() - prev_date).days - 1
        for i in range(1, patients_zero_days):
            self.insert_age_value(make_data())
            self._age_summary_json["labels"].append(
                month_and_day((prev_date + timedelta(days=i)).replace(tzinfo=jst))
            )
Exemplo n.º 10
0
    def make_clusters(self) -> None:
        # 内部データテンプレート
        def make_data(date):
            data = {"日付": date}
            # クラスターリストからクラスターを取得し、辞書にはめ込んでいく
            for cluster in self.clusters:
                data[cluster] = 0
            # "None"のものは使われないのでpopで疑似的に削除
            data.pop("None")
            return data

        # clusters.jsonのデータを作成する
        self._clusters_json = self.json_template_of_patients()

        # Excelデータからクラスター一覧に〇がついているところをTrueとし、抜き出す
        patients_cluster_data = []
        for i in range(patients_first_cell, self.patients_count):
            # 初期化
            cluster_data = {}
            for cluster in self.clusters:
                cluster_data[cluster] = False
            # Noneの削除
            cluster_data.pop("None")
            for j in range(12, self.clusters_count):
                # クラスターの欄に〇があればTrueとする
                if self.patients_sheet.cell(row=i, column=j).value:
                    cluster_data[self.clusters[j - 12]] = True
            # 日時の反映
            cluster_data["date"] = excel_date(
                self.patients_sheet.cell(row=i, column=3).value
            ).replace(tzinfo=jst).isoformat()
            patients_cluster_data.append(cluster_data)
        # 患者ごとにデータが保管されるが、順番は関係なく、1日にどこで何人、というデータを抜き出すために、日付順でsortする
        patients_cluster_data.sort(key=lambda x: x['date'])

        # 以前のデータを保管する
        # これは、前の患者データと日付が同じであるか否かを比較するための変数
        prev_data = {}
        for patient in patients_cluster_data:
            date = patient["date"]
            if prev_data:
                prev_date = datetime.strptime(prev_data["日付"], "%Y-%m-%dT%H:%M:%S+09:00")
                # 前のデータと日付が離れている場合、その分0のデータを埋める必要があるので、そのために差を取得する
                patients_zero_days = (datetime.strptime(date, "%Y-%m-%dT%H:%M:%S+09:00") - prev_date).days
                # 前のデータと日付が同じ場合、前のデータに人数を加算していく
                if prev_data["日付"] == date:
                    for j in range(clusters_first_cell + 1, self.clusters_count):
                        if self.clusters[j - clusters_first_cell - 1] == "None":
                            continue
                        # 以前抜き出したクラスター情報がTrueになっていれば、+1する
                        if patient[self.clusters[j - clusters_first_cell - 1]]:
                            prev_data[self.clusters[j - clusters_first_cell - 1]] += 1
                    # 加算し終えたら戻る
                    continue
                else:
                    # 前のデータと日付が離れていた場合、前のデータをjsonに登録する
                    self._clusters_json["data"].append(prev_data)
                    # 前のデータとの日付の差が2日以上の場合は空いている日にち分、0を埋める
                    if patients_zero_days >= 2:
                        for i in range(1, patients_zero_days):
                            self._clusters_json["data"].append(
                                make_data((prev_date + timedelta(days=i)).replace(tzinfo=jst).isoformat())
                            )
            # 新しいデータを作成し、前もって前のデータとして格納しておく
            prev_data = make_data(date)
            for j in range(clusters_first_cell + 1, self.clusters_count):
                if self.clusters[j - clusters_first_cell - 1] == "None":
                    continue
                # 以前抜き出したクラスター情報がTrueになっていれば、+1する
                if patient[self.clusters[j - clusters_first_cell - 1]]:
                    prev_data[self.clusters[j - clusters_first_cell - 1]] += 1

        # 前のデータをjsonに登録する
        self._clusters_json["data"].append(prev_data)
        prev_date = datetime.strptime(prev_data["日付"], "%Y-%m-%dT%H:%M:%S+09:00")
        # 最終更新のデータから日付が開いている場合、0で埋める
        patients_zero_days = (datetime.now() - prev_date).days - 1
        for i in range(1, patients_zero_days):
            self._clusters_json["data"].append(
                make_data((prev_date + timedelta(days=i)).replace(tzinfo=jst).isoformat())
            )
Exemplo n.º 11
0
    def make_age_summary(self) -> None:
        # 内部データテンプレート
        def make_data():
            data = {}
            for i in range(10):
                data[str(i * 10)] = 0
            return data

        # age_summary.jsonを作成する
        self._age_summary_json = {
            "data": {},
            "labels": [],
            "last_update": self.get_patients_last_update()
        }

        # 初期化
        for i in range(10):
            suffix = "代"
            if i == 0:
                i = 1
                suffix += "未満"
            elif i == 9:
                suffix += "以上"
            self._age_summary_json["data"][str(i * 10) + suffix] = []

        # 以前のデータを保管する
        # これは、前の患者データと日付が同じであるか否かを比較するための変数
        patients_age_data = []
        for i in range(patients_first_cell, self.patients_count):
            age_data = {
                "年代":
                self.patients_sheet.cell(row=i, column=4).value,
                "date":
                excel_date(self.patients_sheet.cell(
                    row=i, column=3).value).replace(tzinfo=jst).isoformat()
            }
            patients_age_data.append(age_data)
        patients_age_data.sort(key=lambda x: x['date'])

        prev_data = {}
        for patient in patients_age_data:
            date = patient["date"]
            if prev_data:
                prev_date = datetime.strptime(prev_data["date"],
                                              "%Y-%m-%dT%H:%M:%S+09:00")
                # 前のデータと日付が離れている場合、その分0のデータを埋める必要があるので、そのために差を取得する
                patients_zero_days = (
                    datetime.strptime(date, "%Y-%m-%dT%H:%M:%S+09:00") -
                    prev_date).days
                # 前のデータと日付が同じ場合、前のデータに人数を加算していく
                if prev_data["date"] == date:
                    # 接尾語は扱いづらいので、数字だけに置き換えた辞書で代用している
                    # popで10代未満や90代以上などの扱いづらいデータを全部0~90に置き換えたものを取り出し、
                    # その後取り出したものに加算し、insertで置き換え直して代入する
                    data = self.pop_age_value()
                    data[str(patient["年代"])] += 1
                    self.insert_age_value(data)
                    continue
                else:
                    # 前のデータとの日付の差が2日以上の場合は空いている日にち分、0を埋める
                    if patients_zero_days >= 2:
                        for i in range(1, patients_zero_days):
                            self.insert_age_value(make_data())
                            self._age_summary_json["labels"].append(
                                (prev_date + timedelta(days=i)).replace(
                                    tzinfo=jst).strftime("%m/%d"))

            data = make_data()
            data[str(patient["年代"])] += 1
            # 作成したデータをリストにinsert
            self.insert_age_value(data)
            # 日時取得のため、前のデータを登録
            prev_data = patient
            self._age_summary_json["labels"].append(
                datetime.strptime(prev_data["date"],
                                  "%Y-%m-%dT%H:%M:%S+09:00").strftime("%m/%d"))

        prev_date = datetime.strptime(prev_data["date"],
                                      "%Y-%m-%dT%H:%M:%S+09:00")
        # 最終更新のデータから日付が開いている場合、0で埋める
        patients_zero_days = (datetime.now() - prev_date).days - 1
        for i in range(1, patients_zero_days):
            self._clusters_json["data"].append(make_data())
Exemplo n.º 12
0
    def make_age_summary(self) -> None:
        def make_data(date):
            data = {"date": date}
            for i in range(10):
                data[str(i * 10)] = 0
            return data

        self._age_summary_json = {
            "data": {},
            "labels": [],
            "last_update": self.get_last_update()
        }

        for i in range(10):
            suffix = "代"
            if i == 0:
                i = 1
                suffix += "未満"
            elif i == 9:
                suffix += "以上"
            self._age_summary_json["data"][str(i * 10) + suffix] = []

        patients_age_data = []
        for i in range(5, self.patients_count):
            age_data = {
                "年代":
                self.sheets.cell(row=i, column=4).value,
                "date":
                excel_date(self.sheets.cell(
                    row=i, column=3).value).replace(tzinfo=jst).isoformat()
            }
            patients_age_data.append(age_data)
        patients_age_data.sort(key=lambda x: x['date'])

        prev_data = {}
        for patient in patients_age_data:
            date = patient["date"]
            if prev_data:
                prev_date = datetime.strptime(prev_data["date"],
                                              "%Y-%m-%dT%H:%M:%S+09:00")
                patients_zero_days = (
                    datetime.strptime(date, "%Y-%m-%dT%H:%M:%S+09:00") -
                    prev_date).days
                if prev_data["date"] == date:
                    data = self.pop_age_value()
                    data[str(patient["年代"])] += 1
                    self.insert_age_value(data)
                    continue
                else:
                    if patients_zero_days >= 2:
                        for i in range(1, patients_zero_days):
                            self.insert_age_value(
                                make_data(
                                    (prev_date + timedelta(days=i)).replace(
                                        tzinfo=jst).isoformat()))
                            self._age_summary_json["labels"].append(
                                (prev_date + timedelta(days=i)).replace(
                                    tzinfo=jst).strftime("%m/%d"))

            data = make_data(date)
            data[str(patient["年代"])] += 1
            self.insert_age_value(data)
            prev_data = patient
            self._age_summary_json["labels"].append(
                datetime.strptime(prev_data["date"],
                                  "%Y-%m-%dT%H:%M:%S+09:00").strftime("%m/%d"))
Exemplo n.º 13
0
    def make_clusters(self) -> None:
        def make_data(date):
            data = {"日付": date}
            for cluster in self.clusters:
                data[cluster] = 0
            data.pop("None")
            return data

        self._clusters_json = {
            "data": [],
            "last_update": self.get_last_update()
        }

        patients_cluster_data = []
        for i in range(5, self.patients_count):
            cluster_data = {}
            for cluster in self.clusters:
                cluster_data[cluster] = False
            cluster_data.pop("None")
            for j in range(12, self.clusters_count + 1):
                if self.sheets.cell(row=i, column=j).value:
                    cluster_data[self.clusters[j - 12]] = True
            cluster_data["date"] = excel_date(
                self.sheets.cell(
                    row=i, column=3).value).replace(tzinfo=jst).isoformat()
            patients_cluster_data.append(cluster_data)
        patients_cluster_data.sort(key=lambda x: x['date'])

        prev_data = {}
        for patient in patients_cluster_data:
            date = patient["date"]
            if prev_data:
                prev_date = datetime.strptime(prev_data["日付"],
                                              "%Y-%m-%dT%H:%M:%S+09:00")
                patients_zero_days = (
                    datetime.strptime(date, "%Y-%m-%dT%H:%M:%S+09:00") -
                    prev_date).days
                if prev_data["日付"] == date:
                    for j in range(12, self.clusters_count):
                        if self.clusters[j - 12] == "None":
                            continue
                        if patient[self.clusters[j - 12]]:
                            prev_data[self.clusters[j - 12]] += 1
                    continue
                else:
                    self._clusters_json["data"].append(prev_data)
                    if patients_zero_days >= 2:
                        for i in range(1, patients_zero_days):
                            self._clusters_json["data"].append(
                                make_data(
                                    (prev_date + timedelta(days=i)).replace(
                                        tzinfo=jst).isoformat()))
            prev_data = make_data(date)
            for j in range(12, self.clusters_count):
                if self.clusters[j - 12] == "None":
                    continue
                if patient[self.clusters[j - 12]]:
                    prev_data[self.clusters[j - 12]] += 1

        self._clusters_json["data"].append(prev_data)
        prev_date = datetime.strptime(prev_data["日付"],
                                      "%Y-%m-%dT%H:%M:%S+09:00")
        patients_zero_days = (datetime.now() - prev_date).days
        for i in range(1, patients_zero_days):
            self._clusters_json["data"].append(
                make_data((prev_date +
                           timedelta(days=i)).replace(tzinfo=jst).isoformat()))