{"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":"nvidiaTeslaT4","dataSources":[{"sourceType":"competition","sourceId":102335,"databundleVersionId":12518947},{"sourceType":"kernelVersion","sourceId":247182816}],"dockerImageVersionId":31040,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport joblib\nimport pandas as pd\nimport polars as pl\n\n\nimport kaggle_evaluation.cmi_inference_server","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom sklearn.preprocessing import StandardScaler, LabelEncoder\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.base import BaseEstimator, TransformerMixin\nfrom sklearn.compose import ColumnTransformer\nfrom sklearn import tree \nfrom sklearn.naive_bayes import MultinomialNB,GaussianNB\nfrom sklearn.metrics import f1_score, classification_report\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.impute import KNNImputer\nfrom sklearn.model_selection import GridSearchCV , RandomizedSearchCV\nimport xgboost as xgb\nimport copy\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-24T17:38:02.086918Z","iopub.execute_input":"2025-06-24T17:38:02.087614Z","iopub.status.idle":"2025-06-24T17:38:03.222457Z","shell.execute_reply.started":"2025-06-24T17:38:02.087583Z","shell.execute_reply":"2025-06-24T17:38:03.221586Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class dropCols(BaseEstimator,TransformerMixin):\n    def fit(self,X_train,y_train):\n        return self\n    def transform(self,df):\n        cols = [\"row_id\",\"age\",\"subject\",\"sequence_id\"]\n        for col in df.columns:\n            if col in cols:\n                df = df.drop(col,axis=1)\n        return df  \nclass seqID_toStr (BaseEstimator,TransformerMixin):\n    def fit(self,x,y):\n        return self\n    def transform(self,df):\n        df = df.copy()\n        if (\"sequence_id\" in df.columns): #& (df[\"sequence_id\"].dtype != int):\n            #df[\"sequence_id\"] = df[\"sequence_id\"].str.replace(\"SEQ_\",\"\")\n            #df[\"sequence_id\"] = df[\"sequence_id\"].astype(\"category\")\n            df = df.drop([\"sequence_id\"],axis=1)\n        return df\nclass insertCols(BaseEstimator,TransformerMixin):\n    def fit(self,x,y):\n        return self\n    def transform(self,df):\n        if \"norm_acc\" not in df.columns:\n             df[\"norm_acc\"] = df[\"acc_x\"]**2 + df[\"acc_y\"]**2 + df[\"acc_z\"]**2\n        if \"norm_rot\" not in df.columns:\n            df[\"norm_rot\"] = df[\"rot_x\"]**2 + df[\"rot_y\"]**2 + df[\"rot_z\"]**2 + df[\"rot_w\"]**2\n        return df\nclass impute_df(BaseEstimator,TransformerMixin):\n    def fit(self,X,y):\n        return self\n    def transform(self,df):\n        arr = imputer.fit_transform(df)\n        df = pd.DataFrame(arr,columns= df.columns)\n        return df\nclass fill_na(BaseEstimator,TransformerMixin):\n    def fit(self,X,y):\n        return self\n    def transform(self,df):\n        df.iloc[0] = df.iloc[0].fillna(0)\n        df = df.interpolate(method = \"linear\",axis=1)\n        df = df.ffill(axis=1).bfill(axis=1)\n        return df\nclass failsafe_na(BaseEstimator,TransformerMixin):\n    def fit(self,X,y):\n        return self\n    def transform(self,X):\n        X = X.fillna(0)\n        return X\nclass debug(BaseEstimator,TransformerMixin):\n    def fit(self,X,y):\n        return self\n    def transform(self,X):\n        if \"sequence_id\" in X.columns:\n            print(X.columns)\n        return X\n            \n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-24T17:38:06.405128Z","iopub.execute_input":"2025-06-24T17:38:06.405866Z","iopub.status.idle":"2025-06-24T17:38:06.416600Z","shell.execute_reply.started":"2025-06-24T17:38:06.405835Z","shell.execute_reply":"2025-06-24T17:38:06.415635Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pipeline_validation = joblib.load(\"/kaggle/input/sarveshdt-cmi/pipeline_validation.pkl\")\nencoder_main = joblib.load(\"/kaggle/input/sarveshdt-cmi/encoder_main.pkl\")\nmodelXGB = joblib.load(\"/kaggle/input/sarveshdt-cmi/modelXGB.pkl\")\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-24T17:38:20.568100Z","iopub.execute_input":"2025-06-24T17:38:20.568848Z","iopub.status.idle":"2025-06-24T17:38:21.238819Z","shell.execute_reply.started":"2025-06-24T17:38:20.568823Z","shell.execute_reply":"2025-06-24T17:38:21.238254Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tqdm import tqdm\ndef fillna_test(df):\n    N_NEIGHBORS = 3\n    sensor_cols = [col for col in df.columns if col.startswith((\"acc\", \"rot\", \"thm\", \"tof\"))]\n    imputed_chunks = []\n    for seq_id, group in tqdm(df.groupby(\"sequence_id\")):\n        sensor_data = group[sensor_cols]\n        if sensor_data.isnull().all().any():\n            imputed_group=group.copy()\n            imputed_group[sensor_cols] = sensor_data.fillna(0)\n\n        elif len(group) < N_NEIGHBORS :\n            imputed_group = group.copy()\n            imputed_group[sensor_cols] = sensor_data.fillna(sensor_data.mode())\n        else:\n            imputer = KNNImputer(n_neighbors=N_NEIGHBORS, weights=\"distance\")\n            imputed_vals = imputer.fit_transform(sensor_data)\n            imputed_group = group.copy()\n            imputed_group[sensor_cols] = imputed_vals\n\n        imputed_chunks.append(imputed_group)\n    df_imputed = pd.concat(imputed_chunks).sort_values([\"sequence_id\", \"sequence_counter\"])\n    return df_imputed\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-24T17:38:24.112328Z","iopub.execute_input":"2025-06-24T17:38:24.113062Z","iopub.status.idle":"2025-06-24T17:38:24.125535Z","shell.execute_reply.started":"2025-06-24T17:38:24.113038Z","shell.execute_reply":"2025-06-24T17:38:24.124937Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def predict(sequence: pl.DataFrame, demographics: pl.DataFrame):\n    sequence = sequence.to_pandas()\n    demographics = demographics.to_pandas()\n\n    X_test=pd.merge(sequence,demographics,on='subject',how='left')\n    X_test = fillna_test(X_test)\n    X_test = X_test.fillna(0)\n    X_test = pipeline_validation.transform(X_test)\n    preds = encoder_main.inverse_transform(modelXGB.predict(X_test))\n    mode_pred = pd.Series(preds).mode()\n   \n    ans = mode_pred.iloc[0]\n    return str(ans)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-24T17:38:27.472180Z","iopub.execute_input":"2025-06-24T17:38:27.472473Z","iopub.status.idle":"2025-06-24T17:38:27.477441Z","shell.execute_reply.started":"2025-06-24T17:38:27.472450Z","shell.execute_reply":"2025-06-24T17:38:27.476701Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from kaggle_evaluation.cmi_inference_server import CMIInferenceServer\n\n# Wrap your predict function\ninference_server = CMIInferenceServer(predict)\n\n# Run local test or real submission\nif os.getenv('KAGGLE_IS_COMPETITION_RERUN'):\n    inference_server.serve()  # Runs on real submission\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-24T17:38:29.844762Z","iopub.execute_input":"2025-06-24T17:38:29.845045Z","iopub.status.idle":"2025-06-24T17:38:32.049232Z","shell.execute_reply.started":"2025-06-24T17:38:29.845024Z","shell.execute_reply":"2025-06-24T17:38:32.048573Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}