Mini-Hackathon-Data-Viz/backend/app.py

77 lines
2.6 KiB
Python

import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px
st.title("List Data Visualizer & Analyzer")
# Seitenleiste für die Dateneingabe
st.sidebar.header("Dateneingabe")
datenquelle = st.sidebar.radio("Datenquelle auswählen:", ("Manuelle Eingabe", "CSV-Datei hochladen"))
if datenquelle == "Manuelle Eingabe":
dateneingabe = st.sidebar.text_area("Gib Zahlen ein, getrennt durch Kommas:", value="1,2,3,4,5")
try:
datenliste = [float(x.strip()) for x in dateneingabe.split(",") if x.strip()]
df = pd.DataFrame(datenliste, columns=['Werte'])
except ValueError:
st.error("Bitte gib eine gültige Liste von Zahlen ein.")
st.stop()
elif datenquelle == "CSV-Datei hochladen":
hochgeladene_datei = st.sidebar.file_uploader("Wähle eine CSV-Datei aus", type="csv")
if hochgeladene_datei is not None:
df = pd.read_csv(hochgeladene_datei)
# Annahme: Die Daten stehen in der ersten Spalte
df = df.iloc[:, [0]]
df.columns = ['Werte']
else:
st.warning("Bitte lade eine CSV-Datei hoch.")
st.stop()
# Interaktive Filter
st.sidebar.header("Datenfilter")
min_wert = float(df['Werte'].min())
max_wert = float(df['Werte'].max())
filterbereich = st.sidebar.slider('Wertebereich auswählen:', min_wert, max_wert, (min_wert, max_wert))
gefilterter_df = df[(df['Werte'] >= filterbereich[0]) & (df['Werte'] <= filterbereich[1])]
# Statistische Analyse
st.header("Statistische Analyse")
st.write(f"**Anzahl:** {gefilterter_df['Werte'].count()}")
st.write(f"**Mittelwert:** {gefilterter_df['Werte'].mean()}")
st.write(f"**Median:** {gefilterter_df['Werte'].median()}")
st.write(f"**Standardabweichung:** {gefilterter_df['Werte'].std()}")
# Ausreißererkennung (mithilfe der 1.5*IQR-Regel)
Q1 = gefilterter_df['Werte'].quantile(0.25)
Q3 = gefilterter_df['Werte'].quantile(0.75)
IQR = Q3 - Q1
untere_grenze = Q1 - 1.5 * IQR
obere_grenze = Q3 + 1.5 * IQR
ausreisser = gefilterter_df[(gefilterter_df['Werte'] < untere_grenze) | (gefilterter_df['Werte'] > obere_grenze)]
# Visualisierungen
st.header("Datenvisualisierungen")
# Histogramm
st.subheader("Histogramm")
fig1 = px.histogram(gefilterter_df, x='Werte', nbins=20, title='Histogramm')
st.plotly_chart(fig1)
# Boxplot
st.subheader("Boxplot")
fig2 = px.box(gefilterter_df, y='Werte', points="all", title='Boxplot mit Ausreißern')
st.plotly_chart(fig2)
# Ausreißer anzeigen
if not ausreisser.empty:
st.subheader("Erkannte Ausreißer")
st.write(ausreisser)
else:
st.subheader("Keine Ausreißer erkannt")
# Gefilterte Daten anzeigen
st.header("Gefilterte Daten")
st.write(gefilterter_df)