phonon-py / pysimplegui_to_flet

0 stars 0 forks source link

GUIの置き換えとコードのリファクタリング #1

Open phonon-py opened 3 months ago

phonon-py commented 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を作成し、可読性を向上させるために関数を整理しました。データ取得やエラーメッセージの処理も含めて、主要な機能はすべて保持しています。

phonon-py commented 3 months ago

date_text = date_input.value この部分で値を取得できない。