|
import plotly.graph_objects as go |
|
import streamlit |
|
|
|
|
|
@streamlit.cache_data |
|
def plot_sankey(data, output_file='sankey_diagram_oct.html', i=0, do='до'): |
|
labels = [] |
|
sources = [] |
|
targets = [] |
|
values = [] |
|
|
|
|
|
for event, next_events in data.items(): |
|
|
|
if event not in labels: |
|
labels.append(event) |
|
|
|
current_event_index = labels.index(event) |
|
|
|
for next_event, (user_count, percentage) in next_events.items(): |
|
if next_event not in labels: |
|
labels.append(next_event) |
|
|
|
next_event_index = labels.index(next_event) |
|
sources.append(current_event_index) |
|
targets.append(next_event_index) |
|
values.append(user_count) |
|
|
|
|
|
fig = go.Figure(data=[go.Sankey( |
|
valueformat= ".0f", |
|
valuesuffix="TWh", |
|
|
|
|
|
|
|
|
|
node=dict( |
|
|
|
pad=15, |
|
thickness=20, |
|
line=dict(color="black", width=0.1), |
|
label=labels, |
|
|
|
), |
|
link=dict( |
|
|
|
source=sources, |
|
target=targets, |
|
value=values, |
|
label=[f"{user_count} ({percentage})" for user_count, percentage in |
|
zip(values, [data[labels[sources[i]]][labels[targets[i]]][1] for i in range(len(sources))])], |
|
) |
|
)]) |
|
|
|
return fig.update_layout(title_text=f"Воронка сервиса Финансовое здоровье за октябрь 2024, часть {i} ({do} ГЭС ФЗ)", |
|
font_size=10, |
|
font= dict(size=10, color='white'), |
|
plot_bgcolor='white', |
|
paper_bgcolor='white') |
|
|
|
|
|
|
|
|
|
|
|
|