77 lines
2.6 KiB
Python
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)
|