#%% import pandas as pd import streamlit as st import plotly.graph_objects as go from geopy.distance import geodesic as GD df = pd.read_excel("result.xlsx") df['lon'] = [eval(x)[0]['geo_lon'] for x in df['result_dadata']] df['lat'] = [eval(x)[0]['geo_lat'] for x in df['result_dadata']] df['address'] = [eval(x)[0]['result'] for x in df['result_dadata']] target_coordinates = (55.7307614,37.6299091) for i in df.index: lat = df.loc[i,'lat'] lon = df.loc[i,'lon'] result = GD((lat,lon),target_coordinates).km df.loc[i,'distance'] = result if result<=2: df.loc[i,'distance_state'] = '2-0km_from_target' elif result<=3 and result>2: df.loc[i,'distance_state'] = '2-3km_from_target' elif result<=5 and result>3: df.loc[i,'distance_state'] = '3-5km_from_target' elif result<=10 and result>5: df.loc[i,'distance_state'] = '5-10km_from_target' elif result>10: df.loc[i,'distance_state'] = 'more_10km_from_target' def get_colors(row): if row >= 10: return 'black' elif row <= 10 and row>5: return 'grey' elif row<=5 and row>3: return 'red' elif row<=3 and row>2: return 'blue' elif row<=2: return 'green' df['colors'] = df['distance'].apply(get_colors) viz_df = viz_df = df[['lpu_name','lat', 'lon', 'address','MT_SUM_RUR', 'distance','colors','distance_state']].copy() viz_df[['lat','lon']] = viz_df[['lat','lon']].astype(float) viz_df['MT_SUM_RUR'] = viz_df['MT_SUM_RUR']/1000 dct_colors = {'black':'больше 10', 'grey':'5-10', 'red':'3-5', 'blue':'2-3', 'green':'меньше 2'} colors = ['black', 'grey', 'red','blue','green'] fig_colored = go.Figure() for color in colors: temp_df = viz_df[viz_df['colors'] == color] text_series_temp = "Название клиники: "+ temp_df['lpu_name'] + "
" + "Адрес: " + temp_df["address"] + "
" + "Расстояние от Валовая 20: " + temp_df['distance'].round(1).astype(str) + "
" + "Количество выплат: " + temp_df['MT_SUM_RUR'].round(2).astype(str) + ' тыс.руб' fig_colored.add_trace(go.Scattermapbox( lat=temp_df['lat'], lon=temp_df['lon'], mode='markers', marker=go.scattermapbox.Marker( color=color, sizemode='area', sizeref=5, opacity=1, ), name=dct_colors[color], customdata=text_series_temp, )) fig_colored.add_trace(go.Scattermapbox( lat=[target_coordinates[0]], lon=[target_coordinates[1]], mode='markers', marker=go.scattermapbox.Marker( color=['yellow'], sizemode='area', sizeref=20, opacity=1, ), name='Валовая 20', customdata=['Валовая 20'], )) fig_colored.update_layout( mapbox_style='open-street-map', autosize=True, hovermode='closest', showlegend=True, mapbox=dict( center=dict(lat=target_coordinates[0], lon=target_coordinates[1]), zoom=9 ), width=900, height=900 ) fig_colored.update_traces(hovertemplate='%{customdata}') grouped_df = viz_df.groupby('distance_state').agg({'MT_SUM_RUR':'sum','lpu_name':'count'}) grouped_df['MT_SUM_RUR'] = grouped_df['MT_SUM_RUR'].cumsum() grouped_df['lpu_name'] = grouped_df['lpu_name'].cumsum() st.plotly_chart(fig_colored) st.dataframe(data=grouped_df)