{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.12"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":93783,"databundleVersionId":11331308,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false},"papermill":{"default_parameters":{},"duration":893.676438,"end_time":"2025-03-10T09:59:46.266236","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2025-03-10T09:44:52.589798","version":"2.6.0"}},"nbformat_minor":4,"nbformat":4,"cells":[{"id":"e2486fc2","cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","execution":{"iopub.execute_input":"2025-03-10T09:44:55.494410Z","iopub.status.busy":"2025-03-10T09:44:55.493953Z","iopub.status.idle":"2025-03-10T09:44:56.469031Z","shell.execute_reply":"2025-03-10T09:44:56.467866Z"},"papermill":{"duration":0.981695,"end_time":"2025-03-10T09:44:56.470999","exception":false,"start_time":"2025-03-10T09:44:55.489304","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"74b1ade1","cell_type":"code","source":"# Install and import the PyOD package\nimport subprocess\nimport sys\n\nsubprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"pyod==1.1.2\"])\n\nfrom pyod.models.iforest import IForest","metadata":{"execution":{"iopub.execute_input":"2025-03-10T09:44:56.478980Z","iopub.status.busy":"2025-03-10T09:44:56.478448Z","iopub.status.idle":"2025-03-10T09:45:09.130517Z","shell.execute_reply":"2025-03-10T09:45:09.129356Z"},"papermill":{"duration":12.658198,"end_time":"2025-03-10T09:45:09.132826","exception":false,"start_time":"2025-03-10T09:44:56.474628","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"e5047ee5","cell_type":"code","source":"# Load channels 41-46 and ground truth from the training set\nchannel_names = [f\"channel_{x}\" for x in range(41,46 + 1)]\ncolumns_to_load = [\"id\"] + channel_names + [\"is_anomaly\"]\ntrain_df = pd.read_parquet(\"/kaggle/input/esa-adb-challenge/train.parquet\", columns=columns_to_load)\ntrain_df","metadata":{"execution":{"iopub.execute_input":"2025-03-10T09:45:09.140423Z","iopub.status.busy":"2025-03-10T09:45:09.139880Z","iopub.status.idle":"2025-03-10T09:45:12.216678Z","shell.execute_reply":"2025-03-10T09:45:12.215512Z"},"papermill":{"duration":3.08271,"end_time":"2025-03-10T09:45:12.218651","exception":false,"start_time":"2025-03-10T09:45:09.135941","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"0d40b07c","cell_type":"code","source":"# Estimate anomaly contamination based on the training set\ncontamination = train_df[\"is_anomaly\"].sum() / len(train_df)\ncontamination","metadata":{"execution":{"iopub.execute_input":"2025-03-10T09:45:12.226773Z","iopub.status.busy":"2025-03-10T09:45:12.226355Z","iopub.status.idle":"2025-03-10T09:45:12.259579Z","shell.execute_reply":"2025-03-10T09:45:12.258435Z"},"papermill":{"duration":0.039463,"end_time":"2025-03-10T09:45:12.261599","exception":false,"start_time":"2025-03-10T09:45:12.222136","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"d8070857","cell_type":"code","source":"# Fit the iForest model (this can take several minutes)\niforest = IForest(contamination=contamination, random_state=42)\niforest.fit(train_df.loc[:, channel_names].values)","metadata":{"execution":{"iopub.execute_input":"2025-03-10T09:45:12.270173Z","iopub.status.busy":"2025-03-10T09:45:12.269758Z","iopub.status.idle":"2025-03-10T09:59:29.461874Z","shell.execute_reply":"2025-03-10T09:59:29.460816Z"},"papermill":{"duration":857.200894,"end_time":"2025-03-10T09:59:29.466052","exception":false,"start_time":"2025-03-10T09:45:12.265158","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"88b4bdf5","cell_type":"code","source":"# Load test set\ntest_df = pd.read_parquet(\"/kaggle/input/esa-adb-challenge/test.parquet\", columns=[\"id\"] + channel_names)\ntest_df","metadata":{"execution":{"iopub.execute_input":"2025-03-10T09:59:29.474697Z","iopub.status.busy":"2025-03-10T09:59:29.474299Z","iopub.status.idle":"2025-03-10T09:59:29.661303Z","shell.execute_reply":"2025-03-10T09:59:29.660103Z"},"papermill":{"duration":0.193754,"end_time":"2025-03-10T09:59:29.663325","exception":false,"start_time":"2025-03-10T09:59:29.469571","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"5a9e34b1","cell_type":"code","source":"# Run iForest on the test set\ndetections = iforest.predict(test_df.loc[:, channel_names].values)\ndetections","metadata":{"execution":{"iopub.execute_input":"2025-03-10T09:59:29.671989Z","iopub.status.busy":"2025-03-10T09:59:29.671609Z","iopub.status.idle":"2025-03-10T09:59:40.910776Z","shell.execute_reply":"2025-03-10T09:59:40.909123Z"},"papermill":{"duration":11.245949,"end_time":"2025-03-10T09:59:40.913052","exception":false,"start_time":"2025-03-10T09:59:29.667103","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"98aff5f2","cell_type":"code","source":"# Save to submission file\nsubmission_df = pd.DataFrame(columns=[\"id\", \"is_anomaly\"])\nsubmission_df[\"id\"] = test_df[\"id\"]\nsubmission_df[\"is_anomaly\"] = detections\nsubmission_df.to_parquet(f\"/kaggle/working/iForest-channels41-46.parquet\")\n# Generate a file supported by the Kaggle \"Submit to competition\" option\nsubmission_df.to_csv(f\"/kaggle/working/submission.csv\", index=False)","metadata":{"execution":{"iopub.execute_input":"2025-03-10T09:59:40.925265Z","iopub.status.busy":"2025-03-10T09:59:40.924884Z","iopub.status.idle":"2025-03-10T09:59:41.458667Z","shell.execute_reply":"2025-03-10T09:59:41.457635Z"},"papermill":{"duration":0.54171,"end_time":"2025-03-10T09:59:41.460678","exception":false,"start_time":"2025-03-10T09:59:40.918968","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"0005928e","cell_type":"code","source":"submission_df.plot(\"id\", \"is_anomaly\")","metadata":{"execution":{"iopub.execute_input":"2025-03-10T09:59:41.470000Z","iopub.status.busy":"2025-03-10T09:59:41.469601Z","iopub.status.idle":"2025-03-10T09:59:45.337330Z","shell.execute_reply":"2025-03-10T09:59:45.336240Z"},"papermill":{"duration":3.874288,"end_time":"2025-03-10T09:59:45.339065","exception":false,"start_time":"2025-03-10T09:59:41.464777","status":"completed"},"tags":[]},"outputs":[],"execution_count":null}]}