|
import streamlit as st |
|
from streamlit_folium import st_folium |
|
from DataModel import DataModel |
|
from Visualization import Visualization |
|
|
|
def app_run(node_id=0): |
|
|
|
st.set_page_config(page_title='Zeitverluste an Knotenpunkten', layout='wide') |
|
|
|
node = st.experimental_get_query_params() |
|
if 'node_id' in node: |
|
node_id = node['node_id'][0] |
|
else: |
|
st.error('No NodeID given !!') |
|
st.stop() |
|
|
|
dm = DataModel() |
|
visu = Visualization() |
|
|
|
metric_cols = st.columns([1,1,1,1,3]) |
|
|
|
st.session_state['node_id'] = node_id |
|
st.session_state['extension_radius'] = 30 |
|
|
|
|
|
directs, feature, _, gdf = dm.get_data_of_node(st.session_state['node_id'],st.session_state['extension_radius']) |
|
|
|
with st.spinner('Grafiken werden erstellt ...'): |
|
folium_map = visu.create_folium_map(gdf) |
|
figures, results, worst_relevant_loss = visu.get_diretion_results(directs, feature) |
|
|
|
usable_rides = int(sum([df.tail(1)['Fahrten'] for df in results])) |
|
mean_time_loss = float(sum([df.tail(1)['Fahrten']*df.tail(1)['Zeitverlust'] for df in results])/usable_rides) |
|
mean_waiting_time = float(sum([df.tail(1)['Fahrten']*df.tail(1)['Standzeit'] for df in results])/usable_rides) |
|
|
|
input_directions = [f"Richtung {directs[d]['name']}" for d in directs] |
|
|
|
elem0 = metric_cols[0].container() |
|
elem0.markdown('Auswertbare Fahrten im Knoten') |
|
elem0.header(visu.int2str(usable_rides)) |
|
|
|
elem1 = metric_cols[1].container() |
|
elem1.markdown('Gesamter Zeitverlust') |
|
color = visu.get_metric_color(mean_time_loss) |
|
elem1.header(f":{color}[{visu.float2str(mean_time_loss)}s]") |
|
|
|
elem2 = metric_cols[2].container() |
|
elem2.markdown('Gesamte Standzeit') |
|
color = visu.get_metric_color(mean_waiting_time) |
|
elem2.header(f":{color}[{visu.float2str(mean_waiting_time)}s]") |
|
|
|
elem3 = metric_cols[3].container() |
|
elem3.markdown('Gesamtbewertung') |
|
color = visu.get_metric_color(worst_relevant_loss['Zeitverlust']) |
|
final_class = visu.get_final_result(worst_relevant_loss['Zeitverlust']) |
|
indirection = input_directions[worst_relevant_loss['InDirection']] |
|
elem3.header(f":{color}[{final_class}, {visu.float2str(worst_relevant_loss['Zeitverlust'])}s]") |
|
elem3.text(f" Einfahrtsrichtung: {indirection[9:]} \n Ausfahrtsrichtung: {worst_relevant_loss['Richtung']}") |
|
|
|
cols = st.columns([2,4]) |
|
|
|
with cols[0]: |
|
st_folium(folium_map, returned_objects=[], width=500, height=300, key=f'Map') |
|
selection = cols[1].radio(':compass: Wähle Einfahrtsrichtung:', options=input_directions, horizontal=True) |
|
idx = input_directions.index(selection) |
|
|
|
cols[1].text('', help=get_plot_helper_text()) |
|
|
|
cols[1].pyplot(figures[idx], use_container_width=True) |
|
|
|
cols[0].text('', help=get_table_helper_text()) |
|
|
|
cols[0].dataframe(results[idx], hide_index=True, use_container_width=True) |
|
|
|
def get_plot_helper_text(): |
|
return '''Darstellung der Stand- und Verlustzeiten an den Ein- und Ausfahrtswegen im Knotenpunkt. |
|
Zeitliche Verluste werden entsprechend den Qualitätsklassen farblich visualisiert. |
|
Zusätzlich erfolgt die Darstellung der Anzahl der Fahrten pro Fahrtrichtung durch die Breite der Linien. ''' |
|
|
|
def get_table_helper_text(): |
|
return '''Liste der durchschnittlichen Stand- und Verlustzeiten pro Fahrtrichtung, |
|
wobei die Richtungen den in der Abbildung dargestellten Fahrtrichtungen entsprechen.''' |
|
|
|
if __name__ == '__main__': |
|
app_run() |