| import streamlit as st |
| import pandas as pd |
| from transformers import pipeline |
| from datetime import datetime |
|
|
| |
| 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!") |
|
|
| |
| @st.cache_resource |
| def load_model(): |
| return pipeline("text-generation", model="gpt2") |
|
|
| generator = load_model() |
|
|
| |
| 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 |
|
|
| |
| def clean_data(df): |
| st.write("Eredeti oszlopnevek:", df.columns.tolist()) |
| df = df.dropna(how='all') |
| 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') |
| return df |
|
|
| |
| @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() |
|
|
| |
| uploaded_file = st.file_uploader("Tölts fel egy Excel fájlt", type=["xlsx"]) |
|
|
| if uploaded_file: |
| try: |
| |
| excel_data = pd.ExcelFile(uploaded_file) |
| sheet_names = excel_data.sheet_names |
|
|
| st.write("Munkalapok a fájlban:") |
| st.write(sheet_names) |
|
|
| |
| 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) |
|
|
| |
| 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.") |
|
|
| |
| if relevant_data: |
| combined_data = pd.concat(relevant_data, ignore_index=True) |
| st.write("Kombinált adatok:") |
| st.dataframe(combined_data) |
|
|
| |
| 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 [] |
| ) |
|
|
| |
| 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 |
|
|
| |
| beosztas_df = pd.DataFrame(beosztas) |
| st.write("Generált Ügyeleti Beosztás:") |
| st.dataframe(beosztas_df) |
|
|
| |
| 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.") |
|
|