Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -650,71 +650,8 @@ elif modus == "Upload csv-Datei":
|
|
| 650 |
).properties(height=350, width=650),
|
| 651 |
use_container_width=True
|
| 652 |
)
|
| 653 |
-
st.
|
| 654 |
-
|
| 655 |
-
selected_objekt_id = st.selectbox(
|
| 656 |
-
"Objekt-ID wählen für Einzelanzeige:",
|
| 657 |
-
objekt_ids,
|
| 658 |
-
key="objektid_einzelauswahl"
|
| 659 |
-
)
|
| 660 |
-
df_objekt = df_alle[df_alle["Objekt-ID"] == selected_objekt_id].copy()
|
| 661 |
-
if not df_objekt.empty:
|
| 662 |
-
df_stacked_obj = df_objekt[["Name", "Annuität_NK", "Annuität_NV", "Annuität_NB"]].melt(
|
| 663 |
-
id_vars="Name",
|
| 664 |
-
value_vars=["Annuität_NK", "Annuität_NV", "Annuität_NB"],
|
| 665 |
-
var_name="Kostenart",
|
| 666 |
-
value_name="Wert"
|
| 667 |
-
)
|
| 668 |
-
df_stacked_obj["Kostenart"] = df_stacked_obj["Kostenart"].replace({
|
| 669 |
-
"Annuität_NK": "Kapitalgebundene Kosten",
|
| 670 |
-
"Annuität_NV": "Bedarfsgebundene Kosten",
|
| 671 |
-
"Annuität_NB": "Betriebsgebundene Kosten"
|
| 672 |
-
})
|
| 673 |
-
kostenart_order = ["Kapitalgebundene Kosten", "Bedarfsgebundene Kosten", "Betriebsgebundene Kosten"]
|
| 674 |
-
df_stacked_obj["Kostenart"] = pd.Categorical(df_stacked_obj["Kostenart"], categories=kostenart_order, ordered=True)
|
| 675 |
-
kostenart_sort_map = {k: i for i, k in enumerate(kostenart_order)}
|
| 676 |
-
df_stacked_obj["Kostenart_Sort"] = df_stacked_obj["Kostenart"].map(kostenart_sort_map)
|
| 677 |
-
gesamt_sortierung = df_objekt[["Name", "Annuität"]].sort_values("Annuität", ascending=True)
|
| 678 |
-
sortierte_names = list(gesamt_sortierung["Name"])
|
| 679 |
-
color_scale = alt.Scale(domain=kostenart_order, range=[ALT1, PRIMARY, ALT2])
|
| 680 |
-
stacked_chart_obj = (
|
| 681 |
-
alt.Chart(df_stacked_obj)
|
| 682 |
-
.mark_bar()
|
| 683 |
-
.encode(
|
| 684 |
-
x=alt.X("Wert:Q", title="Annualisierte Kosten (€)", stack="zero"),
|
| 685 |
-
y=alt.Y("Name:N", title="Heizsystem", sort=sortierte_names, axis=alt.Axis(labelLimit=150)),
|
| 686 |
-
color=alt.Color(
|
| 687 |
-
"Kostenart:N",
|
| 688 |
-
scale=color_scale,
|
| 689 |
-
title="Kostenart",
|
| 690 |
-
legend=alt.Legend(
|
| 691 |
-
orient="bottom",
|
| 692 |
-
direction="horizontal",
|
| 693 |
-
titleOrient="top",
|
| 694 |
-
titleAnchor="middle",
|
| 695 |
-
columns=1,
|
| 696 |
-
symbolSize=150,
|
| 697 |
-
labelFontSize=12,
|
| 698 |
-
titleFontSize=13
|
| 699 |
-
)
|
| 700 |
-
),
|
| 701 |
-
order=alt.Order("Kostenart_Sort:Q", sort="ascending"),
|
| 702 |
-
tooltip=["Name", "Kostenart", "Wert"]
|
| 703 |
-
)
|
| 704 |
-
.properties(
|
| 705 |
-
width="container",
|
| 706 |
-
height=400,
|
| 707 |
-
title=alt.TitleParams(
|
| 708 |
-
text=f"Kostenaufteilung für Objekt-ID {selected_objekt_id}",
|
| 709 |
-
fontSize=16,
|
| 710 |
-
anchor="start"
|
| 711 |
-
)
|
| 712 |
-
)
|
| 713 |
-
)
|
| 714 |
-
st.altair_chart(stacked_chart_obj, use_container_width=True)
|
| 715 |
-
else:
|
| 716 |
-
st.warning("Keine Daten für diese Objekt-ID.")
|
| 717 |
-
|
| 718 |
csv_buffer = io.StringIO()
|
| 719 |
df_out.to_csv(csv_buffer, sep=";", index=False)
|
| 720 |
csv_bytes = csv_buffer.getvalue().encode("utf-8")
|
|
@@ -725,7 +662,76 @@ elif modus == "Upload csv-Datei":
|
|
| 725 |
mime="text/csv"
|
| 726 |
)
|
| 727 |
except Exception as e:
|
| 728 |
-
st.error(f"Fehler beim Einlesen/Berechnen: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 729 |
|
| 730 |
st.markdown("---")
|
| 731 |
st.caption("Berechnung nach VDI 2067, Heizsystemauswahl gemäß DIN EN 15378.")
|
|
|
|
| 650 |
).properties(height=350, width=650),
|
| 651 |
use_container_width=True
|
| 652 |
)
|
| 653 |
+
st.session_state["annuitaeten_gesamt_batch"] = annuitaeten_gesamt
|
| 654 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 655 |
csv_buffer = io.StringIO()
|
| 656 |
df_out.to_csv(csv_buffer, sep=";", index=False)
|
| 657 |
csv_bytes = csv_buffer.getvalue().encode("utf-8")
|
|
|
|
| 662 |
mime="text/csv"
|
| 663 |
)
|
| 664 |
except Exception as e:
|
| 665 |
+
st.error(f"Fehler beim Einlesen/Berechnen: {e}")
|
| 666 |
+
if (
|
| 667 |
+
"annuitaeten_gesamt_batch" in st.session_state
|
| 668 |
+
and st.session_state["annuitaeten_gesamt_batch"]
|
| 669 |
+
):
|
| 670 |
+
st.markdown("### Einzelobjekte interaktiv anzeigen")
|
| 671 |
+
df_alle = pd.concat(st.session_state["annuitaeten_gesamt_batch"], ignore_index=True)
|
| 672 |
+
objekt_ids = df_alle["Objekt-ID"].unique()
|
| 673 |
+
selected_objekt_id = st.selectbox(
|
| 674 |
+
"Objekt-ID wählen für Einzelanzeige:",
|
| 675 |
+
objekt_ids,
|
| 676 |
+
key="objektid_einzelauswahl"
|
| 677 |
+
)
|
| 678 |
+
df_objekt = df_alle[df_alle["Objekt-ID"] == selected_objekt_id].copy()
|
| 679 |
+
if not df_objekt.empty:
|
| 680 |
+
df_stacked_obj = df_objekt[["Name", "Annuität_NK", "Annuität_NV", "Annuität_NB"]].melt(
|
| 681 |
+
id_vars="Name",
|
| 682 |
+
value_vars=["Annuität_NK", "Annuität_NV", "Annuität_NB"],
|
| 683 |
+
var_name="Kostenart",
|
| 684 |
+
value_name="Wert"
|
| 685 |
+
)
|
| 686 |
+
df_stacked_obj["Kostenart"] = df_stacked_obj["Kostenart"].replace({
|
| 687 |
+
"Annuität_NK": "Kapitalgebundene Kosten",
|
| 688 |
+
"Annuität_NV": "Bedarfsgebundene Kosten",
|
| 689 |
+
"Annuität_NB": "Betriebsgebundene Kosten"
|
| 690 |
+
})
|
| 691 |
+
kostenart_order = ["Kapitalgebundene Kosten", "Bedarfsgebundene Kosten", "Betriebsgebundene Kosten"]
|
| 692 |
+
df_stacked_obj["Kostenart"] = pd.Categorical(df_stacked_obj["Kostenart"], categories=kostenart_order, ordered=True)
|
| 693 |
+
kostenart_sort_map = {k: i for i, k in enumerate(kostenart_order)}
|
| 694 |
+
df_stacked_obj["Kostenart_Sort"] = df_stacked_obj["Kostenart"].map(kostenart_sort_map)
|
| 695 |
+
gesamt_sortierung = df_objekt[["Name", "Annuität"]].sort_values("Annuität", ascending=True)
|
| 696 |
+
sortierte_names = list(gesamt_sortierung["Name"])
|
| 697 |
+
color_scale = alt.Scale(domain=kostenart_order, range=[ALT1, PRIMARY, ALT2])
|
| 698 |
+
stacked_chart_obj = (
|
| 699 |
+
alt.Chart(df_stacked_obj)
|
| 700 |
+
.mark_bar()
|
| 701 |
+
.encode(
|
| 702 |
+
x=alt.X("Wert:Q", title="Annualisierte Kosten (€)", stack="zero"),
|
| 703 |
+
y=alt.Y("Name:N", title="Heizsystem", sort=sortierte_names, axis=alt.Axis(labelLimit=150)),
|
| 704 |
+
color=alt.Color(
|
| 705 |
+
"Kostenart:N",
|
| 706 |
+
scale=color_scale,
|
| 707 |
+
title="Kostenart",
|
| 708 |
+
legend=alt.Legend(
|
| 709 |
+
orient="bottom",
|
| 710 |
+
direction="horizontal",
|
| 711 |
+
titleOrient="top",
|
| 712 |
+
titleAnchor="middle",
|
| 713 |
+
columns=1,
|
| 714 |
+
symbolSize=150,
|
| 715 |
+
labelFontSize=12,
|
| 716 |
+
titleFontSize=13
|
| 717 |
+
)
|
| 718 |
+
),
|
| 719 |
+
order=alt.Order("Kostenart_Sort:Q", sort="ascending"),
|
| 720 |
+
tooltip=["Name", "Kostenart", "Wert"]
|
| 721 |
+
)
|
| 722 |
+
.properties(
|
| 723 |
+
width="container",
|
| 724 |
+
height=400,
|
| 725 |
+
title=alt.TitleParams(
|
| 726 |
+
text=f"Kostenaufteilung für Objekt-ID {selected_objekt_id}",
|
| 727 |
+
fontSize=16,
|
| 728 |
+
anchor="start"
|
| 729 |
+
)
|
| 730 |
+
)
|
| 731 |
+
)
|
| 732 |
+
st.altair_chart(stacked_chart_obj, use_container_width=True)
|
| 733 |
+
else:
|
| 734 |
+
st.warning("Keine Daten für diese Objekt-ID.")
|
| 735 |
|
| 736 |
st.markdown("---")
|
| 737 |
st.caption("Berechnung nach VDI 2067, Heizsystemauswahl gemäß DIN EN 15378.")
|