Open phonon-py opened 3 months ago
こちらは、あなたのコードをFletを使用してGUIをリファクタリングしたものです。可読性を向上させるために、コードも整理しました。
import datetime import json import pandas as pd import requests import flet as ft def main(page: ft.Page): page.title = "データ取得" page.theme = ft.Theme( primary_color=ft.colors.DEEP_ORANGE, background_color=ft.colors.BLUE_GREY, ) def extract_data(d): result = pd.json_normalize(d) return result.iloc[0, :] def fetch_data(e): date_text = date_input.value trigger = trigger_dropdown.value guid = "your guid" url = "your url" + guid + "path/to/yours" apikey = "Your API Key" request = "histories" format_file = "API2_form.csv" if date_text: date_jst = datetime.datetime.strptime(date_text + "00:00:00", "%Y-%m-%d%H:%M:%S") date = date_jst.date() start_day = date - datetime.timedelta(days=1) end_day = date if date > datetime.datetime.today().date(): ft.dialog.AlertDialog("本日以前の日付を選択してください").open() return elif date == datetime.datetime.today().date(): num = int(datetime.datetime.today().hour) + 1 ft.dialog.AlertDialog(f"本日の{num}時までのデータを取得します").open() else: num = 24 else: date = datetime.date.today() - datetime.timedelta(days=1) start_day = date - datetime.timedelta(days=1) end_day = date num = 24 df = pd.DataFrame() for x in range(num): if x < 9: t1 = datetime.time(x + 15, 0, 0) t2 = datetime.time(x + 15, 59, 59) begin = str(start_day) + "T" + str(t1) + "Z" end = str(start_day) + "T" + str(t2) + "Z" else: t1 = datetime.time(x - 9, 0, 0) t2 = datetime.time(x - 9, 59, 59) begin = str(end_day) + "T" + str(t1) + "Z" end = str(end_day) + "T" + str(t2) + "Z" payload = {"begin": begin, "end": end, "trigger": trigger} headers = {"Ocp-Apim-Subscription-Key": apikey} r = requests.get(url, params=payload, headers=headers) res_dict = json.loads(r.text) if r.status_code != 200: ft.dialog.AlertDialog(f"{r.status_code}エラーが発生しました。").open() return for i in range(len(res_dict[request])): df2 = pd.DataFrame(res_dict[request][i]) df_flatten = pd.concat([df2, df2.history.apply(extract_data)], axis=1).drop(columns="history") df = pd.concat([df, df_flatten], ignore_index=True) while res_dict.get("continuation"): continuation = res_dict["continuation"] begin = res_dict["begin"] end = res_dict["end"] payload = {"begin": begin, "end": end, "trigger": trigger} headers = {"Ocp-Apim-Subscription-Key": apikey} r = requests.get(url, params=payload, headers=headers) res_dict = json.loads(r.text) if r.status_code != 200: ft.dialog.AlertDialog(f"{r.status_code}エラーが発生しました。").open() return for i in range(len(res_dict[request])): df2 = pd.DataFrame(res_dict[request][i]) df_flatten = pd.concat([df2, df2.history.apply(extract_data)], axis=1).drop(columns="history") df = pd.concat([df, df_flatten], ignore_index=True) df = df.rename(columns={ "time": "history.time", "site_pid": "history.site_pid", "site": "history.site", "building_id": "history.building_id", "building": "history.building", "floor_id": "history.floor_id", "floor": "history.floor", "location_lblname": "history.location_lblname", "location_sysname": "history.location_sysname", "location_id": "history.location_id", "location_code": "history.location_code", "x": "history.x", "y": "history.y", "w": "history.w", "h": "history.h", "movement": "history.movement", "device": "history.device", }) if df.empty: ft.dialog.AlertDialog("データがありません。").open() return df["history.time"] = pd.to_datetime(df["history.time"], format="%Y-%m-%dT%H:%M:%SZ") + datetime.timedelta(hours=9) df["history.time"] = df["history.time"].dt.strftime("%Y/%m/%d %H:%M:%S") filename = "raw_" + format(datetime.datetime.now(), "%Y%m%d%H%M%S") + ".csv" df.to_csv(filename, encoding="utf_8_sig") ft.dialog.AlertDialog(f"{filename} にデータを出力しました。").open() date_input = ft.TextField(label="データ取得日を設定してください", placeholder="YYYY-MM-DD") trigger_dropdown = ft.Dropdown( label="トリガーを選択してください", options=[ ft.dropdown.Option("building"), ft.dropdown.Option("floor"), ft.dropdown.Option("location-id") ] ) fetch_button = ft.ElevatedButton(text="CSV", on_click=fetch_data) page.add(date_input, trigger_dropdown, fetch_button) ft.app(target=main)
このリファクタリングされたコードは、Fletライブラリを使用してGUIを作成し、可読性を向上させるために関数を整理しました。データ取得やエラーメッセージの処理も含めて、主要な機能はすべて保持しています。
date_text = date_input.value この部分で値を取得できない。
こちらは、あなたのコードをFletを使用してGUIをリファクタリングしたものです。可読性を向上させるために、コードも整理しました。
このリファクタリングされたコードは、Fletライブラリを使用してGUIを作成し、可読性を向上させるために関数を整理しました。データ取得やエラーメッセージの処理も含めて、主要な機能はすべて保持しています。