{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":102335,"databundleVersionId":12518947,"sourceType":"competition"},{"sourceId":244908051,"sourceType":"kernelVersion"},{"sourceId":246330900,"sourceType":"kernelVersion"}],"dockerImageVersionId":31040,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# This is the inference notebook, if you want the training notebook...\n\nMy training notebook is at [CMI 2025 - Training](https://www.kaggle.com/code/coreymichaud/cmi-2025-training)","metadata":{}},{"cell_type":"code","source":"# Libraries\nimport os\nimport pandas as pd\nimport polars as pl\nimport numpy as np\nimport joblib\nimport kaggle_evaluation.cmi_inference_server","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-06-19T12:31:49.271980Z","iopub.execute_input":"2025-06-19T12:31:49.272183Z","iopub.status.idle":"2025-06-19T12:31:52.347212Z","shell.execute_reply.started":"2025-06-19T12:31:49.272167Z","shell.execute_reply":"2025-06-19T12:31:52.346388Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Loading model pipeline\n#pipe = joblib.load('/kaggle/input/cmi-2025-training/pipeline.pkl')\npipe = joblib.load('/kaggle/input/testing-xgb-with-wandb/pipeline.pkl')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-19T12:31:52.348797Z","iopub.execute_input":"2025-06-19T12:31:52.349202Z","iopub.status.idle":"2025-06-19T12:31:53.702518Z","shell.execute_reply.started":"2025-06-19T12:31:52.349176Z","shell.execute_reply":"2025-06-19T12:31:53.701768Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Loading label encoder\n#le = joblib.load('/kaggle/input/cmi-2025-training/label_encoder.pkl')\nle = joblib.load('/kaggle/input/testing-xgb-with-wandb/label_encoder.pkl')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-19T12:32:24.875239Z","iopub.execute_input":"2025-06-19T12:32:24.875507Z","iopub.status.idle":"2025-06-19T12:32:24.883686Z","shell.execute_reply.started":"2025-06-19T12:32:24.875487Z","shell.execute_reply":"2025-06-19T12:32:24.883143Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Getting orientation, thermopile, and time-of-flight column names\nacc_cols = [f'acc_{axis}' for axis in ['x', 'y', 'z']]\nrot_cols = [f'rot_{axis}' for axis in ['w', 'x', 'y', 'z']]\nthm_cols = [f'thm_{i}' for i in range(1, 6)]\ntof_cols = [f'tof_{i}_v{j}' for i in range(1, 6) for j in range(64)]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-19T12:32:26.948225Z","iopub.execute_input":"2025-06-19T12:32:26.948811Z","iopub.status.idle":"2025-06-19T12:32:26.953128Z","shell.execute_reply.started":"2025-06-19T12:32:26.948786Z","shell.execute_reply":"2025-06-19T12:32:26.952289Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Function for merging sequence and demographics, creating summary statistics, and grouping by sequence_id\ndef seq_to_row(sequence, demographics):\n    \n    # Merging sequence and demographics data\n    df = pd.merge(sequence, demographics, on = \"subject\", how = \"left\")\n\n    # Getting column names of sequence_id plus the sensor data\n    cols = ['sequence_id'] + acc_cols + rot_cols + thm_cols + tof_cols\n\n    # Getting summary statistics\n    summary = (df[cols].groupby('sequence_id').agg(['mean', 'std', 'min', 'max', 'median']))\n\n    # Flattening rows\n    summary.columns = ['_'.join(col).strip() for col in summary.columns.values]\n\n    # Making sequence_id into a row again\n    summary = summary.reset_index()\n\n    # Getting remaining rows\n    remaining = df.drop_duplicates('sequence_id')\n\n    # Merging the summary statistics with the other columns\n    df = pd.merge(remaining, summary, on = \"sequence_id\", how = \"left\")\n\n    return df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-19T12:32:28.631014Z","iopub.execute_input":"2025-06-19T12:32:28.631280Z","iopub.status.idle":"2025-06-19T12:32:28.636373Z","shell.execute_reply.started":"2025-06-19T12:32:28.631261Z","shell.execute_reply":"2025-06-19T12:32:28.635691Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Prediction\ndef predict(sequence: pl.DataFrame, demographics: pl.DataFrame) -> str:\n\n    # Converting the parameters to pandas\n    seq_df = sequence.to_pandas()\n    dem_df = demographics.to_pandas()\n\n    # Merging datasets and converting sequences into flattened rows\n    X = seq_to_row(seq_df, dem_df)\n\n    # Predicting\n    y_pred = pipe.predict(X)\n\n    # Converting label encoding back into a string\n    pred = le.inverse_transform(y_pred)[0]\n    \n    return pred","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-19T12:32:30.653945Z","iopub.execute_input":"2025-06-19T12:32:30.654500Z","iopub.status.idle":"2025-06-19T12:32:30.658424Z","shell.execute_reply.started":"2025-06-19T12:32:30.654479Z","shell.execute_reply":"2025-06-19T12:32:30.657736Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Connecting to evaluation API\ninference_server = kaggle_evaluation.cmi_inference_server.CMIInferenceServer(predict)\n\nif os.getenv('KAGGLE_IS_COMPETITION_RERUN'):\n    inference_server.serve()\nelse:\n    inference_server.run_local_gateway(\n        data_paths=(\n            '/kaggle/input/cmi-detect-behavior-with-sensor-data/test.csv',\n            '/kaggle/input/cmi-detect-behavior-with-sensor-data/test_demographics.csv',\n        )\n    )","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-19T12:32:32.651388Z","iopub.execute_input":"2025-06-19T12:32:32.651952Z","iopub.status.idle":"2025-06-19T12:32:34.836513Z","shell.execute_reply.started":"2025-06-19T12:32:32.651925Z","shell.execute_reply":"2025-06-19T12:32:34.835893Z"}},"outputs":[],"execution_count":null}]}