Einige PyCharm Warnings und Fehlermeldungen wurden entfernt. Allerings scheint die Dockerintegration in PyCharm nicht komplett ohne Fehler zu sein. Man sollte sich nicht zu sehr auf die Fehlermeldungen verlassen, hier speziell, wenn Module vermisst werden. Diese sind in der Regel im Container installiert. PyCharm merkt dies aber nicht!

This commit is contained in:
2026-06-26 12:46:29 +02:00
parent 510cb54faa
commit 4a5e92395e
4 changed files with 64 additions and 54 deletions
+59 -51
View File
@@ -7,7 +7,7 @@ import os
# --- Konstanten ---
TB2B = 1024**4 # TB in Bytes
FILE_PATH = os.getenv("JSON_CACHE_WITH_PATH", "/data/json_cache.json")
FILE_PATH = os.getenv("JSON_CACHE_WITH_PATH", "/data/results/json_cache.json")
PRICE_PER_TB = 8.1 # CHF / TB
@@ -24,7 +24,8 @@ def load_data():
"""
try:
return pd.read_json(FILE_PATH)
except Exception:
except (FileNotFoundError, ValueError):
# Fange nur erwartete Fehler ab: Datei nicht gefunden oder ungültiges JSON
return pd.DataFrame([
{"ownerGroup": "a-123", "department": "4000", "size": 500000, "packedSize": 400000},
{"ownerGroup": "p9999", "department": "6000", "size": 1200000, "packedSize": 1000000}
@@ -35,10 +36,12 @@ df = load_data()
# --- Session State Initialisierung ---
if "department" in df.columns:
depts = sorted(df["department"].unique().tolist())
if 'gewaehltes_dept' not in st.session_state:
st.session_state.gewaehltes_dept = depts[0] if depts else None
if 'gewaehltes_dept' not in st.session_state:
if "department" in df.columns:
depts_for_init = sorted(df["department"].unique().tolist())
st.session_state.gewaehltes_dept = depts_for_init[0] if depts_for_init else None
else:
st.session_state.gewaehltes_dept = None
# --- Navigation (Sidebar) ---
@@ -117,7 +120,7 @@ if auswahl == "Übersicht & Metriken":
)
if "department" in df:
if "department" in df.columns:
fig = px.pie(
df,
names="department",
@@ -130,55 +133,60 @@ if auswahl == "Übersicht & Metriken":
elif auswahl == "Bereichs-Analyse":
st.title("Bereichs-Analyse")
if "department" in df and depts:
try:
default_index = depts.index(st.session_state.gewaehltes_dept)
except ValueError:
if "department" in df.columns:
depts = sorted(df["department"].unique().tolist())
if depts:
default_index = 0
if st.session_state.gewaehltes_dept:
try:
default_index = depts.index(st.session_state.gewaehltes_dept)
except ValueError:
default_index = 0
neue_auswahl = st.selectbox(
"Bereich auswählen:",
depts,
index=default_index
)
st.session_state.gewaehltes_dept = neue_auswahl
filtered_df = df[df["department"] == st.session_state.gewaehltes_dept].copy()
if "copies" in filtered_df.columns:
conditions = [
filtered_df['copies'].str.startswith('one', na=False),
filtered_df['copies'].str.startswith('two', na=False)
]
choices = [1, 2]
filtered_df['copies'] = np.select(
conditions, choices, default=filtered_df['copies']
neue_auswahl = st.selectbox(
"Bereich auswählen:",
depts,
index=default_index
)
st.session_state.gewaehltes_dept = neue_auswahl
if "packedSize" in filtered_df.columns:
filtered_df = filtered_df.sort_values(
by="packedSize", ascending=False
filtered_df = df[df["department"] == st.session_state.gewaehltes_dept].copy()
if "copies" in filtered_df.columns:
conditions = [
filtered_df['copies'].str.startswith('one', na=False),
filtered_df['copies'].str.startswith('two', na=False)
]
choices = [1, 2]
filtered_df['copies'] = np.select(
conditions, choices, default=filtered_df['copies']
)
if "packedSize" in filtered_df.columns:
filtered_df = filtered_df.sort_values(
by="packedSize", ascending=False
)
rename_mapping = {
"ownerGroup": "Gruppe",
"copies": "Anzahl Kopien",
"size": "unpacketierte Grösse",
"packedSize": "packetierte Grösse",
"beamline": "Beamline",
"department": "Bereich"
}
filtered_df.rename(columns=rename_mapping, inplace=True)
if "packetierte Grösse" in filtered_df.columns:
filtered_df["Kosten [CHF]"] = \
(filtered_df["packetierte Grösse"] / TB2B) * PRICE_PER_TB
department_name = str(st.session_state.gewaehltes_dept)
st.metric(
f"Anzahl Gruppen in Department {department_name}",
len(filtered_df)
)
rename_mapping = {
"ownerGroup": "Gruppe",
"copies": "Anzahl Kopien",
"size": "unpacketierte Grösse",
"packedSize": "packetierte Grösse",
"beamline": "Beamline",
"department": "Bereich"
}
filtered_df.rename(columns=rename_mapping, inplace=True)
if "packetierte Grösse" in filtered_df.columns:
filtered_df["Kosten [CHF]"] = \
(filtered_df["packetierte Grösse"] / TB2B) * PRICE_PER_TB
st.metric(
f"Anzahl Gruppen in Department {st.session_state.gewaehltes_dept}",
len(filtered_df)
)
st.dataframe(filtered_df, use_container_width=True, hide_index=True)
st.dataframe(filtered_df, use_container_width=True, hide_index=True)
elif auswahl == "Nicht zuweisbare Daten":
st.title("Nicht zuweisbare Daten")
+3 -1
View File
@@ -1,6 +1,7 @@
services:
logic-red:
build: ./logic
container_name: archive_cost_logic
volumes:
- ./logic/node-red-data:/data
- ./shared_data:/data/results
@@ -33,10 +34,11 @@ services:
# --- NEUER STREAMLIT CONTAINER ---
analytics-app:
build: ./analytics
container_name: archive_cost_analytics
ports:
- "8501:8501" # Standard-Port für Streamlit im Browser
volumes:
- ./analytics:/app
- ./shared_data:/data:ro
- ./shared_data:/data/results:ro
environment:
- TZ=Europe/Zurich
@@ -1 +1 @@
size_by_ownergroup_and_number_of_copies_2026-06-26T11_00_16.json
size_by_ownergroup_and_number_of_copies_2026-06-26T12_24_06.json
File diff suppressed because one or more lines are too long