{"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":"code","source":"import time\nimport numpy as np\nimport pandas as pd\nfrom sklearn.linear_model import LogisticRegression\n\nimport warnings\nwarnings.simplefilter(\"ignore\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Moving Correlation\n\n# boolean indexes without lower triangular components\ntriu = np.triu(np.ones((32, 32), bool), 1)\n\ndef moving_corr(x, window_size=256, stride=128, n_window=3):\n    N = len(x)\n    # correlations\n    r = np.array([np.corrcoef(x[max(0, i-window_size):i].T)[triu].flatten() for i in range(1, 1+N)])\n    r = np.nan_to_num(r)\n    # flattened moving correlations\n    return r[[[max(0, i-window*stride) for window in range(n_window)] for i in range(N)]].reshape(N, -1)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n# load data for each subject\nxs_tr = [[pd.read_csv(f\"../data/train/subj{subj}_series{series}_data.csv\",   index_col=0).values for series in range(1, 9)] for subj in range(1, 13)]\nys_tr = [[pd.read_csv(f\"../data/train/subj{subj}_series{series}_events.csv\", index_col=0).values for series in range(1, 9)] for subj in range(1, 13)]\nxs_te = [[pd.read_csv(f\"../data/test/subj{subj}_series{series}_data.csv\",    index_col=0).values for series in (9, 10)]     for subj in range(1, 13)]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# fitting & prediction\n\nlr = LogisticRegression(max_iter=1000)\nwindow_size = 256\ndownsample = 50\n\npreds = []\nfor subject, (x_tr, y_tr, x_te) in enumerate(zip(xs_tr, ys_tr, xs_te), 1):\n    start = time.time()\n\n    # concatenate train data & calcurate moving correlations\n    x_tr = moving_corr(np.concatenate(x_tr), window_size)[::downsample]\n    y_tr = np.concatenate(y_tr)[::downsample]\n    x_te = [moving_corr(x) for x in x_te]\n    print(f\"subject {subject} (preprocess: {time.time()-start:.2f} s)\", end=\"\")\n\n    # fit & predict for each event\n    p_te = []\n    for event in range(6):\n        lr.fit(x_tr, y_tr[:, event])\n        p_te.append(lr.predict_proba(x_te[0])[:, 1])    # series 9\n        p_te.append(lr.predict_proba(x_te[1])[:, 1])    # series 10\n        print(end=\".\")\n    preds.append(np.array(p_te[0::2]).T)    # series 9\n    preds.append(np.array(p_te[1::2]).T)    # series 10\n    \n    print(f\"complete ({time.time()-start:.2f} s).\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# submission\ndf_pred = pd.read_csv(\"../data/sample_submission.csv\", index_col=0)\ndf_pred[:] = np.concatenate([*preds[0::2], *preds[1::2]])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_pred","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_pred.round().sum()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# prediction\ndf_pred[:20000].plot(figsize=(15, 5))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_pred.to_csv(\"../data/moving_corr_submission.csv\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}