File size: 5,925 Bytes
6e219f7
 
 
56785c7
6e219f7
 
 
 
 
 
 
 
 
 
31b8dbd
6e219f7
 
 
31a92cb
 
 
3c5f61b
 
31a92cb
 
56785c7
31a92cb
 
56785c7
 
09fed9f
552e5da
56785c7
09fed9f
630d112
 
 
 
 
 
09fed9f
 
 
56785c7
 
3c5f61b
 
 
 
 
 
 
 
 
6e219f7
 
 
 
 
d7fd570
 
 
c6706a3
d7fd570
 
6e219f7
d7fd570
 
 
 
09fed9f
 
56785c7
c6706a3
56785c7
630d112
c6706a3
d7fd570
c6706a3
56785c7
c6706a3
d7fd570
 
 
 
 
6e219f7
31a92cb
 
3c5f61b
31a92cb
 
 
 
 
3c5f61b
c6706a3
31a92cb
552e5da
d7fd570
 
c6706a3
 
 
 
 
 
31a92cb
c6706a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3c5f61b
c6706a3
 
 
 
5c54d71
 
 
 
 
 
 
c6706a3
 
3c5f61b
d7fd570
 
6e219f7
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import streamlit as st
import pandas as pd
from transformers import pipeline
from datetime import datetime

# Oldal konfiguráció
st.set_page_config(page_title="Orvosi Ügyeleti Beosztás Generáló", layout="wide")

st.title("Orvosi Ügyeleti Beosztás Generáló")
st.write("Töltsd fel az orvosi adatokat tartalmazó Excel fájlt, és generálj beosztást az ügyeletekhez!")

# Hugging Face nyelvi modell betöltése
@st.cache_resource
def load_model():
    return pipeline("text-generation", model="gpt2")

generator = load_model()

# Függvény a dátumok felismerésére és konverziójára
def parse_date(value):
    try:
        if any(char.isdigit() for char in value):
            return datetime.strptime(value, "%d %B %Y")
        parsed_date = datetime.strptime(value, "%d %B")
        return parsed_date.replace(year=2025)
    except (ValueError, TypeError):
        return None

# Adatok tisztítása és egységesítése
def clean_data(df):
    st.write("Eredeti oszlopnevek:", df.columns.tolist())
    df = df.dropna(how='all')  # Üres sorok eltávolítása
    df.columns = df.columns.str.strip().str.lower()
    st.write("Tisztított oszlopnevek:", df.columns.tolist())
    df = df.rename(columns={
        "orvos": "Név", 
        "név": "Név", 
        "elérhetőség": "Elérhetőség", 
        "korlátozások": "Korlátozások"
    })
    if "Név" not in df.columns:
        st.warning("A munkalap nem tartalmaz 'Név' oszlopot, ellenőrizze az adatok helyességét!")
    df = df.dropna(subset=["Név"], errors='ignore')  # Üres név mezők eltávolítása
    return df

# Adatok Excel exportálása
@st.cache_data
def convert_to_excel(data):
    import io
    output = io.BytesIO()
    with pd.ExcelWriter(output, engine="openpyxl") as writer:
        data.to_excel(writer, index=False)
    return output.getvalue()

# Fájl feltöltése
uploaded_file = st.file_uploader("Tölts fel egy Excel fájlt", type=["xlsx"])

if uploaded_file:
    try:
        # Betöltés Excel fájl
        excel_data = pd.ExcelFile(uploaded_file)
        sheet_names = excel_data.sheet_names

        st.write("Munkalapok a fájlban:")
        st.write(sheet_names)

        # Minden munkalapot megvizsgál
        relevant_data = []
        for sheet in sheet_names:
            df = excel_data.parse(sheet)
            st.write(f"Feldolgozás alatt: {sheet}")
            st.write("Adatok előnézete:", df.head())
            df = clean_data(df)  # Adatok tisztítása és egységesítése

            # Ellenőrzés, hogy tartalmaz-e releváns oszlopokat
            if any(col in df.columns for col in ["Név", "név", "orvos"]) and "elérhetőség" in df.columns:
                st.write(f"Releváns adat található a '{sheet}' munkalapon.")
                relevant_data.append(df)
            else:
                st.warning(f"A '{sheet}' munkalap nem tartalmaz releváns adatokat.")

        # Összesített adatok
        if relevant_data:
            combined_data = pd.concat(relevant_data, ignore_index=True)
            st.write("Kombinált adatok:")
            st.dataframe(combined_data)

            # Dátumok feldolgozása az elérhetőség oszlopban
            combined_data["Elérhető napok"] = combined_data["Elérhetőség"].apply(
                lambda x: [parse_date(day.strip()) for day in str(x).split(",")] if pd.notna(x) else []
            )
            combined_data["Korlátozások"] = combined_data["Korlátozások"].apply(
                lambda x: x.split(",") if isinstance(x, str) else []
            )

            # Felhasználói input: dátumok kiválasztása
            available_days = st.multiselect(
                "Add meg az elérhetőségi dátumokat:",
                options=[day.strftime("%Y-%m-%d") for day_list in combined_data["Elérhető napok"] for day in day_list if day]
            )

            if available_days:
                foglalt_napok = {}
                beosztas = []

                for nap in available_days:
                    for index, row in combined_data.iterrows():
                        if nap in [day.strftime("%Y-%m-%d") for day in row["Elérhető napok"] if day]:
                            korlatozott = any(
                                foglalt_napok.get(nap) == szemely
                                for szemely in row["Korlátozások"]
                            )
                            if not korlatozott:
                                foglalt_napok[nap] = row["Név"]
                                prompt = f"{row['Név']} ügyel {nap}-n, mert "
                                indoklas = generator(prompt, max_length=50, num_return_sequences=1)[0]["generated_text"]
                                beosztas.append({
                                    "Nap": nap,
                                    "Orvos": row["Név"],
                                    "Indoklás": indoklas
                                })
                                break

                # Beosztás megjelenítése
                beosztas_df = pd.DataFrame(beosztas)
                st.write("Generált Ügyeleti Beosztás:")
                st.dataframe(beosztas_df)

                # Exportálás
                excel_data = convert_to_excel(beosztas_df)
                st.download_button(
                    label="Beosztás letöltése Excelben",
                    data=excel_data,
                    file_name="ugyeleti_beosztas.xlsx",
                    mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
                )
            else:
                st.warning("Kérlek, válaszd ki az elérhetőségi dátumokat.")
        else:
            st.warning("Nem található releváns adat a munkalapokon.")

    except Exception as e:
        st.error(f"Hiba történt a fájl feldolgozása során: {e}")
else:
    st.info("Tölts fel egy fájlt a kezdéshez.")