ubeo / app.py
albhu's picture
Update app.py
09fed9f verified
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.")