Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -515,6 +515,9 @@ elif modus == "Upload csv-Datei":
|
|
| 515 |
st.session_state.batch_user_values = batch_user_values
|
| 516 |
else:
|
| 517 |
st.session_state.batch_user_values = None
|
|
|
|
|
|
|
|
|
|
| 518 |
|
| 519 |
do_calc = st.button("Batch-Berechnung starten")
|
| 520 |
if do_calc:
|
|
@@ -578,6 +581,13 @@ elif modus == "Upload csv-Datei":
|
|
| 578 |
df["Annuität_NS"] = 0
|
| 579 |
df["Annuität"] = df["Annuität_NK"] + df["Annuität_NV"] + df["Annuität_NB"] + df["Annuität_NS"]
|
| 580 |
df = df.sort_values("Annuität")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 581 |
for j in range(min(len(df), max_count)):
|
| 582 |
df_out.at[idx, annuität_colnames[j]] = int(df.iloc[j]["Annuität"])
|
| 583 |
df_out.at[idx, hsystem_colnames[j]] = df.iloc[j]["Name"]
|
|
@@ -599,6 +609,44 @@ elif modus == "Upload csv-Datei":
|
|
| 599 |
|
| 600 |
st.success("Berechnung abgeschlossen!")
|
| 601 |
st.info(summary_str)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 602 |
|
| 603 |
csv_buffer = io.StringIO()
|
| 604 |
df_out.to_csv(csv_buffer, sep=";", index=False)
|
|
|
|
| 515 |
st.session_state.batch_user_values = batch_user_values
|
| 516 |
else:
|
| 517 |
st.session_state.batch_user_values = None
|
| 518 |
+
|
| 519 |
+
annuitaeten_gesamt = []
|
| 520 |
+
annuitaeten_objekt_map = {}
|
| 521 |
|
| 522 |
do_calc = st.button("Batch-Berechnung starten")
|
| 523 |
if do_calc:
|
|
|
|
| 581 |
df["Annuität_NS"] = 0
|
| 582 |
df["Annuität"] = df["Annuität_NK"] + df["Annuität_NV"] + df["Annuität_NB"] + df["Annuität_NS"]
|
| 583 |
df = df.sort_values("Annuität")
|
| 584 |
+
df_anni = df[[
|
| 585 |
+
"Name", "Annuität_NK", "Annuität_NV", "Annuität_NB", "Annuität"
|
| 586 |
+
]].copy()
|
| 587 |
+
df_anni["Objekt-ID"] = row.get("Objekt-ID", idx)
|
| 588 |
+
annuitaeten_gesamt.append(df_anni)
|
| 589 |
+
annuitaeten_objekt_map[str(row.get("Objekt-ID", idx))] = df_anni
|
| 590 |
+
|
| 591 |
for j in range(min(len(df), max_count)):
|
| 592 |
df_out.at[idx, annuität_colnames[j]] = int(df.iloc[j]["Annuität"])
|
| 593 |
df_out.at[idx, hsystem_colnames[j]] = df.iloc[j]["Name"]
|
|
|
|
| 609 |
|
| 610 |
st.success("Berechnung abgeschlossen!")
|
| 611 |
st.info(summary_str)
|
| 612 |
+
|
| 613 |
+
if annuitaeten_gesamt:
|
| 614 |
+
# Verbinde alle Einzel-DFs zu einem großen Table
|
| 615 |
+
df_alle = pd.concat(annuitaeten_gesamt, ignore_index=True)
|
| 616 |
+
# Mittelwerte pro System
|
| 617 |
+
df_mittel = df_alle.groupby("Name")[["Annuität_NK", "Annuität_NV", "Annuität_NB", "Annuität"]].mean(numeric_only=True).reset_index()
|
| 618 |
+
|
| 619 |
+
# Für gestapeltes Balkendiagramm (wie im Einzel-Modus)
|
| 620 |
+
df_stacked = df_mittel.melt(
|
| 621 |
+
id_vars="Name",
|
| 622 |
+
value_vars=["Annuität_NK", "Annuität_NV", "Annuität_NB"],
|
| 623 |
+
var_name="Kostenart",
|
| 624 |
+
value_name="Wert"
|
| 625 |
+
)
|
| 626 |
+
df_stacked["Kostenart"] = df_stacked["Kostenart"].replace({
|
| 627 |
+
"Annuität_NK": "Kapitalgebundene Kosten",
|
| 628 |
+
"Annuität_NV": "Bedarfsgebundene Kosten",
|
| 629 |
+
"Annuität_NB": "Betriebsgebundene Kosten"
|
| 630 |
+
})
|
| 631 |
+
kostenart_order = ["Kapitalgebundene Kosten", "Bedarfsgebundene Kosten", "Betriebsgebundene Kosten"]
|
| 632 |
+
df_stacked["Kostenart"] = pd.Categorical(df_stacked["Kostenart"], categories=kostenart_order, ordered=True)
|
| 633 |
+
color_scale = alt.Scale(domain=kostenart_order, range=["#00386c", "#004c93", "#0069c8"])
|
| 634 |
+
|
| 635 |
+
# Heizsysteme nach mittlerer Gesamtkosten sortieren
|
| 636 |
+
sortierte_names = df_mittel.sort_values("Annuität")["Name"]
|
| 637 |
+
|
| 638 |
+
st.markdown("### Mittlere annualisierte Kosten pro Heizsystem (Batch-Durchschnitt)")
|
| 639 |
+
st.altair_chart(
|
| 640 |
+
alt.Chart(df_stacked)
|
| 641 |
+
.mark_bar()
|
| 642 |
+
.encode(
|
| 643 |
+
x=alt.X("Wert:Q", title="mittlere annualisierte Kosten (€)", stack="zero"),
|
| 644 |
+
y=alt.Y("Name:N", title="Heizsystem", sort=list(sortierte_names)),
|
| 645 |
+
color=alt.Color("Kostenart:N", scale=color_scale, title="Kostenart"),
|
| 646 |
+
tooltip=["Name", "Kostenart", "Wert"]
|
| 647 |
+
).properties(height=350, width=650),
|
| 648 |
+
use_container_width=True
|
| 649 |
+
)
|
| 650 |
|
| 651 |
csv_buffer = io.StringIO()
|
| 652 |
df_out.to_csv(csv_buffer, sep=";", index=False)
|