{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom glob import glob\nimport json\n\nimport matplotlib.pyplot as plt\n%matplotlib inline\nimport seaborn as sns\nsns.set()\nfrom tqdm.notebook import tqdm as tqdm\n\nimport plotly.graph_objs as go\nfrom PIL import Image\n\nimport sys\nsys.path.append('../input/indoor-locationnavigation-2021/indoor-location-competition-20-master')\nfrom io_f import read_data_file\nfrom main import calibrate_magnetic_wifi_ibeacon_to_position\nfrom main import extract_wifi_count","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"TRAIN_DIR = '../input/indoor-location-navigation/train'\nMETA_DIR = '../input/indoor-location-navigation/metadata'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_all_building_id():\n    return sorted(list(map(lambda x: x.split('/')[-1], glob(f'{META_DIR}/*'))))\n\ndef get_all_building_floor():\n    all_building_floor = {}\n    all_building_id = get_all_building_id()\n    for building_id in all_building_id:\n        all_building_floor[building_id] = sorted(list(map(lambda x: x.split('/')[-1], glob(f'{META_DIR}/{building_id}/*'))))\n    return all_building_floor\n\ndef get_all_building_floor_df():\n    all_building_floor = get_all_building_floor()\n    df = pd.DataFrame.from_dict(all_building_floor, orient='index')\n    df = df.unstack().dropna().sort_index(level=1).reset_index(drop=False).drop(columns=['level_0'])\n    df = df.rename(columns={'level_1': 'building_id', 0: 'floor'})\n    return df\n\nbuiding_df = get_all_building_floor_df()\nbuiding_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def plot_all_wifi_count_in_floor(building_id, floor_id):\n    trace_paths = glob(f'{TRAIN_DIR}/{building_id}/{floor_id}/*')\n\n    heat_positions = []\n    heat_values = []\n    for trace_path in tqdm(trace_paths):\n        try:\n            mwi_datas = calibrate_magnetic_wifi_ibeacon_to_position([trace_path])\n\n            wifi_counts = extract_wifi_count(mwi_datas)\n            heat_positions_sub = np.array(list(wifi_counts.keys()))\n            heat_values_sub = np.array(list(wifi_counts.values()))\n            # filter out positions that no wifi detected\n            mask = heat_values_sub != 0\n            heat_positions_sub = heat_positions_sub[mask]\n            heat_values_sub = heat_values_sub[mask]\n\n            heat_positions.extend(list(heat_positions_sub))\n            heat_values.extend(heat_values_sub)\n        except Exception as e:\n            print (f'** ERROR in {trace_path}: {e}')\n\n\n    fig = go.Figure()\n\n    floor_plan_filename = f'{META_DIR}/{building_id}/{floor_id}/floor_image.png'\n\n    # Prepare width_meter & height_meter\n    ### (taken from the .json file)\n    json_plan_filename = f'{META_DIR}/{building_id}/{floor_id}/floor_info.json'\n    with open(json_plan_filename) as json_file:\n        json_data = json.load(json_file)\n\n    width_meter = json_data[\"map_info\"][\"width\"]\n    height_meter = json_data[\"map_info\"][\"height\"]\n\n    position = np.array(heat_positions)\n    value = heat_values\n    floor_plan_filename = floor_plan_filename\n    width_meter = width_meter\n    height_meter = height_meter\n    colorbar_title=\"colorbar\"\n    title=f'{building_id}_{floor_id}'\n    show=False\n    g_size=700\n    colorscale=\"Rainbow\"\n\n    # add heat map\n    fig.add_trace(\n        go.Scatter(x=position[:, 0],\n                   y=position[:, 1],\n                   mode='markers',\n                   marker=dict(size=7,\n                               color=value,\n                               colorbar=dict(title=colorbar_title),\n                               colorscale=colorscale),\n                   text=value,\n                   name=title))\n\n    # add floor plan\n    floor_plan = Image.open(floor_plan_filename)\n    fig.update_layout(images=[\n        go.layout.Image(\n            source=floor_plan,\n            xref=\"x\",\n            yref=\"y\",\n            x=0,\n            y=height_meter,\n            sizex=width_meter,\n            sizey=height_meter,\n            sizing=\"contain\",\n            opacity=1,\n            layer=\"below\",\n        )\n    ])\n\n    # configure\n    fig.update_xaxes(autorange=False, range=[0, width_meter])\n    fig.update_yaxes(autorange=False, range=[0, height_meter], scaleanchor=\"x\", scaleratio=1)\n    fig.update_layout(\n        title=go.layout.Title(\n            text=title or \"No title.\",\n            xref=\"paper\",\n            x=0,\n        ),\n        autosize=True,\n        width=g_size,\n        height=200 + g_size * height_meter / width_meter,\n        template=\"plotly_white\",\n    )\n    \n    fig.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for building_id, floor_id in buiding_df[['building_id', 'floor']].values[:10]:\n    plot_all_wifi_count_in_floor(building_id, floor_id)","execution_count":null,"outputs":[]}],"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":4}