{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":53666,"databundleVersionId":6589269,"sourceType":"competition"},{"sourceId":6994598,"sourceType":"datasetVersion","datasetId":4020432}],"dockerImageVersionId":30579,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport matplotlib.pyplot as plt","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-11-16T00:38:16.895886Z","iopub.execute_input":"2023-11-16T00:38:16.896652Z","iopub.status.idle":"2023-11-16T00:38:17.3472Z","shell.execute_reply.started":"2023-11-16T00:38:16.89661Z","shell.execute_reply":"2023-11-16T00:38:17.346032Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_series_path = \"/kaggle/input/child-mind-institute-detect-sleep-states/train_series.parquet\"\ntrain_series = pd.read_parquet(train_series_path)","metadata":{"execution":{"iopub.status.busy":"2023-11-16T00:38:17.3495Z","iopub.execute_input":"2023-11-16T00:38:17.350167Z","iopub.status.idle":"2023-11-16T00:39:10.607642Z","shell.execute_reply.started":"2023-11-16T00:38:17.35012Z","shell.execute_reply":"2023-11-16T00:39:10.606428Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_path = \"/kaggle/input/child-mind-institute-detect-sleep-states/train_events.csv\"\ntrain_df = pd.read_csv(train_path)","metadata":{"execution":{"iopub.status.busy":"2023-11-16T00:39:10.609119Z","iopub.execute_input":"2023-11-16T00:39:10.609478Z","iopub.status.idle":"2023-11-16T00:39:10.648738Z","shell.execute_reply.started":"2023-11-16T00:39:10.609445Z","shell.execute_reply":"2023-11-16T00:39:10.647367Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_series_path = \"/kaggle/input/child-mind-institute-detect-sleep-states/test_series.parquet\"\ntest_series = pd.read_parquet(test_series_path)","metadata":{"execution":{"iopub.status.busy":"2023-11-16T00:39:10.65183Z","iopub.execute_input":"2023-11-16T00:39:10.6537Z","iopub.status.idle":"2023-11-16T00:39:10.664715Z","shell.execute_reply.started":"2023-11-16T00:39:10.65366Z","shell.execute_reply":"2023-11-16T00:39:10.663906Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submit_path = \"/kaggle/input/child-mind-institute-detect-sleep-states/sample_submission.csv\"\nsubmit_df = pd.read_csv(submit_path)","metadata":{"execution":{"iopub.status.busy":"2023-11-16T00:39:10.666658Z","iopub.execute_input":"2023-11-16T00:39:10.667173Z","iopub.status.idle":"2023-11-16T00:39:10.677159Z","shell.execute_reply.started":"2023-11-16T00:39:10.667134Z","shell.execute_reply":"2023-11-16T00:39:10.676172Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_series_ids = train_series['series_id'].unique()","metadata":{"execution":{"iopub.status.busy":"2023-11-16T00:39:10.678301Z","iopub.execute_input":"2023-11-16T00:39:10.678693Z","iopub.status.idle":"2023-11-16T00:39:22.405704Z","shell.execute_reply.started":"2023-11-16T00:39:10.678654Z","shell.execute_reply":"2023-11-16T00:39:22.4044Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import datetime\n\nexp_period = '1MIN'\nexp_range_min = 5\n\n_xs = {}\n_ys = {}\nfor series_id in train_series_ids:\n    print(series_id)\n    \n    _train_series = train_series[train_series['series_id']==series_id]\n    _train_df = _train_series[['anglez', 'enmo']]\n    _train_df.index = pd.to_datetime(_train_series['timestamp'], utc=True)\n    _train_df = _train_df.resample(exp_period).mean()\n    \n    _train_event = train_df[train_df['series_id']==series_id].dropna(how='any')\n    _train_event.index = pd.to_datetime(_train_event['timestamp'], utc=True)\n\n    for _event_time, _step in zip(_train_event.index, _train_event['step']):\n        _time_list = pd.date_range(\n            start=_event_time.round(exp_period) + datetime.timedelta(minutes=-exp_range_min), \n            end=_event_time.round(exp_period) + datetime.timedelta(minutes=exp_range_min), \n            freq=exp_period, tz='UTC')\n        \n        _x = {}\n        for _i, _time in enumerate(_time_list):\n            _d = _train_df.loc[_time].to_dict() if _time in _train_df.index else {'anglez': float('nan'), 'enmo': float('nan')}\n            _x.update({_k+str(_i): _v for _k, _v in _d.items()})\n        \n        _xs[(series_id, _step)] = _x\n        _ys[(series_id, _step)] = {'event': 0 if _train_event.loc[_event_time]['event']=='onset' else 1}","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_series_ids = test_series['series_id'].unique()\n\ntest_period = '1MIN' if len(test_series) < 500 else '30MIN'\n\n_test_xs = {}\nfor series_id in test_series_ids:\n    print(series_id)\n    \n    _test_series = test_series[test_series['series_id']==series_id]\n    _test_df = _test_series[['step', 'anglez', 'enmo']]\n    _test_df.index = pd.to_datetime(_test_series['timestamp'], utc=True)\n    _test_df = _test_df.resample(exp_period).mean()\n    _test_df.loc[:, 'step'] = _test_df['step'].astype('int')\n    \n    _event_time_list = pd.date_range(\n            start=_test_df.index.min(), \n            end=_test_df.index.max(), \n            freq=test_period, tz='UTC')\n    \n    for _event_time in _event_time_list:\n        _step = _test_df.loc[_event_time, 'step']\n        _time_list = pd.date_range(\n            start=_event_time.round(exp_period) + datetime.timedelta(minutes=-exp_range_min), \n            end=_event_time.round(exp_period) + datetime.timedelta(minutes=exp_range_min), \n            freq=exp_period, tz='UTC')\n        \n        _test_x = {}\n        for _i, _time in enumerate(_time_list):\n            _d = _test_df.loc[_time, ['anglez', 'enmo']].to_dict() if _time in _test_df.index else {'anglez': float('nan'), 'enmo': float('nan')}\n            _test_x.update({_k+str(_i): _v for _k, _v in _d.items()})\n        \n        _test_xs[(series_id, _step)] = _test_x","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_df = pd.DataFrame(_ys).T\ny_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_df = pd.DataFrame(_xs).T\nprint(x_df.columns)\nx_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_x_df = pd.DataFrame(_test_xs).T\nprint(test_x_df.columns)\ntest_x_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"nan_index = x_df.isnull().any(axis=1)\n\n_x_df = x_df[~nan_index]\n_y_df = y_df[~nan_index]\n\nfrom sklearn.ensemble import RandomForestRegressor\n\nclf = RandomForestRegressor(random_state=123)\nclf.fit(_x_df, _y_df)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"nan_index = test_x_df.isnull().any(axis=1)\n_test_x_df = test_x_df[~nan_index]\n_test_predict = clf.predict(_test_x_df)\n_test_predict","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"_submission = []\nfor _i, (_p, (series_id, _step)) in enumerate(zip(_test_predict, _test_x_df.index)):\n    print(_p)\n    print(series_id)\n    print( _step)\n    if _p < 0.5:\n        _event = 'onset'\n        _score = (0.5-_p)*2 if (0.5-_p)*2>0 else 0.\n    else:\n        _event = 'wakeup'\n        _score = (_p-0.5)*2 if (_p-0.5)*2<1 else 1.\n        \n    _submission.append(\n        {\n            'row_id': _i,\n            'series_id': series_id,\n            'step': _step,\n            'event': _event,\n            'score': _score\n        }\n    ) ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.DataFrame(_submission)\nsubmission","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = submission.loc[submission.groupby([\"series_id\", \"event\"])[\"score\"].idxmax(), :]\nsubmission = submission.sort_values('row_id')\nsubmission['row_id'] = list(range(len(submission)))\n\nsubmission","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv', index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}