{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Introduction\n\nThe aim of this notebook is to view the data of a single building, faceted by the four energy aspects: electricity, hot water, chilled water and steam. Also the number of zeros and NaNs are displayed in a table under the graph.\n\nFirst select the desired building in the input 'Building', and then click on the '🔄Refresh' button\n\n**It seems to work only in edit mode**. I leave here an screenshot:\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F645169%2F852d4ff6ea0032a393c18172c98ca8eb%2FCaptura%20de%20pantalla%20de%202019-11-01%2019-04-13.png?generation=1572631492191478&alt=media)"},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport pickle\n\nimport plotly.graph_objects as go\nfrom ipywidgets import widgets","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"data_path = '../input/ashrae-data-wrangling-csv-to-pickle/'\nwith open(data_path + 'X_train.pickle', 'rb') as f:\n    X_train = pickle.load(f)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"def get_data(building_id, meter, xy):\n    return X_train[(X_train['building_id']==str(building_id)) &\\\n                   (X_train['meter']==meter)][xy]\n\nbuilding = widgets.IntText(\n    value=1249,\n    min=1,\n    max=1448,\n    step=1,\n    description='Building:',\n    disabled=False\n)\n\nrefresh = widgets.Button(\n    description='Refresh',\n    disabled=False,\n    button_style='info',\n    tooltip='Refresh',\n    icon='refresh'\n)\n\nresults = widgets.HTML(\n    value=''\n)\n\nelectricity = go.Scatter(x=[],\n                         y=[],\n                         name='Electricity')\n\nhotwater = go.Scatter(x=[],\n                      y=[],\n                      name='Hot water')\n\nchilledwater = go.Scatter(x=[],\n                          y=[],\n                          name='Chilled water')\n\nsteam = go.Scatter(x=[],\n                   y=[],\n                   name='Steam')\n\ng = go.FigureWidget(data=[electricity, hotwater, chilledwater, steam],\n                    layout=go.Layout(\n                        title=dict(\n                            text=f'Energy for building {building.value}'\n                        ),\n                        xaxis=go.layout.XAxis(\n                                rangeselector=dict(\n                                    buttons=list([\n                                        dict(count=7,\n                                             label=\"1w\",\n                                             step=\"day\",\n                                             stepmode=\"backward\"),\n                                        dict(count=1,\n                                             label=\"1m\",\n                                             step=\"month\",\n                                             stepmode=\"backward\"),\n                                        dict(count=3,\n                                             label=\"3m\",\n                                             step=\"month\",\n                                             stepmode=\"backward\"),\n                                        dict(count=6,\n                                             label=\"6m\",\n                                             step=\"month\",\n                                             stepmode=\"backward\"),\n                                        dict(step=\"all\")\n                                    ])\n                                ),\n                                rangeslider=dict(\n                                    visible=True\n                                ),\n                                type=\"date\"\n                            ),\n                        height=800\n                    )\n                   )\n\ndef validate():\n    if 0 <= building.value <= 1448:\n        return True\n    else:\n        return False\n\n    \ndef response(change):\n    if validate():\n        \n        refresh.button_style = 'warning'\n        electricity_ts = get_data(building.value, 'electricity', 'timestamp')\n        electricity_reading = get_data(building.value, 'electricity', 'meter_reading')\n        hotwater_ts = get_data(building.value, 'hotwater', 'timestamp')\n        hotwater_reading = get_data(building.value, 'hotwater', 'meter_reading')\n        chilledwater_ts = get_data(building.value, 'chilledwater', 'timestamp')\n        chilledwater_reading = get_data(building.value, 'chilledwater', 'meter_reading')\n        steam_ts = get_data(building.value, 'steam', 'timestamp')\n        steam_reading = get_data(building.value, 'steam', 'meter_reading')\n        with g.batch_update():\n            g.layout.title.text = f'Energy for building {building.value}'\n            g.data[0].x = electricity_ts\n            g.data[0].y = electricity_reading\n            g.data[1].x = hotwater_ts\n            g.data[1].y = hotwater_reading\n            g.data[2].x = chilledwater_ts\n            g.data[2].y = chilledwater_reading\n            g.data[3].x = steam_ts\n            g.data[3].y = steam_reading\n        zero_nan = pd.DataFrame(columns=['Energy aspect', 'Zero count', 'NaN count'])\n        if len(electricity_ts) > 0:\n            zero_nan = zero_nan.append({'Energy aspect': 'Electricity',\n                                        'Zero count': (electricity_reading == 0).sum(),\n                                        'NaN count': 366 * 24 - len(electricity_ts)},\n                                       ignore_index=True)\n        if len(hotwater_ts) > 0:\n            zero_nan = zero_nan.append({'Energy aspect': 'Hot water',\n                                        'Zero count': (hotwater_reading == 0).sum(),\n                                        'NaN count': 366 * 24 - len(hotwater_ts)},\n                                       ignore_index=True)\n        if len(chilledwater_ts) > 0:\n            zero_nan = zero_nan.append({'Energy aspect': 'Chilled water ',\n                                        'Zero count': (chilledwater_reading == 0).sum(),\n                                        'NaN count': 366 * 24 - len(chilledwater_ts)},\n                                       ignore_index=True)\n        if len(steam_ts) > 0:\n            zero_nan = zero_nan.append({'Energy aspect': 'Steam ',\n                                        'Zero count': (steam_reading == 0).sum(),\n                                        'NaN count': 366 * 24 - len(steam_ts)},\n                                       ignore_index=True)\n        results.value = f\"{zero_nan.style.hide_index().set_table_attributes('class=''table''').render()}\"            \n        refresh.button_style = 'info'\n\nbuilding.observe(response, names='value')\nrefresh.observe(response, names='value')\n\nresponse('refresh')\n\ncontrol = widgets.HBox([building, refresh])\nwidgets.VBox([control,\n             g,\n             results])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"markdown","source":"I hope you liked this notebook, and I recommend you to visit and vote my other ASHRAE notebooks:\n\n- [ASHRAE - Outliers](https://www.kaggle.com/juanmah/ashrae-outliers)\n- [ASHRAE - Zeros](https://www.kaggle.com/juanmah/ashrae-zeros)\n- [ASHRAE - NaNs & gaps](https://www.kaggle.com/juanmah/ashrae-nans-gaps)"}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":1}