Temperature against space use#

It’s useful to be able to see when users are in the building against what temperature it is. We’re experimenting with this feature. To see what it might look like, choose venue 99 in the dropdown.

Hide code cell source
# Imports 
import ipywidgets as widgets
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go   
import os
from IPython.display import display

# Get the possible data venues
venuekeysfile = "diary-venue-keys.csv"
dfVenueKeys = pd.read_csv(venuekeysfile)
dfVenueKeys = dfVenueKeys.dropna(subset=['channel_id'])




#give user option to select their venue
venueDropdown = widgets.Dropdown(
    options=dfVenueKeys['venue_id'],
    value=dfVenueKeys['venue_id'][0],
    description='Venue ID:',
    disabled=False,
)


container = widgets.HBox(children=[venueDropdown])

#print(venueDropdown.value)

#Retrieve the venue and begin graphing
dfCollatedDataSet = pd.DataFrame(columns=['timestamp', 'entry_id', 'temperature', 'rh', 'voltage', 'awake_time', 'original_timestamp', 'location', 'venue_id'])
dfCollatedUseDiaries = pd.DataFrame(columns=['start', 'end', 'entry_id', 'venue_id'])
for index, venueSensorDetails in dfVenueKeys.iterrows():
    
    # sensorMacOfSelection = venueSensorDetails['sensor_MAC']
    venueOfSelection = str(venueSensorDetails['venue_id'])
    #print(venueOfSelection)
    dfTempDataSet = pd.read_csv('deviceData/'+ "venue_" + venueOfSelection + '.csv' )
    dfTempDataSet.sample(6)
    dfTempDataSet = dfTempDataSet.dropna()
    dfTempDataSet['timestamp'] = pd.to_datetime(dfTempDataSet['timestamp'])
    dfTempDataSet['venue_id'] = venueSensorDetails['venue_id']
    #display(dfTempDataSet)

    #dfCollatedDataSet = dfCollatedDataSet.append(dfTempDataSet, ignore_index=True)
    dfCollatedDataSet = pd.concat([dfCollatedDataSet, dfTempDataSet]) 
    #should already be datetimes - why is this here?
    dfCollatedDataSet['timestamp'] = pd.to_datetime(dfCollatedDataSet['timestamp'])
    
    if os.path.exists('useDiaries/'+ "venue_" + venueOfSelection + "_diary" + '.csv'):
        dfUseDiary = pd.read_csv('useDiaries/'+ "venue_" + venueOfSelection + "_diary" + '.csv' )
        dfUseDiary = dfUseDiary.fillna('')
        dfUseDiary['start'] = pd.to_datetime(dfUseDiary['startUse'])
        dfUseDiary['end'] = pd.to_datetime(dfUseDiary['endUse'])
        dfUseDiary['venue_id'] = venueSensorDetails['venue_id']
        #display(dfUseDiary)

        #dfCollatedUseDiaries = dfCollatedUseDiaries.append(dfUseDiary, ignore_index=True)
        dfCollatedUseDiaries = pd.concat([dfCollatedUseDiaries, dfUseDiary])
        #should already be datetimes - why is this here?
        dfCollatedUseDiaries['start'] = pd.to_datetime(dfUseDiary['start'])
        dfCollatedUseDiaries['end'] = pd.to_datetime(dfUseDiary['end'])
    
    #print('Loading data for venue: ', venueSensorDetails['venue_id']) 

    
#print('Check')
#dfCollatedDataSet.sample(6)




# Assign an empty figure widget with two traces
trace0 = go.Scatter(customdata=dfCollatedDataSet[dfCollatedDataSet['venue_id'] == 0], 
                    y=dfCollatedDataSet['temperature'], 
                    x = dfCollatedDataSet['timestamp'], 
                    mode='lines', 
                    hoverinfo='all', 
                    name='Temperature',
                    )

# trace1 = go.Scatter(customdata=dfCollatedDataSet[dfCollatedDataSet['venue_id'] == 0], 
#                     y=dfCollatedDataSet['rh'], 
#                     x = dfCollatedDataSet['timestamp'], 
#                     mode='lines', 
#                     hoverinfo='all', 
#                     name='Relative Humidity',
#)


g = go.FigureWidget(data=[trace0], #, trace1],
                    layout = go.Layout(
                        yaxis=dict(range=[0,0])           
                    ))


#print("Job Done")
Hide code cell source
updatemenu = []
buttons = []

# button with one option for each dataframe
for index, venue in dfVenueKeys.iterrows():
    buttons.append(dict(method='update',
                        label='Venue ' + str(venue['venue_id']),
                        visible=True,
                        args=[{'y':[dfCollatedDataSet[dfCollatedDataSet['venue_id']==venue['venue_id']]['temperature'].values], #, 
                                    #dfCollatedDataSet[dfCollatedDataSet['venue_id']==venue['venue_id']]['rh'].values],
                               'x':[dfCollatedDataSet[dfCollatedDataSet['venue_id']==venue['venue_id']]['timestamp'].values],
                               'type':'scatter',   
                            #  'name': 'Temperature',
                                                          
                               },
                               {
                                   'title.text': 'Temperature for Venue = ' + str(venue['venue_id']),
                                   'title.font.color': 'green',
                                    #'yaxis.range': [-5,dfCollatedDataSet[dfCollatedDataSet['venue_id']==venue['venue_id']][['temperature', 'rh']].max().max()+5], 
                                    'yaxis.range': [dfCollatedDataSet[dfCollatedDataSet['venue_id']==venue['venue_id']]['temperature'].min()-10,dfCollatedDataSet[dfCollatedDataSet['venue_id']==venue['venue_id']]['temperature'].max()+5], 
                                   'yaxis.title.text': 'Temperature',
                                   'xaxis.title.text': 'Timestamp'

                               },
                               ],
                        )
                  )

# some adjustments to the updatemenus
updatemenu = []
your_menu = dict()
updatemenu.append(your_menu)

updatemenu[0]['buttons'] = buttons
updatemenu[0]['direction'] = 'down'
updatemenu[0]['showactive'] = True
# updatemenu[0]['active'] = 0

 

fig = go.Figure(g)
# add dropdown menus to the figure
fig.update_layout(showlegend=True, 
              updatemenus=updatemenu, 
              autosize = True, 
              title= "Please select a venue to see your data.",
              width=1000,
              height=500,
)

fig.update_layout(
    hovermode='x unified',
    hoverlabel=dict(
        bgcolor="white",
        # font_size=16,
        font_family="Rockwell"
    )
)

# Add range slider

fig.update_layout(
    xaxis=dict(
        rangeselector=dict(
            buttons=list([
                dict(
                     label="All",
                     step="all"
                     ),
                                dict(count=1,
                     label="Hour",
                     step="hour",
                     stepmode="todate"),
                dict(count=1,
                     label="Day",
                     step="day",
                     stepmode="backward"),
                dict(count=7,
                     label="Week",
                     step="day",
                     stepmode="backward"),
                dict(count=1,
                     label="Year",
                     step="year",
                     stepmode="backward")
            ])
        ),
        rangeslider=dict(
            visible=True
        ),
        type="date"
    )
)


#fig.update_yaxes(range=[50, 60])  


#fig.add_hline(y=16, annotation_text='16C - usual minimum for children', annotation_font_color="blue", line_color='red', layer='above', line_dash='dash')
# fig.update_yaxes(range = [-5, dfCollatedDataSet['temperature'].max()+5])

for ind in dfCollatedUseDiaries.index:
    #print(dfCollatedUseDiaries['start'][ind])
    #print(dfCollatedUseDiaries['end'][ind])

    fig.add_vrect(x0=dfCollatedUseDiaries['start'][ind], x1=dfCollatedUseDiaries['end'][ind],
                annotation_text=dfCollatedUseDiaries['label'][ind], 
                annotation_position="top left",
                annotation=dict(font_size=14, 
                font_family="Times New Roman"),
                fillcolor="green", 
                opacity=0.25, 
                line_width=0)
                
fig.show()