Я пытаюсь создать тепловую карту, чтобы показать состояние узлов датчика.
Данные примерно такие:
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)
Может кто-нибудь подсказать мне, что я делаю не так?