Тепловая карта Dashly Dash не дает ожидаемого результата - PullRequest
0 голосов
/ 27 мая 2019

enter image description here

Я пытаюсь создать тепловую карту, чтобы показать состояние узлов датчика.

Данные примерно такие:

State filename  vsn Count_Parameters    Percentage_of_sensor_reading_data
Up       05.30      0EA    27                    50 
Up       05.30      0C3    62                    75 
Up       06.30      0BE    27                    50

State показывает, является ли узел Up или Down и может иметь только два значения. Столбец filename на самом деле time vsn является идентификатором узла и является уникальным. Параметр count_parameters говорит, что для определенного узла в конкретное время, сколько датчиков считывают данные. и последний столбец это просто percentage of sensor reading data.

Я хочу создать тепловую карту, где я могу выбрать состояние из выпадающего меню Если выбрано «Вверх», по умолчанию отображаются все значения в процентах (25,50,75 ).

Ось x тепловой карты должна быть vsn, а ось y должна быть time(filename), и она должна быть окрашена в зависимости от количества параметров.

Я написал этот код, который дает мне какую-то тепловую карту, но это не то, что я ожидаю.

Я прилагаю свой вывод

#! /usr/bin/env python
import pandas as pd
import numpy as np
import os
import glob
import datetime as dt
import warnings
import plotly.offline as pyo
import plotly.graph_objs as go
import plotly.figure_factory as ff
import dask.dataframe as dd

import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output

warnings.filterwarnings('ignore')

file_path=glob.glob( '/home/ricky/final/data/AoT*')

for name in glob.glob('/home/ricky/final/data/AoT*'):
    data_df=dd.read_csv(os.path.join(name, 'data.csv'))
    node_df=pd.read_csv(os.path.join(name, 'nodes.csv'))
    sensors_df=pd.read_csv(os.path.join(name, 'sensors.csv'))
#data_df =data_df.compute()

node_df['Status'] = node_df.apply(lambda x: 'Active' if pd.isnull(x['end_timestamp']) else 'Inactive', axis=1)

node_df=node_df.loc[node_df.Status == 'Active']
node_df=node_df.drop(columns=['description','project_id','start_timestamp','end_timestamp'])

sensors_df=sensors_df.drop(columns=['ontology','subsystem','hrf_unit','hrf_minval','hrf_maxval','datasheet'])

no_of_sensors=sensors_df['sensor'].nunique()
no_of_parameter=sensors_df['parameter'].nunique()

#os.chdir('/home/ricky/final/data/')
csvfiles=glob.glob( '/home/ricky/final/data/recent_data*.csv')

#csvfiles = glob.glob( 'recent_data*.csv')
dataframes = []  # a list to hold all the individual pandas DataFrames
for csvfile in csvfiles:
    df = pd.read_csv(csvfile)
    nd=pd.merge(df,node_df, on='node_id', how="outer")
    nd['filename']=csvfile[35:40]
    nd.fillna('unknown', inplace=True)
    dataframes.append(nd)

# concatenate them all together
data_node_join_df = pd.concat(dataframes, ignore_index=True)
data_node_join_df['State'] = data_node_join_df.apply(lambda x: 'Down' if (x['timestamp']=='unknown') else 'Up', axis=1)

heatmap_df=pd.DataFrame({'Count_Parameters': data_node_join_df.groupby(('State','filename','vsn')).parameter.nunique()}).reset_index()

heatmap_df.loc[heatmap_df['Count_Parameters'] <= 1, 'Percentage_of_sensor_reading_data'] = 0

heatmap_df.loc[(heatmap_df['Count_Parameters'] 1)
                       & (heatmap_df['Count_Parameters']<=round(no_of_parameter*.25)), 'Percentage_of_sensor_reading_data'] = 25

heatmap_df.loc[(heatmap_df['Count_Parameters']>round(no_of_parameter*.25))
                       & (heatmap_df['Count_Parameters']<=round(no_of_parameter*.50)), 'Percentage_of_sensor_reading_data'] = 50


heatmap_df.loc[(heatmap_df['Count_Parameters']>round(no_of_parameter*.50))
                       & (heatmap_df['Count_Parameters']<=round(no_of_parameter*.75)), 'Percentage_of_sensor_reading_data'] = 75

heatmap_df.loc[(heatmap_df['Count_Parameters']>round(no_of_parameter*.75))
                       & (heatmap_df['Count_Parameters']<round(no_of_parameter)), 'Percentage_of_sensor_reading_data'] = 99

heatmap_df.loc[heatmap_df['Count_Parameters'] == no_of_parameter, 'Percentage_of_sensor_reading_data'] = 100

heatmap_df['Percentage_of_sensor_reading_data'] = heatmap_df['Percentage_of_sensor_reading_data'].apply(np.int64)

heatmap_df=heatmap_df.sort_values(by=['State','vsn','Count_Parameters'],ascending=False)
#print(heatmap_df)


data = []
state = ["Up","Down"]
for i in state:
 for j in range(100):
  data.append([i,j])
check = pd.DataFrame(data,columns=['State','Count_Parameters'])


#states = heatmap_df['State'].unique()
#state_default = heatmap_df['State'][0]
#print(state_default)

no_sensor_default = [50,75,25,]
#print(no_sensor_default)

df_default = heatmap_df[(heatmap_df['State'] == 'Up') &
                        (heatmap_df['Percentage_of_sensor_reading_data'] != 0)]
#print(df_default)


external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

app.layout = html.Div([
 html.H1('Node Status'),
 html.Div([
 html.Div([
 html.H4('Select Node State'),
 dcc.Dropdown(
 id='state_dropdown',
 options=[{'label': i, 'value': i} for i in heatmap_df['State'].unique()],
 value = 'Up'
 ),
 ],
 style={'width': '48%', 'display': 'inline-block'}),

 html.Div([
 html.H4('Select percentage of nodes reading data'),
 dcc.Dropdown(
 id='Menu_dropdown',multi=True,
 value = [50,75,25,]
 ),
 ],style={'width': '48%', 'float': 'left', 'display': 'inline-block'}),
 dcc.Graph(id='heatmap',
 figure = {
 'data': [go.Heatmap(
 x=df_default['vsn'],
 y=df_default['filename'],
 z=df_default['Count_Parameters'],
 hovertemplate='Depth: %{x}<br>Time: %{y}<br>Range: %{z}<extra></extra>',
 name = 'first legend group',

 colorscale='YlOrRd')],
 'layout': go.Layout(
 xaxis = dict(title = 'vsn',tickvals= df_default['vsn'].unique(), tickfont= {"size": 8}, tickangle= -40,tickmode = 'linear'),
 yaxis = dict( title = 'time',tickvals= df_default['filename'].unique(), tickfont= {"size": 8},tickmode = 'linear'),
 )})
 ]),])


@app.callback(
    dash.dependencies.Output(component_id='Menu_dropdown',component_property='options'),
    [dash.dependencies.Input(component_id='state_dropdown',component_property='value')]
)
def update_Menu_dropdown(selected_state):
    return [{'label': i, 'value': i} for i in heatmap_df[heatmap_df['State'] == selected_state]['Percentage_of_sensor_reading_data'].unique()]

def update_graph(state_dropdown,Menu_dropdown):
 heatmap_data = heatmap_df[(heatmap_df['State'] == state_dropdown) & (heatmap_df['Percentage_of_sensor_reading_data'] == Menu_dropdown)][['filename','vsn','Count_Parameters']]
 #heatmap_data = pd.merge(data, heatmap, on=['State', 'Count_Parameters'],how='outer').fillna(0)
 print (state_dropdown,Menu_dropdown)
 maxsale = heatmap_data[heatmap_data['Count_Parameters']==heatmap_data['Count_Parameters'].max()]
 maxsale = maxsale.reset_index()
 return {
 'data': [go.Heatmap(
 x=heatmap_data['vsn'],
 y=heatmap_data['filename'],
 z=heatmap_data['Count_Parameters'],
 xgap = 3,
 ygap = 3,
 colorscale='YlOrRd')],
 'layout': go.Layout(
 title = 'MAJORITY OF '+Menu_dropdown+' SOLD AT '+str.upper(state_dropdown)+' IS ON '+ str.upper(maxsale['vsn'][0])+' '+str(maxsale['filename'][0])
 )
 }

if __name__ == '__main__':
 app.run_server(debug=True)

Может кто-нибудь подсказать мне, что я делаю не так?

...