{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Geocene Trainset . View or Annotate time-series\n\n- Discussion topic: https://www.kaggle.com/competitions/child-mind-institute-detect-sleep-states/discussion/446679\n- Web application: https://trainset.geocene.com/\n- Source code: https://github.com/Geocene/trainset","metadata":{}},{"cell_type":"code","source":"import datetime\n\nimport polars as pl\nimport pandas as pd","metadata":{"execution":{"iopub.status.busy":"2023-10-12T15:49:41.110240Z","iopub.execute_input":"2023-10-12T15:49:41.110526Z","iopub.status.idle":"2023-10-12T15:49:41.518306Z","shell.execute_reply.started":"2023-10-12T15:49:41.110498Z","shell.execute_reply":"2023-10-12T15:49:41.517489Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_series_df = pl.read_parquet('/kaggle/input/child-mind-institute-detect-sleep-states/train_series.parquet')\ntrain_events_df = pd.read_csv('/kaggle/input/child-mind-institute-detect-sleep-states/train_events.csv')","metadata":{"execution":{"iopub.status.busy":"2023-10-12T15:49:41.519419Z","iopub.execute_input":"2023-10-12T15:49:41.520015Z","iopub.status.idle":"2023-10-12T15:49:59.086364Z","shell.execute_reply.started":"2023-10-12T15:49:41.519987Z","shell.execute_reply":"2023-10-12T15:49:59.085490Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"series_ids = train_series_df['series_id'].unique().to_list()\nlen(series_ids), series_ids[:3]","metadata":{"execution":{"iopub.status.busy":"2023-10-12T15:49:59.087767Z","iopub.execute_input":"2023-10-12T15:49:59.088670Z","iopub.status.idle":"2023-10-12T15:50:01.375036Z","shell.execute_reply.started":"2023-10-12T15:49:59.088632Z","shell.execute_reply":"2023-10-12T15:50:01.373902Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Take the first series ID.\nseries_id = series_ids[0]\nmetric = 'anglez'\n\n# Filter out events for one series.\nsample_series_df = train_series_df.filter(pl.col('series_id') == series_id).to_pandas()\n\n# Convert timestamp from a string to a datetime and keep only the samples with second equal to zero, rounding to the nearest minute.\nsample_series_df['timestamp'] = sample_series_df['timestamp'].apply(lambda x: datetime.datetime.strptime(x, '%Y-%m-%dT%H:%M:%S%z'))\nsample_series_df['second'] = sample_series_df['timestamp'].apply(lambda x: x.second)\nsample_series_df = sample_series_df[sample_series_df['second'] == 0].reset_index(drop=True)\n\n# Only one metric can be visualized at a time on trainset.\nsample_series_df['value'] = sample_series_df[metric]\n\n# Merge event dataset to get the annotations.\nsample_series_df = pd.merge(sample_series_df, train_events_df[['series_id', 'step', 'event']], on=['series_id', 'step'], how='left')\nsample_series_df['event'] = sample_series_df['event'].fillna('')\n\nprint(sample_series_df.shape)\nsample_series_df.head(3)","metadata":{"execution":{"iopub.status.busy":"2023-10-12T15:50:01.378813Z","iopub.execute_input":"2023-10-12T15:50:01.379106Z","iopub.status.idle":"2023-10-12T15:50:12.363406Z","shell.execute_reply.started":"2023-10-12T15:50:01.379082Z","shell.execute_reply":"2023-10-12T15:50:12.362315Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Rename the columns to get the format as required by trainset.\ncolumns = ['series_id', 'timestamp', 'value', 'event']\nfinal_series_df = sample_series_df[columns].rename(columns={'event': 'label', 'series_id': 'series'}).copy(deep=True)\n\n# Convert value in timestamp column into ISO 8601 format.\nfinal_series_df['timestamp'] = final_series_df['timestamp'].apply(lambda x: x.isoformat())\nfinal_series_df.to_csv(f'{series_id}-{metric}.csv', index=False)\n\nprint(final_series_df.shape)\nfinal_series_df.head(3)","metadata":{"execution":{"iopub.status.busy":"2023-10-12T15:50:12.364599Z","iopub.execute_input":"2023-10-12T15:50:12.364940Z","iopub.status.idle":"2023-10-12T15:50:12.687241Z","shell.execute_reply.started":"2023-10-12T15:50:12.364911Z","shell.execute_reply":"2023-10-12T15:50:12.686101Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}