import tkinter as tk
from tkinter import ttk
import json
import matplotlib.pyplot as plt
from datetime import datetime
# Soubor pro ukládání dat
DATA_FILE = "emotions_data.json"
OPTIONS_FILE = "options.json"
# Načtení možností ze souboru
try:
with open(OPTIONS_FILE, "r", encoding="utf-8") as file:
options = json.load(file)
feelings = options.get("feelings", [])
except (FileNotFoundError, json.JSONDecodeError):
feelings = ["Smutek", "Beznaděj", "Stres", "Úzkost", "Bolest", "Deprese"]
# Kategorizace emocí
depressive_feelings = {"Smutek", "Beznaděj", "Deprese"}
anxious_feelings = {"Úzkost", "Stres"}
def load_data():
try:
with open(DATA_FILE, "r", encoding="utf-8") as file:
return json.load(file)
except (FileNotFoundError, json.JSONDecodeError):
return []
def filter_data_by_period(data, start_date, end_date):
return [entry for entry in data if start_date <= datetime.strptime(entry["date"], "%Y-%m-%d") <= end_date]
def calculate_average(data, category):
values = [entry["intensity"] for entry in data if entry["feeling"] in category]
return sum(values) / len(values) if values else 0
def calculate_maximum(data, category):
values = [entry["intensity"] for entry in data if entry["feeling"] in category]
return max(values) if values else 0
def plot_graph():
data = load_data()
start_date = datetime(2024, 2, 1) # Příklad pevně daného období
end_date = datetime(2024, 2, 25)
filtered_data = filter_data_by_period(data, start_date, end_date)
avg_depressive = calculate_average(filtered_data, depressive_feelings)
max_depressive = calculate_maximum(filtered_data, depressive_feelings)
avg_anxious = calculate_average(filtered_data, anxious_feelings)
max_anxious = calculate_maximum(filtered_data, anxious_feelings)
categories = ["Depresivní nálady", "Úzkostné nálady"]
averages = [avg_depressive, avg_anxious]
maxima = [max_depressive, max_anxious]
fig, ax = plt.subplots()
ax.bar(categories, averages, label="Průměrná intenzita", alpha=0.7)
ax.bar(categories, maxima, label="Maximální intenzita", alpha=0.7)
ax.set_ylabel("Intenzita")
ax.set_title("Analýza emocí")
ax.legend()
plt.show()
# Vytvoření hlavního okna
root = tk.Tk()
root.title("Emoční deník")
root.geometry("400x400")
ttk.Button(root, text="Zobrazit graf", command=plot_graph).pack(pady=20)
def close_window():
root.destroy()
ttk.Button(root, text="Zavřít", command=close_window).pack(pady=20)
root.mainloop()
Podle specifikací zadání aktuálně máme modul, který:
- Načítá data z JSON souboru – to je v pořádku.
- Filtruje data podle zvoleného časového období – máme funkci
filter_data_by_period
, která přijímá počáteční a koncové datum. - Vykresluje grafy – máme funkci
plot_graph()
, která zobrazuje grafy průměrných a maximálních hodnot pro dvě kategorie („Depresivní nálady“ a „Úzkostné nálady“).
Na druhou stranu, ve specifikaci jste požadoval(a):
Třídění pocitů do kategorií – tj. spojení hodnot jako „Smutek“, „Deprese“ a „Beznaděj“ do kategorie depresivních nálad a „Úzkost“ a „Stres“ do kategorie úzkostných nálad.
V aktuálním kódu se to děje tak, že máme dvě množiny (depressive_feelings
a anxious_feelings
), ale výpočty průměru a maxima se provádějí přes pole entry["intensity"]
, což neodpovídá tomu, že se data ukládají do klíče detailed_feelings
(kde jsou uloženy konkrétní hodnoty pro jednotlivé emoce).
Doplňování chybějících dat – tedy když pro některé časové úseky nebo dny chybí záznam, měl by se doplnit poslední známý údaj.
*Funkce fill_missing_data
je pouze základní a předpokládá, že data jsou organizována jako slovník se záznamy za jednotlivé dny. U nás ale data mají strukturu pole záznamů (každý záznam obsahuje datum, čas, konkrétní hodnocení atd.). To tedy je třeba upravit, aby doplňování chybějících hodnot fungovalo podle pravidel, které jste popsal – tj. kdy chybí záznam za nějaké období, kopírujeme průměrnou hodnotu z předchozího období a zároveň logujeme, že se hodnota doplnila.
Specifická analýza dle časových úseků dne – původní zadání zmiňuje hodnocení v různých fázích dne (brzo ráno, ráno, dopoledne/poledne, odpoledne, večer, noc, atd.), přičemž se pak má vykreslit průměr a maximum pro každý časový úsek.
Aktuálně v kódu není implementována logika pro filtrování podle jednotlivých časových úseků, ani pro navigaci mezi dny (tlačítka se šipkami nebo kalendář).
Možnost rozlišit skutečná data od doplněných (log soubor) – očekávalo se, že se v log souboru poznamená, kdy byla hodnota doplněna, aby bylo možné manuálně zkontrolovat, která data jsou domyšlená.
V aktuálním kódu je pouze jednoduchá funkce log_message
, ale její integrace do procesu doplňování dat je minimální a chybí podrobnější logika pro období (např. týden, měsíc).
Shrnutí:
- Modul, který jsem vytvořil, pokrývá základní načítání a filtrování dat, výpočet průměrů a maxim a vykreslení grafů pro dvě kategorie.
- Avšak specifické třídění podle jednotlivých detailních emocí (uložených v
detailed_feelings
) a následné sloučení do kategorií (depresivní a úzkostné) není v kódu detailně implementováno – momentálně se používá pouze jednoduchý přístup založený na tom, zda je klíč obsažen v předdefinovaných množinách. - Dále chybí robustní mechanismus pro doplnění chybějících dat v rámci různých časových úseků (den, týden, měsíc) a odpovídající logování těchto operací.
- A také chybí uživatelské rozhraní pro výběr konkrétního dne (např. pomocí kalendáře nebo šipek pro posun mezi dny).
Co je tedy potřeba ještě udělat?
- Upravit funkce pro výpočet statistik tak, aby pracovali s hodnotami z
detailed_feelings
a sloučili je do kategorií. Například vytvořit funkci, která projde detailed_feelings
u každého záznamu, vybere hodnoty pro klíče patřící do kategorie depresivních nálad a vypočítá jejich průměr a maximum. - Implementovat logiku pro doplňování chybějících dat – tedy projít data podle dnů, týdnů, měsíců, zjistit, kdy chybí záznam a doplnit ho hodnotou z předchozího období, přičemž se zapíše záznam do log souboru.
- Přidat uživatelské rozhraní pro navigaci mezi dny, týdny, měsíci či roky (např. pomocí šipek nebo kalendáře), aby se data zobrazovala podle aktuálního výběru.
- Vykreslit grafy s výsledky – pro každou kategorii zvlášť a zároveň možnost zobrazit celkový přehled (např. tři grafy: jeden pro depresivní nálady, jeden pro úzkostné nálady a jeden pro vše dohromady).
Z těchto důvodů aktuální kód ještě plně neodpovídá všem zadáním. Je potřeba provést další úpravy a rozšíření logiky. Pokud chceš, můžeme postupovat krok za krokem a začít implementovat úpravy, například nejprve funkci, která ze záznamu spočítá průměr a maximum pro kategorii depresivních a úzkostných nálad na základě detailed_feelings
. Stačí říct, na čem chceš nejdříve pracovat.