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)
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)
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()
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()
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)
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 })
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}')
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()
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)) )
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()) )
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())
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"))
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()))