Как использовать ползунок для дней, когда столбцы нарезаются дальше значений ползунка - PullRequest
0 голосов
/ 06 мая 2020

Я работаю над анализом COVID19 для панели управления и использую источник данных JSON. Я преобразовал json в фрейм данных. Мне удалось вывести траекторию сюжетных дел для каждого случая, используя интерактивные легенды. Но теперь я хочу добавить слайдер для нет. дней с 1-го случая до последней даты (1-е число - День 1). Я преобразовал фрейм данных в CDSView, но есть bokeh.core.validation.check: E-1024 (CDSVIEW_FILTERS_WITH_CONNECTED): фильтры CDSView несовместимы с глифами с подключенной топологией, такой как Line и Patch. Я предполагаю, что это причина, по которой я не могу обновить источник данных для виджета. Значение slider.value будет cum_day_count, а нанесенные на график значения будут указаны c для каждого состояния.

Я не могу понять, как я могу разрезать данные с помощью CDS. Был бы признателен за какое-то направление. Надеюсь, мне удалось правильно объяснить проблему. Буду рад помочь в дальнейшем, если неясно. Спасибо!

Пожалуйста, найдите приведенный ниже код без слайдера, который мне удалось запустить:

from scipy.signal import savgol_filter

cases_summary = requests.get('https://api.rootnet.in/covid19-in/stats/history')

json_data = cases_summary.json()
cases_summary=pd.json_normalize(json_data['data'], record_path='regional', meta='day')

cases_summary['loc']=np.where(cases_summary['loc']=='Nagaland#', 'Nagaland', cases_summary['loc'])
cases_summary['loc']=np.where(cases_summary['loc']=='Madhya Pradesh#', 'Madhya Pradesh', cases_summary['loc'])
cases_summary['loc']=np.where(cases_summary['loc']=='Jharkhand#', 'Jharkhand', cases_summary['loc'])

latest_date=cases_summary['day'].max()

cases_summary['newConfirmed']=cases_summary['totalConfirmed'].groupby(cases_summary['loc']).diff(1)

#Calculating the count of days since 1st case
cases_summary['day'] = pd.to_datetime(cases_summary['day'])

cases_summary['cum_day_count']=(cases_summary['day']-cases_summary['day'].min())+timedelta(days=1)

cases_summary['cum_day_count']= cases_summary['cum_day_count'].astype('str').str.strip(' days 00:00:00.000000000')

cases_summary['cum_day_count'] = pd.to_numeric(cases_summary['cum_day_count'])


#Cases Trajectory - Statewise

#Creating a Dataframe of Statewise smoothened NewConfirmed column to convert it to a CDS and then to CDSView

newConfirmed=cases_summary.groupby(['loc','day'])['newConfirmed'].sum()
cases=pd.DataFrame({'newConfirmed': newConfirmed, 'totalConfirmed':cases_summary.groupby(['loc','day'])['totalConfirmed'].sum()})\
    .reset_index()

cases_new_final= pd.DataFrame()
for i in cases['loc'].unique():
    if len(cases[cases['loc']==i])<3:
        continue
    else:
        def window_size(length):
            if ((length // 2) % 2 == 1):
                return length // 2
            else:
                return (length // 2) + 1
        cases_new=DataFrame({'loc':i,'yhat':savgol_filter(cases[cases['loc']==i]['newConfirmed'], window_size(len(cases[cases['loc']==i])), 3), 'day': cases[cases['loc']==i]['day'], 'newConfirmed': cases[cases['loc']==i]['newConfirmed'], 'totalConfirmed': cases[cases['loc']==i]['totalConfirmed']})
        cases_new_final=cases_new_final.append(cases_new)

cases_new_final['day'] = cases_new_final['day'].astype('str')

#Plotting lines for each state

a = figure(plot_width=1200, plot_height=600,  sizing_mode="scale_both", name="All cases - Statewise")
a.title.text='New Confirmed Case Trends'
a.title.align='center'
a.title.text_font_size='17px'
a.xaxis.axis_label = 'Total Confirmed Cases'
a.yaxis.axis_label = 'New Confirmed Cases'

legend_it=[]

source=ColumnDataSource(data=cases_new_final)

for i, color in zip(range(len(cases_new_final['loc'].unique())),itertools.cycle(Dark2_8)):

    view=CDSView(source=source,
    filters=[GroupFilter(column_name='loc', group=cases_new_final['loc'].unique()[i])])


    renderer_yhat = a.line('totalConfirmed',
                           'yhat', line_width=2,  alpha=1,
                           muted_alpha=0.1, source=source, view=view, color=color)

#The second plot is same but is going to stay muted. Only the renderer_yhat, upon click of the legend, will bolden to alpha=1 so, the view can be differentiated from the rest of the states

    renderer_yhat_bold = a.line('totalConfirmed',
                           'yhat', line_width=2,  alpha=1,
                           muted_alpha=0.1, source=source, view=view, color=color)
    renderer_yhat.visible = False
    renderer_yhat_bold.muted = True
    legend_it.append((cases_new_final['loc'].unique()[i], [renderer_yhat]))

legend1=Legend(items=legend_it[0:16], location=(10,21), click_policy='hide', title="Click on States to Switch ON/OFF", title_text_font_style = "bold")
legend2=Legend(items=legend_it[16:33], location=(10,0), click_policy='hide', title="Click on States to Switch ON/OFF", title_text_font_style = "bold")
a.add_layout(legend1,'right')
a.add_layout(legend2,'right')

citation = Label(x=0, y=0, x_units='screen', y_units='screen',
                 text='Last Updated : {}'.format(latest_date), render_mode='css', text_font_size='12px')

a.add_layout(citation, 'above')

hover = HoverTool(line_policy='next')
hover.tooltips = [('Date', '@day'),
                  ('Total Confirmed', '@totalConfirmed{0000}'),
                  ('New Confirmed', '@newConfirmed{0000}'),
                  ('State', '@loc')
]
a.add_tools(hover)

citation = Label(x=-50, y=-15, x_units='screen', y_units='screen',
                 text='The data has been smoothened using Savitzky-Golay filter with a polynomial of 3rd degree. This chart helps understand the trajectory of case growth for each state and understand the impact of lockdown and containment efforts by administration and frontline warriors.', render_mode='css', text_font_size='14px', text_align='left')

a.add_layout(citation, 'below')

tab = Panel(child=a, title="Case Trends - Statewise")
tabs= Tabs(tabs=[tab])

curdoc().add_root(tabs) ```


...