{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"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"},"colab":{"provenance":[],"gpuType":"T4","authorship_tag":"ABX9TyPwCE0J8XsHklnEJnWqyCrA"},"accelerator":"GPU","kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":96164,"databundleVersionId":11418275,"sourceType":"competition"}],"dockerImageVersionId":31041,"isInternetEnabled":true,"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\nimport seaborn as sns\nimport dask.dataframe as dd\nimport numpy as np","metadata":{"id":"ML1UJBcYwxLp","executionInfo":{"status":"ok","timestamp":1751287510001,"user_tz":-120,"elapsed":4300,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:51:03.881336Z","iopub.execute_input":"2025-07-01T20:51:03.882010Z","iopub.status.idle":"2025-07-01T20:51:08.029794Z","shell.execute_reply.started":"2025-07-01T20:51:03.881985Z","shell.execute_reply":"2025-07-01T20:51:08.029267Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"id":"A97_cj8gbH5t","executionInfo":{"status":"ok","timestamp":1751287505522,"user_tz":-120,"elapsed":7,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:55:13.711996Z","iopub.execute_input":"2025-07-01T20:55:13.712677Z","iopub.status.idle":"2025-07-01T20:55:13.715849Z","shell.execute_reply.started":"2025-07-01T20:55:13.712651Z","shell.execute_reply":"2025-07-01T20:55:13.715162Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Selected features based on correlation matrix","metadata":{"id":"Er5IhM1GGhet"}},{"cell_type":"code","source":"columns_to_read = ['bid_qty', 'ask_qty', 'buy_qty', 'sell_qty', 'volume', 'X21', 'X20', 'X28', 'X863', 'X29', 'X19', 'X27', 'X22', 'X858', 'X219', 'X860', 'X531', 'X287', 'X289', 'X291', 'X293', 'X857', 'X295', 'X598', 'X218',\n                    'X297', 'X298', 'X285', 'X300', 'X299', 'X302', 'X26', 'X292', 'X301', 'X294', 'X296', 'X303', 'X283', 'X30', 'X18', 'X465', 'X466', 'X181', 'X288', 'X290', 'label']","metadata":{"id":"AwfYV-sFiPe2","executionInfo":{"status":"ok","timestamp":1751287510018,"user_tz":-120,"elapsed":7,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:55:14.072324Z","iopub.execute_input":"2025-07-01T20:55:14.072536Z","iopub.status.idle":"2025-07-01T20:55:14.076969Z","shell.execute_reply.started":"2025-07-01T20:55:14.072519Z","shell.execute_reply":"2025-07-01T20:55:14.076171Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df = pd.read_parquet('../input/drw-crypto-market-prediction/train.parquet', columns=columns_to_read)","metadata":{"id":"1FtYE6EQgszW","executionInfo":{"status":"ok","timestamp":1751287537222,"user_tz":-120,"elapsed":27195,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:55:14.227952Z","iopub.execute_input":"2025-07-01T20:55:14.228151Z","iopub.status.idle":"2025-07-01T20:55:15.933432Z","shell.execute_reply.started":"2025-07-01T20:55:14.228135Z","shell.execute_reply":"2025-07-01T20:55:15.932603Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# df = pd.read_parquet('/content/drive/MyDrive/code/kaggle/DRW_Crypto_Market_Prediction/train.parquet')","metadata":{"id":"q7koi6XCb50p","executionInfo":{"status":"ok","timestamp":1751287537227,"user_tz":-120,"elapsed":100,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:55:15.934917Z","iopub.execute_input":"2025-07-01T20:55:15.935167Z","iopub.status.idle":"2025-07-01T20:55:15.938285Z","shell.execute_reply.started":"2025-07-01T20:55:15.935150Z","shell.execute_reply":"2025-07-01T20:55:15.937671Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# corr_matrix = df.corr()\n# target_corr = corr_matrix['label'].drop('label')\n# top_features = target_corr.abs().sort_values(ascending=False).head(40)\n# selected_columns = top_features.index.tolist()\n\n# df = df[selected_columns + ['label']]","metadata":{"id":"PLdNWydSb38u","executionInfo":{"status":"ok","timestamp":1751287537232,"user_tz":-120,"elapsed":66,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:55:15.938692Z","iopub.execute_input":"2025-07-01T20:55:15.938917Z","iopub.status.idle":"2025-07-01T20:55:15.954241Z","shell.execute_reply.started":"2025-07-01T20:55:15.938901Z","shell.execute_reply":"2025-07-01T20:55:15.953597Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# EDA","metadata":{"id":"rmc7WpZnvown"}},{"cell_type":"code","source":"df.shape","metadata":{"id":"S7Se_tiowY0r","executionInfo":{"status":"ok","timestamp":1751287537235,"user_tz":-120,"elapsed":51,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"d32870f8-0ceb-44f4-b018-6895de3906ef","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:55:15.955651Z","iopub.execute_input":"2025-07-01T20:55:15.955842Z","iopub.status.idle":"2025-07-01T20:55:15.971772Z","shell.execute_reply.started":"2025-07-01T20:55:15.955801Z","shell.execute_reply":"2025-07-01T20:55:15.971171Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df.head()","metadata":{"id":"7AzVl--KeNCZ","executionInfo":{"status":"ok","timestamp":1751287537255,"user_tz":-120,"elapsed":52,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"4e2bc8bd-ad26-46ee-a25f-811d81eb7310","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:55:15.972325Z","iopub.execute_input":"2025-07-01T20:55:15.972481Z","iopub.status.idle":"2025-07-01T20:55:16.017526Z","shell.execute_reply.started":"2025-07-01T20:55:15.972468Z","shell.execute_reply":"2025-07-01T20:55:16.016866Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df.index","metadata":{"id":"rXvtN8oNw6_3","executionInfo":{"status":"ok","timestamp":1751287537379,"user_tz":-120,"elapsed":23,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"eeaacdeb-c841-44fe-f52c-d3577871f1ee","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:55:17.491553Z","iopub.execute_input":"2025-07-01T20:55:17.492108Z","iopub.status.idle":"2025-07-01T20:55:17.508328Z","shell.execute_reply.started":"2025-07-01T20:55:17.492083Z","shell.execute_reply":"2025-07-01T20:55:17.507710Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df.info()","metadata":{"id":"G4GHfyRA3kK1","executionInfo":{"status":"ok","timestamp":1751287537417,"user_tz":-120,"elapsed":29,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"e2d43299-3041-4401-9ecd-864e19c5bd8e","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:55:17.696420Z","iopub.execute_input":"2025-07-01T20:55:17.696640Z","iopub.status.idle":"2025-07-01T20:55:17.795613Z","shell.execute_reply.started":"2025-07-01T20:55:17.696624Z","shell.execute_reply":"2025-07-01T20:55:17.794995Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df.describe()","metadata":{"id":"wusK6UUq3mgc","executionInfo":{"status":"ok","timestamp":1751287538101,"user_tz":-120,"elapsed":586,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"7d7b6a9b-db4a-45e7-d4b1-911094ed0364","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:55:17.855673Z","iopub.execute_input":"2025-07-01T20:55:17.855921Z","iopub.status.idle":"2025-07-01T20:55:18.618568Z","shell.execute_reply.started":"2025-07-01T20:55:17.855904Z","shell.execute_reply":"2025-07-01T20:55:18.617959Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Check for missing values","metadata":{"id":"3hEU0go6v-i8"}},{"cell_type":"code","source":"df.isna().sum()","metadata":{"id":"4zF-CLCPv-ZW","executionInfo":{"status":"ok","timestamp":1751287538136,"user_tz":-120,"elapsed":19,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"6420942c-9921-4c1e-9e10-9e9a150ea715","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:55:18.619607Z","iopub.execute_input":"2025-07-01T20:55:18.619875Z","iopub.status.idle":"2025-07-01T20:55:18.693111Z","shell.execute_reply.started":"2025-07-01T20:55:18.619858Z","shell.execute_reply":"2025-07-01T20:55:18.692520Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Detect outliers - boxplots + histplots with log scale","metadata":{"id":"lzD0T5FqwBO1"}},{"cell_type":"code","source":"plt.figure(figsize=(12, 5))\nsns.boxplot(data=df[['volume', 'buy_qty', 'sell_qty']])\nplt.title(\"Boxplot of key features for outliers detection\")\nplt.yscale('log')\nplt.show()","metadata":{"id":"ldeti7LMwEt4","executionInfo":{"status":"ok","timestamp":1751287543560,"user_tz":-120,"elapsed":5409,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"2efc0f2b-f32d-491a-cc8d-6a1336626b53","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:55:23.655747Z","iopub.execute_input":"2025-07-01T20:55:23.656044Z","iopub.status.idle":"2025-07-01T20:55:24.364511Z","shell.execute_reply.started":"2025-07-01T20:55:23.656024Z","shell.execute_reply":"2025-07-01T20:55:24.363754Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"features = ['volume', 'buy_qty', 'sell_qty']\nplt.figure(figsize=(18, 5))\n\nfor i, col in enumerate(features):\n    plt.subplot(1, 3, i + 1)\n    sns.histplot(df[col], bins=500, kde=True)\n    plt.xscale('log')\n    plt.title(f'{col} (log scale)')\n    plt.xlabel(col)\n    plt.ylabel('Frequency')\n    plt.grid(True)\n\nplt.tight_layout()\nplt.show()","metadata":{"id":"75OhWML9L-uJ","executionInfo":{"status":"ok","timestamp":1751287555297,"user_tz":-120,"elapsed":11775,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"feea349d-6697-4baa-b17b-58e33de6305d","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:55:24.759779Z","iopub.execute_input":"2025-07-01T20:55:24.760048Z","iopub.status.idle":"2025-07-01T20:55:33.418125Z","shell.execute_reply.started":"2025-07-01T20:55:24.760029Z","shell.execute_reply":"2025-07-01T20:55:33.417417Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Detect outliers - target feature (label)","metadata":{"id":"p1MFuNYwVlmp"}},{"cell_type":"code","source":"fig, ax = plt.subplots(2, 1, figsize=(12, 6))\nax = ax.flatten()\n\nsns.boxplot(x=df['label'], ax=ax[0])\nsns.histplot(data=df, x='label', kde=True, ax=ax[1])\n\nplt.tight_layout()","metadata":{"id":"uUnlqQk9fu9J","executionInfo":{"status":"ok","timestamp":1751287562283,"user_tz":-120,"elapsed":6977,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"6ce28f03-a13f-448b-f2b1-c9f8e11a0bd7","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:55:33.419447Z","iopub.execute_input":"2025-07-01T20:55:33.419685Z","iopub.status.idle":"2025-07-01T20:55:38.275522Z","shell.execute_reply.started":"2025-07-01T20:55:33.419667Z","shell.execute_reply":"2025-07-01T20:55:38.274745Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sns.boxplot(data=df['label'])\nplt.title(\"Boxplot of target feature for outliers detection\")\nplt.show()","metadata":{"id":"Kypmr5uQVlGL","executionInfo":{"status":"ok","timestamp":1751287563634,"user_tz":-120,"elapsed":1332,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"37388103-8d0a-4887-d445-7ad650ecbe8e","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:55:38.276340Z","iopub.execute_input":"2025-07-01T20:55:38.276667Z","iopub.status.idle":"2025-07-01T20:55:38.457167Z","shell.execute_reply.started":"2025-07-01T20:55:38.276648Z","shell.execute_reply":"2025-07-01T20:55:38.456574Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sns.histplot(df['label'], bins=500, kde=True)\nplt.xscale('log')\nplt.title('Target feature (log scale)')\nplt.xlabel('label')\nplt.ylabel('Frequency')\nplt.grid(True)","metadata":{"id":"PiSi_S_1Vwit","executionInfo":{"status":"ok","timestamp":1751287567052,"user_tz":-120,"elapsed":3401,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"88dc4bf1-20c1-4658-dc03-f04411f7f670","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:55:38.458253Z","iopub.execute_input":"2025-07-01T20:55:38.458466Z","iopub.status.idle":"2025-07-01T20:55:41.356936Z","shell.execute_reply.started":"2025-07-01T20:55:38.458450Z","shell.execute_reply":"2025-07-01T20:55:41.356211Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Plot target value over time","metadata":{"id":"NwAoOonovzT7"}},{"cell_type":"code","source":"plt.figure(figsize=(20, 4))\nplt.plot(df.index, df['label'])\nplt.xlabel('Time')\nplt.ylabel('Target value')\nplt.title('Target value over time')\nplt.grid(True)\nplt.show()","metadata":{"id":"8fVjZVlzafXI","executionInfo":{"status":"ok","timestamp":1751287567431,"user_tz":-120,"elapsed":361,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"64172f52-c345-445b-fa80-430e32db15fd","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:56:39.730632Z","iopub.execute_input":"2025-07-01T20:56:39.730988Z","iopub.status.idle":"2025-07-01T20:56:40.018125Z","shell.execute_reply.started":"2025-07-01T20:56:39.730965Z","shell.execute_reply":"2025-07-01T20:56:40.017391Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(20, 4))\nplt.plot(df.index, np.cumsum(df['label']))\nplt.xlabel('Time')\nplt.ylabel('Target value - cummulative sum')\nplt.title('Target value over time')\nplt.grid(True)\nplt.show()","metadata":{"id":"IOMhnqy_syre","executionInfo":{"status":"ok","timestamp":1751287567703,"user_tz":-120,"elapsed":255,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"d44cb80f-7a0b-40af-aef6-4c8329a426cf","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:56:40.019239Z","iopub.execute_input":"2025-07-01T20:56:40.019516Z","iopub.status.idle":"2025-07-01T20:56:40.300148Z","shell.execute_reply.started":"2025-07-01T20:56:40.019491Z","shell.execute_reply":"2025-07-01T20:56:40.299436Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Plot volume, buy and sell features over time","metadata":{"id":"K8tQkmEav3or"}},{"cell_type":"code","source":"df[['volume', 'buy_qty', 'sell_qty']].plot(figsize=(20, 6))\nplt.title(\"Crypto market over time\")\nplt.xlabel(\"Time\")\nplt.ylabel(\"Value\")\nplt.grid(True)\nplt.show()","metadata":{"id":"4tNpmKkoax7c","executionInfo":{"status":"ok","timestamp":1751287570551,"user_tz":-120,"elapsed":2820,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"6fdebd0c-3b2a-4d00-9ac5-9b4552fbdd14","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:56:40.301226Z","iopub.execute_input":"2025-07-01T20:56:40.301456Z","iopub.status.idle":"2025-07-01T20:56:43.109513Z","shell.execute_reply.started":"2025-07-01T20:56:40.301439Z","shell.execute_reply":"2025-07-01T20:56:43.108688Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Seasonal plot — Week based","metadata":{"id":"-kvQWvyIMcul"}},{"cell_type":"code","source":"df['day_name'] = df.index.day_name()\nweekday_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']","metadata":{"id":"FMn_68pM4VMI","executionInfo":{"status":"ok","timestamp":1751287570588,"user_tz":-120,"elapsed":9,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:56:43.110608Z","iopub.execute_input":"2025-07-01T20:56:43.110848Z","iopub.status.idle":"2025-07-01T20:56:43.226658Z","shell.execute_reply.started":"2025-07-01T20:56:43.110806Z","shell.execute_reply":"2025-07-01T20:56:43.226017Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"avg_label_per_day = df.groupby('day_name')['label'].mean().reindex(weekday_order)\n\nplt.figure(figsize=(10, 5))\nsns.lineplot(x=weekday_order, y=avg_label_per_day.values, marker='o')\nplt.title('Average target (label) by day of week')\nplt.xlabel('Day of week')\nplt.ylabel('Average label')\nplt.grid(True)\nplt.tight_layout()\nplt.show()","metadata":{"id":"gxri42F5jFna","executionInfo":{"status":"ok","timestamp":1751287570818,"user_tz":-120,"elapsed":205,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"8f4efa6b-9e4e-4b89-b18d-6330306ea0e0","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:56:43.227645Z","iopub.execute_input":"2025-07-01T20:56:43.227931Z","iopub.status.idle":"2025-07-01T20:56:43.448432Z","shell.execute_reply.started":"2025-07-01T20:56:43.227907Z","shell.execute_reply":"2025-07-01T20:56:43.447698Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Corr matrix - heatmap","metadata":{"id":"2Rf5SVSCRbyq"}},{"cell_type":"code","source":"plt.figure(figsize=(18, 15))\nheatmap = sns.heatmap(df.corr(numeric_only=True), vmin=-1, vmax=1, annot=False, cmap='BrBG')\nheatmap.set_title('Correlation Heatmap', fontdict={'fontsize':12})\n\nplt.show()","metadata":{"id":"U8N_D823ReXi","executionInfo":{"status":"ok","timestamp":1751287575351,"user_tz":-120,"elapsed":4515,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"2cfa1d3b-f77d-4f67-a25c-22655ed89af6","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:56:43.449763Z","iopub.execute_input":"2025-07-01T20:56:43.450045Z","iopub.status.idle":"2025-07-01T20:56:46.751567Z","shell.execute_reply.started":"2025-07-01T20:56:43.450021Z","shell.execute_reply":"2025-07-01T20:56:46.750889Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Data preprocessing","metadata":{"id":"dIs__qj9pM1E"}},{"cell_type":"code","source":"from sklearn.preprocessing import StandardScaler\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.base import BaseEstimator, TransformerMixin","metadata":{"id":"VBCPs2WPW6cV","executionInfo":{"status":"ok","timestamp":1751287575432,"user_tz":-120,"elapsed":102,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:56:46.752898Z","iopub.execute_input":"2025-07-01T20:56:46.753451Z","iopub.status.idle":"2025-07-01T20:56:46.756875Z","shell.execute_reply.started":"2025-07-01T20:56:46.753422Z","shell.execute_reply":"2025-07-01T20:56:46.756171Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Feature Engineering","metadata":{"id":"q8iqfp5Drfpw"}},{"cell_type":"markdown","source":"Adding time features","metadata":{"id":"9jSj_tNE4FKI"}},{"cell_type":"code","source":"class FeatureEngineer(BaseEstimator, TransformerMixin):\n    def __init__(self):\n      pass\n\n    def fit(self, data, y = None):\n      return self\n\n    def transform(self, data):\n        # Add lag features for label\n        data = data.reset_index()\n        try:\n            data = data.sort_values(\"timestamp\").reset_index(drop=True)\n        except:\n            data = data.sort_values(\"ID\").reset_index(drop=True)\n\n        \n        for lag in range(1, 6):\n            data[f\"buy_lag_{lag}\"] = data[\"buy_qty\"].shift(lag)\n            data[f\"sell_lag_{lag}\"] = data[\"sell_qty\"].shift(lag)\n            data[f\"volume_lag_{lag}\"] = data[\"volume\"].shift(lag)\n\n        # Add rolling means for lag features\n        for lag_col in ['buy_lag_1', 'buy_lag_2', 'buy_lag_3', 'buy_lag_4', 'buy_lag_5',\n                       'sell_lag_1', 'sell_lag_2', 'sell_lag_3', 'sell_lag_4', 'sell_lag_5',\n                       'volume_lag_1', 'volume_lag_2', 'volume_lag_3', 'volume_lag_4', 'volume_lag_5']:\n            data[f'{lag_col}_roll_mean'] = data[lag_col].rolling(window=3).mean()\n\n        # Drop null values\n        data.dropna(inplace=True)\n\n        return data","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T21:13:47.918052Z","iopub.execute_input":"2025-07-01T21:13:47.918624Z","iopub.status.idle":"2025-07-01T21:13:47.924531Z","shell.execute_reply.started":"2025-07-01T21:13:47.918603Z","shell.execute_reply":"2025-07-01T21:13:47.923863Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# df['dayofweek'] = df.index.dayofweek\n# df['day'] = df.index.day\n# df['month'] = df.index.month\n\n# df['dayofweek_sin'] = np.sin(2 * np.pi * df['dayofweek'] / 7)\n# df['dayofweek_cos'] = np.cos(2 * np.pi * df['dayofweek'] / 7)","metadata":{"id":"1jUUhnYl4BtA","executionInfo":{"status":"ok","timestamp":1751287581582,"user_tz":-120,"elapsed":66,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:56:49.291030Z","iopub.execute_input":"2025-07-01T20:56:49.291202Z","iopub.status.idle":"2025-07-01T20:56:49.294176Z","shell.execute_reply.started":"2025-07-01T20:56:49.291189Z","shell.execute_reply":"2025-07-01T20:56:49.293651Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Lag features for label","metadata":{"id":"uh7sXfCduSuJ"}},{"cell_type":"code","source":"# df = df.reset_index()\n# df = df.sort_values(\"timestamp\").reset_index(drop=True)\n\n# for lag in range(1, 6):\n#     df[f\"label_lag_{lag}\"] = df[\"label\"].shift(lag)","metadata":{"id":"NV-1LzbLrg2l","executionInfo":{"status":"ok","timestamp":1751287582433,"user_tz":-120,"elapsed":501,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:56:49.561320Z","iopub.execute_input":"2025-07-01T20:56:49.561696Z","iopub.status.idle":"2025-07-01T20:56:49.564558Z","shell.execute_reply.started":"2025-07-01T20:56:49.561680Z","shell.execute_reply":"2025-07-01T20:56:49.563875Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Rolling statistics","metadata":{"id":"D_Me__uax_aw"}},{"cell_type":"code","source":" # for lag_col in ['label_lag_1', 'label_lag_2', 'label_lag_3', 'label_lag_4', 'label_lag_5']:\n #        df[f'{lag_col}_roll_mean'] = df[lag_col].rolling(window=3).mean()","metadata":{"id":"NGhxCq_f2n9s","executionInfo":{"status":"ok","timestamp":1751287726800,"user_tz":-120,"elapsed":193,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:56:52.194684Z","iopub.execute_input":"2025-07-01T20:56:52.194961Z","iopub.status.idle":"2025-07-01T20:56:52.198305Z","shell.execute_reply.started":"2025-07-01T20:56:52.194939Z","shell.execute_reply":"2025-07-01T20:56:52.197728Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# df.dropna(inplace=True)","metadata":{"id":"ZtChHNT34LF4","executionInfo":{"status":"ok","timestamp":1751287729404,"user_tz":-120,"elapsed":744,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:56:52.349271Z","iopub.execute_input":"2025-07-01T20:56:52.349459Z","iopub.status.idle":"2025-07-01T20:56:52.352686Z","shell.execute_reply.started":"2025-07-01T20:56:52.349444Z","shell.execute_reply":"2025-07-01T20:56:52.352030Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# df.columns","metadata":{"id":"ofZLo-fxBk1q","executionInfo":{"status":"ok","timestamp":1751287730291,"user_tz":-120,"elapsed":20,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"5fb5a0ba-463e-4dd7-e14d-e31c8c74deff","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:56:52.511171Z","iopub.execute_input":"2025-07-01T20:56:52.511612Z","iopub.status.idle":"2025-07-01T20:56:52.514416Z","shell.execute_reply.started":"2025-07-01T20:56:52.511596Z","shell.execute_reply":"2025-07-01T20:56:52.513875Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Handle outliers - for first iteratin i will take outliers for model training. Than after evalution we will see if it is necessary to handle them","metadata":{"id":"EhHo69Jgyg49"}},{"cell_type":"code","source":"class Outliers(BaseEstimator, TransformerMixin):\n    def __init__(self):\n        pass\n    \n    def fit(self, data, y=None):\n        return self\n\n    def transform(self, data):\n        try:\n            features = data.drop(columns=['label', 'day_name', 'timestamp'])\n            target = data['label']\n\n            features_clipped = features.clip(lower=features.quantile(0.01), upper=features.quantile(0.99), axis=1)\n        \n            data = pd.concat([features_clipped, target], axis=1)\n\n        except:\n            features = data.drop(columns=['ID'])\n            data = features.clip(lower=features.quantile(0.01), upper=features.quantile(0.99), axis=1)\n\n        return data\n        ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T21:13:51.112477Z","iopub.execute_input":"2025-07-01T21:13:51.113255Z","iopub.status.idle":"2025-07-01T21:13:51.119663Z","shell.execute_reply.started":"2025-07-01T21:13:51.113229Z","shell.execute_reply":"2025-07-01T21:13:51.118878Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# features = df.drop(columns=['label', 'day_name', 'hour', 'dayofweek', 'timestamp'])\n# target = df['label']\n\n# features_clipped = features.clip(lower=features.quantile(0.01), upper=features.quantile(0.99), axis=1)\n\n# df = pd.concat([features_clipped, target], axis=1)\n\n# print(f\"Min value: {df.min().min()}\")\n# print(f\"Max value: {df.max().max()}\")","metadata":{"id":"tkZ8ES31yYO8","executionInfo":{"status":"ok","timestamp":1751287741393,"user_tz":-120,"elapsed":2391,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"4f56a3b5-2c1b-462c-bb2d-0034d4a81ea0","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:56:52.938136Z","iopub.execute_input":"2025-07-01T20:56:52.938318Z","iopub.status.idle":"2025-07-01T20:56:52.941334Z","shell.execute_reply.started":"2025-07-01T20:56:52.938304Z","shell.execute_reply":"2025-07-01T20:56:52.940731Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pipeline = Pipeline([\n    ('feature_engineering', FeatureEngineer()),\n    ('outliers', Outliers())\n])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T21:13:53.742021Z","iopub.execute_input":"2025-07-01T21:13:53.742474Z","iopub.status.idle":"2025-07-01T21:13:53.745988Z","shell.execute_reply.started":"2025-07-01T21:13:53.742450Z","shell.execute_reply":"2025-07-01T21:13:53.745255Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df = pipeline.fit_transform(df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:56:55.051976Z","iopub.execute_input":"2025-07-01T20:56:55.052212Z","iopub.status.idle":"2025-07-01T20:56:58.084490Z","shell.execute_reply.started":"2025-07-01T20:56:55.052197Z","shell.execute_reply":"2025-07-01T20:56:58.083870Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Split dataset to X and y","metadata":{"id":"DEDk7K8alvYM"}},{"cell_type":"code","source":"X = df.drop(columns=['label'])\ny = df['label']\n\nprint(f\"X: {X.shape}\")\nprint(f\"Y: {y.shape}\")","metadata":{"id":"wua7U2VQmQey","executionInfo":{"status":"ok","timestamp":1751287743637,"user_tz":-120,"elapsed":69,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"65ef2124-90c5-4f05-fd68-39a911deca34","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:56:58.085928Z","iopub.execute_input":"2025-07-01T20:56:58.086234Z","iopub.status.idle":"2025-07-01T20:56:58.180403Z","shell.execute_reply.started":"2025-07-01T20:56:58.086209Z","shell.execute_reply":"2025-07-01T20:56:58.179511Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Train test split","metadata":{"id":"qsrcNfgSnEta"}},{"cell_type":"code","source":"split_idx = int(len(X) * 0.8)\n\nX_train = X.iloc[:split_idx]\ny_train = y.iloc[:split_idx]\n\nX_val = X.iloc[split_idx:]\ny_val = y.iloc[split_idx:]","metadata":{"id":"aFd7qKy2nGIi","executionInfo":{"status":"ok","timestamp":1751287744730,"user_tz":-120,"elapsed":7,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:56:58.181335Z","iopub.execute_input":"2025-07-01T20:56:58.182125Z","iopub.status.idle":"2025-07-01T20:56:58.186194Z","shell.execute_reply.started":"2025-07-01T20:56:58.182097Z","shell.execute_reply":"2025-07-01T20:56:58.185596Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Preprocessing pipeline","metadata":{}},{"cell_type":"markdown","source":"Feature Scaling","metadata":{"id":"bUeL_Cd4uhnX"}},{"cell_type":"code","source":"scaler = StandardScaler()\nX_train_scaled = scaler.fit_transform(X_train)\nX_val_scaled = scaler.transform(X_val)","metadata":{"id":"XXK3i9muuiqm","executionInfo":{"status":"ok","timestamp":1751287746831,"user_tz":-120,"elapsed":585,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:56:58.187452Z","iopub.execute_input":"2025-07-01T20:56:58.187678Z","iopub.status.idle":"2025-07-01T20:56:58.776382Z","shell.execute_reply.started":"2025-07-01T20:56:58.187662Z","shell.execute_reply":"2025-07-01T20:56:58.775575Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(f\"Min value: {X_train_scaled.min()}\")\nprint(f\"Max value: {X_train_scaled.max()}\")","metadata":{"id":"-F2Ttvi1i4j4","executionInfo":{"status":"ok","timestamp":1751287747186,"user_tz":-120,"elapsed":226,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"fc951102-fd95-4f61-aaf5-f99ae9a08a68","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:56:58.777506Z","iopub.execute_input":"2025-07-01T20:56:58.777730Z","iopub.status.idle":"2025-07-01T20:56:58.840599Z","shell.execute_reply.started":"2025-07-01T20:56:58.777711Z","shell.execute_reply":"2025-07-01T20:56:58.839882Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Model building","metadata":{"id":"wvIUDtMDIhbC"}},{"cell_type":"code","source":"! pip install torchmetrics","metadata":{"id":"PoHRlThza_5D","executionInfo":{"status":"ok","timestamp":1751287881229,"user_tz":-120,"elapsed":130236,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"a6993a46-9d3b-4084-859b-ca897a0407f2","trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:56:58.841254Z","iopub.execute_input":"2025-07-01T20:56:58.841435Z","iopub.status.idle":"2025-07-01T20:57:01.920479Z","shell.execute_reply.started":"2025-07-01T20:56:58.841421Z","shell.execute_reply":"2025-07-01T20:57:01.919681Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from scipy.stats import pearsonr\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom tqdm import tqdm\nfrom torch.utils.data import Dataset, DataLoader\nimport torch.optim as optim\nfrom torchmetrics.functional import pearson_corrcoef","metadata":{"id":"qQC2HVH3Ij3L","executionInfo":{"status":"ok","timestamp":1751287910591,"user_tz":-120,"elapsed":29351,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:57:02.724876Z","iopub.execute_input":"2025-07-01T20:57:02.725142Z","iopub.status.idle":"2025-07-01T20:57:02.729907Z","shell.execute_reply.started":"2025-07-01T20:57:02.725118Z","shell.execute_reply":"2025-07-01T20:57:02.729334Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Model parameters","metadata":{"id":"S6SOHhhtZF-f"}},{"cell_type":"code","source":"class Parameters():\n  lr = 0.0001\n  batch_size_train = 64\n  batch_size_val = 128\n  epochs = 30\n  input_dim = X.shape[1]\n  hidden_dim1 = 128\n  hidden_dim2 = 64\n  hidden_dim3 = 32\n  # hidden_dim4 = 32\n  output_dim = 1\n\nparams = Parameters()","metadata":{"id":"fTVbvxvVZFwZ","executionInfo":{"status":"ok","timestamp":1751288473859,"user_tz":-120,"elapsed":20,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:57:03.152797Z","iopub.execute_input":"2025-07-01T20:57:03.153021Z","iopub.status.idle":"2025-07-01T20:57:03.156974Z","shell.execute_reply.started":"2025-07-01T20:57:03.153006Z","shell.execute_reply":"2025-07-01T20:57:03.156333Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Convert to pytorch tensors","metadata":{"id":"9cU53Fb-qVF1"}},{"cell_type":"code","source":"x_train_tensor = torch.tensor(X_train_scaled, dtype=torch.float32)\nx_val_tensor = torch.tensor(X_val_scaled, dtype=torch.float32)\n\ny_train_tensor = torch.tensor(y_train.values, dtype=torch.float32)\ny_val_tensor = torch.tensor(y_val.values, dtype=torch.float32)","metadata":{"id":"d4L3A6eNqaIN","executionInfo":{"status":"ok","timestamp":1751288474603,"user_tz":-120,"elapsed":230,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:57:05.567893Z","iopub.execute_input":"2025-07-01T20:57:05.568187Z","iopub.status.idle":"2025-07-01T20:57:05.641756Z","shell.execute_reply.started":"2025-07-01T20:57:05.568166Z","shell.execute_reply":"2025-07-01T20:57:05.640982Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Create custom dataset","metadata":{"id":"FkYlIPnrYicb"}},{"cell_type":"code","source":"class CryptoDataset(Dataset):\n    def __init__(self, X, y):\n        self.X = X\n        self.y = y\n\n    def __len__(self):\n        return len(self.X)\n\n    def __getitem__(self, idx):\n        if self.y is not None:\n            return self.X[idx], self.y[idx]\n        else:\n            return self.X[idx]","metadata":{"id":"Wx4vY87-Ykw2","executionInfo":{"status":"ok","timestamp":1751288474707,"user_tz":-120,"elapsed":7,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:57:05.875034Z","iopub.execute_input":"2025-07-01T20:57:05.875269Z","iopub.status.idle":"2025-07-01T20:57:05.879804Z","shell.execute_reply.started":"2025-07-01T20:57:05.875251Z","shell.execute_reply":"2025-07-01T20:57:05.879185Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_dataset = CryptoDataset(x_train_tensor, y_train_tensor)\nval_dataset = CryptoDataset(x_val_tensor, y_val_tensor)","metadata":{"id":"Ailsdr4BrMEL","executionInfo":{"status":"ok","timestamp":1751288474853,"user_tz":-120,"elapsed":12,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:57:07.720171Z","iopub.execute_input":"2025-07-01T20:57:07.720883Z","iopub.status.idle":"2025-07-01T20:57:07.724336Z","shell.execute_reply.started":"2025-07-01T20:57:07.720859Z","shell.execute_reply":"2025-07-01T20:57:07.723550Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Create dataloader","metadata":{"id":"GqgFp_WmYlqY"}},{"cell_type":"code","source":"train_dataloader = DataLoader(train_dataset, batch_size=params.batch_size_train, shuffle=True)\nval_dataloader = DataLoader(val_dataset, batch_size=params.batch_size_val, shuffle=False)","metadata":{"id":"o41JrONgYnIt","executionInfo":{"status":"ok","timestamp":1751288475222,"user_tz":-120,"elapsed":12,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:57:08.484247Z","iopub.execute_input":"2025-07-01T20:57:08.484453Z","iopub.status.idle":"2025-07-01T20:57:08.489024Z","shell.execute_reply.started":"2025-07-01T20:57:08.484437Z","shell.execute_reply":"2025-07-01T20:57:08.488220Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Create the model - MLP","metadata":{"id":"HXHr3YvrWa4a"}},{"cell_type":"code","source":"class crypto_MLP(nn.Module):\n  def __init__(self, input_dim, hidden_dim1, hidden_dim2, hidden_dim3, output_dim):\n    super().__init__()\n\n    self.model = nn.Sequential(\n      nn.Linear(input_dim, hidden_dim1),\n      nn.BatchNorm1d(hidden_dim1),\n      nn.ReLU(),\n      nn.Dropout(0.5),\n\n      nn.Linear(hidden_dim1, hidden_dim2),\n      nn.BatchNorm1d(hidden_dim2),\n      nn.ReLU(),\n      nn.Dropout(0.4),\n\n      nn.Linear(hidden_dim2, hidden_dim3),\n      nn.BatchNorm1d(hidden_dim3),\n      nn.ReLU(),\n      nn.Dropout(0.3),\n\n      nn.Linear(hidden_dim3, output_dim)\n    )\n\n  def forward(self, x):\n    return self.model(x)","metadata":{"id":"nPVHoR8Lrnjq","executionInfo":{"status":"ok","timestamp":1751288475579,"user_tz":-120,"elapsed":6,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:57:24.712961Z","iopub.execute_input":"2025-07-01T20:57:24.713224Z","iopub.status.idle":"2025-07-01T20:57:24.718562Z","shell.execute_reply.started":"2025-07-01T20:57:24.713203Z","shell.execute_reply":"2025-07-01T20:57:24.717873Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nmodel = crypto_MLP(input_dim=params.input_dim, hidden_dim1=params.hidden_dim1, hidden_dim2=params.hidden_dim2, hidden_dim3=params.hidden_dim3, output_dim=params.output_dim).to(device)","metadata":{"id":"MTzmG_daYx5f","executionInfo":{"status":"ok","timestamp":1751288475731,"user_tz":-120,"elapsed":10,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:57:43.316898Z","iopub.execute_input":"2025-07-01T20:57:43.317165Z","iopub.status.idle":"2025-07-01T20:57:43.373663Z","shell.execute_reply.started":"2025-07-01T20:57:43.317148Z","shell.execute_reply":"2025-07-01T20:57:43.372711Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"loss_fn = nn.MSELoss()\noptimizer = optim.Adam(model.parameters(), lr=params.lr, weight_decay=1e-4)\nscheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'min', patience=3, factor=0.5)","metadata":{"id":"tJ5yZRzvY-5F","executionInfo":{"status":"ok","timestamp":1751288475878,"user_tz":-120,"elapsed":11,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T20:57:55.219401Z","iopub.execute_input":"2025-07-01T20:57:55.219954Z","iopub.status.idle":"2025-07-01T20:57:55.235997Z","shell.execute_reply.started":"2025-07-01T20:57:55.219931Z","shell.execute_reply":"2025-07-01T20:57:55.235091Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_losses = []\ntrain_pearsons = []\nval_losses = []\nval_pearsons = []","metadata":{"id":"KYMtjtNfZ0NW","executionInfo":{"status":"ok","timestamp":1751288476506,"user_tz":-120,"elapsed":8,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for epoch in range(params.epochs):\n    model.train()\n    running_loss = 0.0\n    pearson_total = 0.0\n    train_total = 0\n\n\n    with tqdm(total=len(train_dataloader), desc=f\"Epoch {epoch+1}\", position=0, leave=True) as progress_bar:\n        for x, y in train_dataloader:\n            x, y = x.to(device), y.to(device)\n            optimizer.zero_grad()\n\n            # Forward\n            y_pred = model(x).squeeze(1)\n\n            # Calculate loss\n            loss = loss_fn(y_pred, y)\n\n            # Backward\n            loss.backward()\n            optimizer.step()\n\n            # Metrics\n            running_loss += loss.item() * x.size(0)\n            pearson = pearson_corrcoef(y_pred, y).item()\n            pearson_total += pearson * x.size(0)\n\n            train_total += x.size(0)\n\n            avg_loss = running_loss / train_total\n            avg_pearson = pearson_total / train_total\n\n            progress_bar.set_postfix(loss=avg_loss, pearson=avg_pearson)\n            progress_bar.update(1)\n\n    running_loss /= train_total\n    pearson_total /= train_total\n\n    train_losses.append(running_loss)\n    train_pearsons.append(pearson_total)\n    print(f\"Epoch {epoch+1}: Train Loss = {running_loss:.4f}, Train Pearson correlation coefficient = {pearson_total:.4f}\")\n\n    # ---------------- Validation ----------------\n    model.eval()\n    val_loss = 0.0\n    val_pearson_total = 0.0\n    val_total = 0\n\n    with torch.no_grad():\n        for x, y in val_dataloader:\n            x, y = x.to(device), y.to(device)\n\n            # Forward pass\n            y_pred = model(x).squeeze(1)\n\n            # Calculate loss\n            loss = loss_fn(y_pred, y)\n            val_loss += loss.item() * x.size(0)\n\n            # Calculate metrics\n            val_pearson = pearson_corrcoef(y_pred, y).item()\n            val_pearson_total += pearson * x.size(0)\n\n            val_total += x.size(0)\n\n    val_loss /= val_total\n    val_pearson_total /= val_total\n\n    scheduler.step(val_loss)\n\n    val_losses.append(val_loss)\n    val_pearsons.append(val_pearson_total)\n    print(f\"           Val Loss = {val_loss:.4f}, Val Pearson correlation coefficient = {val_pearson_total:.4f}\")","metadata":{"id":"ItcpItAFREdy","executionInfo":{"status":"error","timestamp":1751289287606,"user_tz":-120,"elapsed":811054,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"604e0815-5a67-4c43-8141-cfe9f8a062d1"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Loss plot\nplt.plot(train_losses, label='Train Loss')\nplt.plot(val_losses, label='Val Loss')\nplt.xlabel('Epoch')\nplt.ylabel('Loss')\nplt.legend()\nplt.title('Loss over Epochs')\nplt.show()","metadata":{"id":"z0jKJHEKOtv1","executionInfo":{"status":"ok","timestamp":1751288448094,"user_tz":-120,"elapsed":144,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"9cafc8de-64fc-4a2e-f173-3b8b6b53f65b"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Accuracy plot\nplt.plot(train_pearsons, label='Train Pearson correlation coefficient')\nplt.plot(val_pearsons, label='Val Pearson correlation coefficient')\nplt.xlabel('Epoch')\nplt.ylabel('Pearson correlation coefficient')\nplt.legend()\nplt.title('Pearson correlation coefficient over Epochs')\nplt.show()","metadata":{"id":"lNol_Y7tOwBJ","executionInfo":{"status":"ok","timestamp":1751231203633,"user_tz":-120,"elapsed":135,"user":{"displayName":"Matej Kamenicky","userId":"04927559039197615042"}},"outputId":"35a0c5a8-7cee-4205-9e04-0681c52c1cbe"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"columns_to_read_test = ['bid_qty', 'ask_qty', 'buy_qty', 'sell_qty', 'volume', 'X21', 'X20', 'X28', 'X863', 'X29', 'X19', 'X27', 'X22', 'X858', 'X219', 'X860', 'X531', 'X287', 'X289', 'X291', 'X293', 'X857', 'X295', 'X598', 'X218',\n                    'X297', 'X298', 'X285', 'X300', 'X299', 'X302', 'X26', 'X292', 'X301', 'X294', 'X296', 'X303', 'X283', 'X30', 'X18', 'X465', 'X466', 'X181', 'X288', 'X290']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T21:14:02.294549Z","iopub.execute_input":"2025-07-01T21:14:02.294845Z","iopub.status.idle":"2025-07-01T21:14:02.299316Z","shell.execute_reply.started":"2025-07-01T21:14:02.294805Z","shell.execute_reply":"2025-07-01T21:14:02.298592Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_test = pd.read_parquet('../input/drw-crypto-market-prediction/test.parquet', columns=columns_to_read_test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T21:14:02.653393Z","iopub.execute_input":"2025-07-01T21:14:02.653599Z","iopub.status.idle":"2025-07-01T21:14:02.906138Z","shell.execute_reply.started":"2025-07-01T21:14:02.653582Z","shell.execute_reply":"2025-07-01T21:14:02.905551Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_test = pipeline.fit_transform(df_test)\nscaler = StandardScaler()\ndf_test_scaled = scaler.fit_transform(df_test)\ntest_tensor = torch.tensor(df_test_scaled, dtype=torch.float32)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-01T21:14:03.281427Z","iopub.execute_input":"2025-07-01T21:14:03.281645Z","iopub.status.idle":"2025-07-01T21:14:06.963448Z","shell.execute_reply.started":"2025-07-01T21:14:03.281628Z","shell.execute_reply":"2025-07-01T21:14:06.962854Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_dataset = CryptoDataset(test_tensor, y=None)\ntest_dataloader = DataLoader(test_dataset, batch_size=params.batch_size_val, shuffle=True)","metadata":{"id":"6YPeuFhJYZmd"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.eval()\npredictions = []\n\nwith torch.no_grad():\n    for x in test_dataloader:\n        x = x.to(device)\n        y_pred = model(x)\n        predictions.extend(y_pred.cpu().numpy())","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission = pd.DataFrame({\n    \"ID\": list(range(1, len(predictions) + 1)),\n    \"prediction\": predictions\n})","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission.to_csv('submission.csv', index=False)","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}