{"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"},"kaggle":{"accelerator":"gpu","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":"markdown","source":"# **Baseline: Simple Moving Average (SMA) for Crypto Market Prediction**","metadata":{"_uuid":"ed0524ad-8676-43f0-a8ec-9cb59ce1cade","_cell_guid":"c9bbe990-90c2-4762-b6de-8b1a245fee97","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"editable":false}},{"cell_type":"markdown","source":"## **1. Imports & Environment Setup**","metadata":{"_uuid":"a48b3aa9-36a1-4dd2-8acc-d4968f11e890","_cell_guid":"6f9b91a5-22fb-4a6e-a731-2cd5a365cd79","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"editable":false}},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings(\"ignore\")\n\nimport gc\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nfrom sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\nfrom scipy.stats import pearsonr","metadata":{"_uuid":"f2ccf708-d3a6-42c1-80ce-f5c45027c6c4","_cell_guid":"e4635049-88c4-4193-8445-21348cf34c7d","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"editable":false},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## **2. Data Loading & Preprocessing**","metadata":{"_uuid":"647dc641-273e-4d5d-9e42-2f7fca160560","_cell_guid":"c69ab85e-3439-488e-a244-056b9bc9a77f","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"editable":false}},{"cell_type":"code","source":"# Load Parquet\ntrain_df = pd.read_parquet('/kaggle/input/drw-crypto-market-prediction/train.parquet', engine='pyarrow')\n\n# Replace infs\ntrain_df.replace([np.inf, -np.inf], 0, inplace=True)\n\n# Focus on a segment of the label\ny_test = train_df.iloc[500_000:550_000]['label'].reset_index(drop=True)\n\n# Clean up\ndel train_df\ngc.collect()","metadata":{"_uuid":"47d2aa6d-5bdd-4fd5-9430-9d38bf6fdd32","_cell_guid":"623837a3-8be9-4c15-abcd-00c0201de24b","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"editable":false},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## **3. SMA Baseline Prediction**","metadata":{"_uuid":"3e320be5-8f49-4090-a4db-f1593ab25a73","_cell_guid":"1f16df03-66b7-4647-8990-ecea7d89f2a5","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"editable":false}},{"cell_type":"code","source":"window_size = 5\ny_pred = y_test.rolling(window=window_size).mean().fillna(method='bfill')","metadata":{"_uuid":"e294648d-bc0f-48f5-9688-f4acf80cd102","_cell_guid":"cde5e6d8-5091-4916-8870-330a1b35b9ef","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"editable":false},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## **4. Evaluation Metrics**","metadata":{"_uuid":"446468e4-4cca-453d-b62a-82f57cafdf08","_cell_guid":"2b5fdc02-392e-45d3-b5d7-4db4a850973d","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"editable":false}},{"cell_type":"code","source":"mae = mean_absolute_error(y_test, y_pred)\nmse = mean_squared_error(y_test, y_pred)\nrmse = np.sqrt(mse)\nr2 = r2_score(y_test, y_pred)\ncorr_coef, p_val = pearsonr(y_test, y_pred)\n\nresults = pd.DataFrame({\n    'Model': [f'SMA-{window_size}'],\n    'MAE': [mae],\n    'MSE': [mse],\n    'RMSE': [rmse],\n    'R2 Score': [r2],\n    'Pearson Corr': [corr_coef],\n    'P-Value': [p_val],\n})\n\nresults.style.background_gradient(cmap='YlGnBu', axis=1).format(precision=5)","metadata":{"_uuid":"d31d722f-0930-427c-b9e2-8d9ef3b3be5b","_cell_guid":"62d7dc73-692c-4007-a1d0-59bfa4a7a962","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"editable":false},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## **5. Visualization**","metadata":{"_uuid":"9e483f0e-3e77-40ce-90a8-861d0d5f3ca4","_cell_guid":"b6b02975-3bb8-4f1c-a53a-3bacf640f6bc","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"editable":false}},{"cell_type":"markdown","source":"### **5.1: Actual vs SMA Predicted (Random 100 Samples)**","metadata":{"_uuid":"d65c45fb-8935-445d-b852-36b5fda0268a","_cell_guid":"c562f500-106c-4b73-9758-78ec9db8ec32","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"editable":false}},{"cell_type":"code","source":"np.random.seed(42)\nidx = np.random.choice(len(y_test), size=100, replace=False)\n\nplt.figure(figsize=(12, 6))\nplt.plot(y_test.iloc[idx].values, label='Actual', marker='o')\nplt.plot(y_pred.iloc[idx].values, label='SMA Predicted', marker='x')\nplt.title(\"SMA vs Actual (100 Random Samples)\")\nplt.xlabel(\"Sample Index\")\nplt.ylabel(\"Target\")\nplt.legend()\nplt.grid(True)\nplt.tight_layout()\nplt.show()","metadata":{"_uuid":"ec9ef8f3-74b5-43c8-a95d-2a4521a13c86","_cell_guid":"7621feaa-c018-4820-9db8-9ad53432599d","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"editable":false},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### **5.2: Error Distribution**","metadata":{"_uuid":"31749354-258a-4e02-aef0-1297186d3812","_cell_guid":"fdc91ecf-778c-4597-b261-45b7aa0138e2","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"editable":false}},{"cell_type":"code","source":"errors = y_test - y_pred\n\nplt.figure(figsize=(10, 4))\nplt.hist(errors, bins=50, color='salmon', edgecolor='black')\nplt.title(\"Error Distribution: SMA Prediction\")\nplt.xlabel(\"Prediction Error\")\nplt.ylabel(\"Frequency\")\nplt.grid(True)\nplt.tight_layout()\nplt.show()","metadata":{"_uuid":"004581d4-f86f-4373-a13b-bd99f224b570","_cell_guid":"2f244acb-ca06-4347-b0e6-da45f0f90770","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"editable":false},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## **6. SMA Window Size Sweep**","metadata":{"_uuid":"f83ecbf1-4d10-4175-9691-5822d812644b","_cell_guid":"9825b068-b2eb-4b70-8c5b-c013611052ab","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"editable":false}},{"cell_type":"code","source":"window_metrics = []\n\nfor w in [3, 5, 10, 20, 50]:\n    y_w = y_test.rolling(window=w).mean().fillna(method='bfill')\n    mae = mean_absolute_error(y_test, y_w)\n    r2 = r2_score(y_test, y_w)\n    corr, _ = pearsonr(y_test, y_w)\n    window_metrics.append((w, mae, r2, corr))\n\nsweep_df = pd.DataFrame(window_metrics, columns=['Window Size', 'MAE', 'R2 Score', 'Pearson Corr'])\nsweep_df.style.bar(subset=['R2 Score', 'Pearson Corr'], color='#5fba7d').format(precision=4)","metadata":{"_uuid":"3f7d2d64-dae0-42a6-b1d6-cd2d8bb79f75","_cell_guid":"223742b8-fa2d-4f89-b342-2de9872d87a2","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"editable":false},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **7. FINAL TEST PREDICTION & SUBMISSION: SMA BASELINE**","metadata":{"editable":false}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n\n# 1. Load the full train labels to compute rolling mean\ntrain_df = pd.read_parquet('/kaggle/input/drw-crypto-market-prediction/train.parquet', engine='pyarrow')\nlabels = train_df['label']\n\n# 2. Compute SMA on the training labels and take the last value\nwindow_size = 5\nsma_series = labels.rolling(window=window_size).mean().fillna(method='bfill')\nlast_sma_value = sma_series.iloc[-1]\n\n# 3. Load test DataFrame just to get its length\ntest_df = pd.read_parquet('/kaggle/input/drw-crypto-market-prediction/test.parquet', engine='pyarrow')\nn_test = len(test_df)\n\n# 4. Create a constant‐SMA prediction array of the same length as test set\nsma_pred = np.full(shape=n_test, fill_value=last_sma_value)\n\n# 5. Prepare and write submission\nsample_submission = pd.read_csv('/kaggle/input/drw-crypto-market-prediction/sample_submission.csv')\nsample_submission['prediction'] = sma_pred\nsample_submission.to_csv('sample_submission.csv', index=False)","metadata":{"trusted":true,"editable":false},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **7. FINAL TEST PREDICTION & SUBMISSION**","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n\n# 1. Load the full train labels to compute rolling mean\ntrain_df = pd.read_parquet('/kaggle/input/drw-crypto-market-prediction/train.parquet', engine='pyarrow')\nlabels = train_df['label']\n\n# 2. Compute SMA on the training labels and take the last value\nwindow_size = 5\nsma_series = labels.rolling(window=window_size).mean().fillna(method='bfill')\nlast_sma_value = sma_series.iloc[-1]\n\n# 3. Load test DataFrame just to get its length\ntest_df = pd.read_parquet('/kaggle/input/drw-crypto-market-prediction/test.parquet', engine='pyarrow')\nn_test = len(test_df)\n\n# 4. Create a constant‐SMA prediction array of the same length as test set\nsma_pred = np.full(shape=n_test, fill_value=last_sma_value)\n\n# 5. Prepare and write submission\nsample_submission = pd.read_csv('/kaggle/input/drw-crypto-market-prediction/sample_submission.csv')\nsample_submission['prediction'] = sma_pred\nsample_submission.to_csv('sample_submission.csv', index=False)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"\n**This baseline serves as the foundational pursuit of step, substantial work remains to build requisite modeling pipelines and it serves as a groundwork.**","metadata":{"_uuid":"916242ad-d8c5-4d56-94e9-89429b08eee4","_cell_guid":"00e00733-1813-4eaa-8cfa-2d9962bfbc6b","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"editable":false}}]}