Hi Friends,
I am new bee to python Dash. I need help regarding how to use Dash Core Components clickData to update the graph.
I have made a map and upon clicking its marker, it should display the graph of particular Network operator however whenever i click the graph, it displays that string indices must be integers for line (mccmnc = clickData[‘points’][0][‘customdata’])
import dash
import numpy as np
from scipy.stats import t
from numpy import average, std
from math import sqrt
import pandas as pd
from pandas import Series, DataFrame
import dash
from dash.dependencies import Input, Output, Event
import dash_core_components as dcc
import dash_html_components as html
import matplotlib.pyplot as plt
from matplotlib import rcParams
import seaborn as sb
import datetime as dt
import time
import glob
from datetime import timedelta
import dash_table_experiments as dtable
import plotly.plotly as py
import plotly.graph_objs as go
import os
import json
from textwrap import dedent as d
app=dash.Dash()
styles = {
'pre': {
'border': 'thin lightgrey solid',
'overflowX': 'scroll'
}
}
def data_sort():
Stats1='C:/Users/muzamal.pervez/Desktop/Python Scripts/Second Project/IBRoamers.csv'
LOC1='C:/Users/muzamal.pervez/Desktop/Python Scripts/Second Project/mcc-mnc-table.csv'
DF1=pd.read_csv(Stats1)
Table=pd.read_csv(LOC1,encoding = "ISO-8859-1")
DF2=DF1.groupby(['Start Time', 'MCC', 'MNC']).sum()
DF2=DF2.reset_index()
DF2.insert(loc=1, column='NE Name', value='NWD')
DF=pd.concat([DF1,DF2])
#DF['Start Time']=pd.to_datetime(DF['Start Time'])
DF=DF.sort_values(by=['Start Time','MCC', 'MNC'], ascending=False)
DF=DF.reset_index(drop=True)
DF['2G_Attach_SR(%)']=(DF['Gb mode attach accept times per PLMN (times)']/DF['Gb mode attach request times per PLMN (times)'])*100
DF['3G_Attach_SR(%)']=(DF['Iu mode attach accept times per PLMN (times)']/DF['Iu mode attach request times per PLMN (times)'])*100
DF['LTE_Combined_Attach_SR(%)']=(DF['S1 Mode Combined Attach Success Times for EPS and non-EPS Services per PLMN (times)']/DF['S1 Mode Combined Attach Request Times per PLMN (times)'])*100
DF['2G_PDP_SR(%)']=((DF['Gb mode MS init PDP context act request times per PLMN (times)']-DF['Gb mode MS init PDP context act fail times per PLMN (times)'])/DF['Gb mode MS init PDP context act request times per PLMN (times)'])*100
DF['3G_PDP_SR(%)']=(DF['Iu mode MS init PDP context act success times per PLMN (times)']/DF['Iu mode MS init PDP context act request times per PLMN (times)'])*100
DF['LTE_PDN_Connect_SR(%)']=(DF['S1 Mode PDN Connect Success Times per PLMN (times)']/DF['S1 Mode PDN Connect Request Times per PLMN (times)'])*100
DF['2G_Att_Fail(times)']=DF['Gb mode attach request times per PLMN (times)']-DF['Gb mode attach accept times per PLMN (times)']
DF['2G_PDP_Fail(times)']=DF['Gb mode MS init PDP context act fail times per PLMN (times)']
DF['3G_Att_Fail(times)']=DF['Iu mode attach request times per PLMN (times)']-DF['Iu mode attach accept times per PLMN (times)']
DF['3G_PDP_Fail(times)']=DF['Iu mode MS init PDP context act request times per PLMN (times)']-DF['Iu mode MS init PDP context act success times per PLMN (times)']
DF['LTE_Att_Fail(times)']=DF['S1 Mode Combined Attach Request Times per PLMN (times)']-DF['S1 Mode Combined Attach Success Times for EPS and non-EPS Services per PLMN (times)']
DF['LTE_PDP_Fail(times)']=DF['S1 Mode PDN Connect Request Times per PLMN (times)']-DF['S1 Mode PDN Connect Success Times per PLMN (times)']
DF['Total_Att_Fail(times)']=DF['2G_Att_Fail(times)']+DF['3G_Att_Fail(times)']+DF['LTE_Att_Fail(times)']
DF['Total_PDP_Fail(times)']=DF['2G_PDP_Fail(times)']+DF['3G_PDP_Fail(times)']+DF['LTE_PDP_Fail(times)']
DF['Attached Users(2G,3G,LTE)']=DF['Iu mode attached Average user number per PLMN (number)']+DF['Gb mode attached Average user number per PLMN (number)']+DF['Gb mode attached Average user number per PLMN (number)']
DF['MCCMNC']=(DF['MCC'].str[-3:]) + (DF['MNC'].str[-2:])
Table['MCCMNC']=Table['MCCMNC'].astype(str)
DF=DF.merge(Table, on='MCCMNC')
DF['Start Time']=pd.to_datetime(DF['Start Time'])
Latest=DF['Start Time'].max()
DF.to_csv('DF.csv', index=False)
DF3=DF[DF['Start Time']==Latest]
DF3=DF3[DF3['NE Name']=='NWD']
DF3=DF3.drop(DF3[DF3['Attached Users(2G,3G,LTE)']<50].index)
DF3=DF3.drop(DF3[DF3['MCCMNC']=='41001'].index)
DF3=DF3.drop(DF3[DF3['MCCMNC']=='41007'].index)
DF3=DF3.reset_index(drop=True)
DF3['Text']=DF3['MCCMNC'].astype(str)+' '+DF3['Country']+ ":"+DF3['Network']+ "Total IB roamers: "+DF3['Attached Users(2G,3G,LTE)'].astype(str)
DF3.to_csv('DF3.csv', index=False)
scale = 15
data = dict(
type = 'scattergeo',
autosize=False,
width=2000,
height=2000,
locationmode = 'world',
lon = DF3['Long1'],
lat = DF3['Lat1'],
text = DF3['Text'],
customdata=DF3['MCCMNC'].astype(int),
marker = dict(
size = DF3['Attached Users(2G,3G,LTE)']/scale,
color = np.where(((DF3['3G_Attach_SR(%)'] < 70)|(DF3['2G_Attach_SR(%)'] < 70)|(DF3['3G_PDP_SR(%)'] < 70)|(DF3['2G_PDP_SR(%)'] < 70))&((DF3['2G_Att_Fail(times)']>500)|(DF3['2G_PDP_Fail(times)']>500)|(DF3['3G_Att_Fail(times)']>500)|(DF3['3G_PDP_Fail(times)']>500)), 'red', 'green'),
line=dict(color='#7FFF00'),
sizemode = 'area'
)
),
layout = dict(
title = 'Jazz IB Roamers from around the Globe',
showlegend = False,
geo = dict(
resolution=50,
scope='world',
projection=dict( type='world' ),
showcoastlines=True,
coastlinecolor="#F4A460",
coastlinewidth=0.2,
showland = True,
showframe=False,
showocean=True,
showcountries=True,
showcountrycodes=True,
showcontinents=True,
showrivers=True,
rivercolor="#F4A460",
riverwidth=0.2,
showlakes=True,
lakecolor="#F4A460",
lakewidth=0.2,
landcolor = '#262626',
oceancolor='#000033',
showsubunit=True,
subunitwidth=0.2,
countrywidth=0.5,
subunitcolor="#F4A460",
countrycolor="#F4A460"
),
)
fig = dict( data=data, layout=layout )
return fig
app.layout = html.Div([
dcc.Graph(id='Map1', figure=data_sort()),
html.Div([
dcc.Dropdown(
id='my_dropdown',
options=[
{'label': 'NWD', 'value': 'NWD'},
{'label': 'ISB', 'value': 'USN-ISB'},
{'label': 'KHI', 'value': 'USN-KHI'},
{'label': 'LHR', 'value': 'USN-LHR'}
],
value='NWD')]),
dcc.Interval(id='graph-update',interval=300000),
dcc.Graph(id='graph1', animate=True,clickData={'points': [{'customdata': '42403'}]})
])
@app.callback(
dash.dependencies.Output('graph1','figure'),
[dash.dependencies.Input('my_dropdown', 'value'),
dash.dependencies.Input('Map1', 'clickData')],
events=[dash.dependencies.Event('graph-update', 'interval')]
)
def Graph1(clickData, USN):
data_sort()
address2 = 'C:/Users/muzamal.pervez/Desktop/Python Scripts/DF.csv'
DF6=pd.read_csv(address2)
DF6=DF6.loc[DF6['NE Name'] == USN]
mccmnc = clickData['points'][0]['customdata']
DF6=DF6.loc[DF6['MCCMNC'] == mccmnc]
return {
'data': [{
'x': DF6['Start Time'],
'y': DF6['2G_Attach_SR(%)'],
'name':'{} ::2G Roaming Attach SR'.format(USN),
'line' : {
'color':'#00CD00'
}
},
{
'x': DF6['Start Time'],
'y': DF6['3G_Attach_SR(%)'],
'name':'{} ::3G Roaming Attach SR'.format(USN),
'line' : {
'color':'#4876FF'
}
}
],
'layout' : go.Layout(
title='Live Throughput Trend(Mbps)',
titlefont=dict(
size=36,
color='#212121'
),
xaxis=dict(
title='Start Time',
titlefont=dict(
family='Courier New, monospace',
size=24,
color='#030303'
)
),
yaxis=dict(
title='Throughput(Mbps)',
titlefont=dict(
family='Courier New, monospace',
size=24,
color='#030303'
)
)
)
}
if __name__ == '__main__':
app.run_server(debug=False)
May be i am missing something. Your guidance will really help me out here. Thanks a lot