{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":96164,"databundleVersionId":12993472,"isSourceIdPinned":false,"sourceType":"competition"}],"dockerImageVersionId":31089,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\n\n# Load train & test datasets\ntrain = pd.read_parquet('/kaggle/input/drw-crypto-market-prediction/train.parquet')\ntest = pd.read_parquet('/kaggle/input/drw-crypto-market-prediction/test.parquet')\nsample_submission = pd.read_csv('/kaggle/input/drw-crypto-market-prediction/sample_submission.csv')\n\n# Preview\nprint(\"Train shape:\", train.shape)\nprint(\"Test shape:\", test.shape)\ntrain.head()\n\n# Print the columns\nprint(train.columns[:786])  # show first 786 columns\nprint(\"Target column:\", 'label' in train.columns)\n\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\nplt.figure(figsize=(10, 4))\nsns.histplot(train['label'], bins=100, kde=True)\nplt.title('Distribution of Target Label')\nplt.xlabel('Label')\nplt.ylabel('Frequency')\nplt.grid(True)\nplt.show()\n\npublic_cols = ['bid_qty', 'ask_qty', 'buy_qty', 'sell_qty', 'volume']\ncorrelations = train[public_cols + ['label']].corr()['label'].sort_values(ascending=False)\n\nprint(\"Correlation with target label:\\n\", correlations)\n\nx_cols = [col for col in train.columns if col.startswith('X')]\nx_stats = train[x_cols].agg(['mean', 'std', 'min', 'max']).T\nx_stats.head(10)  # preview top 10\n\npublic_cols = ['bid_qty', 'ask_qty', 'buy_qty', 'sell_qty', 'volume']\ncorrelations = train[public_cols + ['label']].corr()['label'].sort_values(ascending=False)\nprint(correlations)\n\nx_cols = [col for col in train.columns if col.startswith('X')]\nx_label_corr = train[x_cols + ['label']].corr()['label'].drop('label').sort_values(ascending=False)\n\nprint(\"Top positively correlated X features:\")\nprint(x_label_corr.head(5))\n\nprint(\"\\nTop negatively correlated X features:\")\nprint(x_label_corr.tail(5))\n\nfrom sklearn.model_selection import train_test_split\n\n# Use only the last 100,000 rows for faster training (you can increase later)\ndf = train.iloc[+1_000:].copy()\n\n# Features and target\nfeatures = [col for col in df.columns if col.startswith('X')] + ['bid_qty', 'ask_qty', 'buy_qty', 'sell_qty', 'volume']\ntarget = 'label'\n\n# Time-aware split: train 80%, validate 20%\ntrain_data = df.iloc[:800]\nvalid_data = df.iloc[800:]\n\nX_train, y_train = train_data[features], train_data[target]\nX_valid, y_valid = valid_data[features], valid_data[target]\n\nimport lightgbm as lgb\nfrom sklearn.metrics import r2_score\nfrom scipy.stats import pearsonr\n\n# Prepare LightGBM datasets\ndtrain = lgb.Dataset(X_train, label=y_train)\ndvalid = lgb.Dataset(X_valid, label=y_valid)\n\n# Define model parameters\nparams = {\n    'objective': 'regression',\n    'metric': 'l2',\n    'learning_rate': 0.05,\n    'max_depth': 7,\n    'num_leaves': 64,\n    'subsample': 0.8,\n    'colsample_bytree': 0.8,\n    'seed': 42\n}\n\n# Train the model (no early stopping or verbosity)\nmodel = lgb.train(\n    params,\n    dtrain,\n    num_boost_round=300\n)\n\n# Predict on validation set\ny_pred = model.predict(X_valid)\n\n# Evaluate Pearson correlation\ncorrelation = pearsonr(y_valid, y_pred)[0]\nprint(f'Validation Pearson Correlation: {correlation:.6f}')\n\nimport matplotlib.pyplot as plt\nimport numpy as np\n\n# Get feature importances\nimportance = model.feature_importance()\nfeature_names = model.feature_name()\n\n# Sort and display top features\nindices = np.argsort(importance)[::-1][:30]\nplt.figure(figsize=(10, 6))\nplt.barh(range(len(indices)), [importance[i] for i in indices], align='center')\nplt.yticks(range(len(indices)), [feature_names[i] for i in indices])\nplt.gca().invert_yaxis()\nplt.title('Top 30 Feature Importances')\nplt.xlabel('Importance')\nplt.show()\n\ntest = pd.read_parquet('/kaggle/input/drw-crypto-market-prediction/test.parquet')\nX_test = test.drop(columns=[\"timestamp\", \"label\"], errors=\"ignore\") \ny_test_pred = model.predict(X_test)\n\nsubmission = pd.read_csv('/kaggle/input/drw-crypto-market-prediction/sample_submission.csv')\nsubmission[\"label\"] = y_test_pred\n\nsubmission.to_csv(\"submission.csv\", index=False)\n\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\n# Train data\ntrain = pd.read_parquet('/kaggle/input/drw-crypto-market-prediction/train.parquet')\n\n# Test data\ntest = pd.read_parquet('/kaggle/input/drw-crypto-market-prediction/test.parquet')\n\n# Sample submission\nsample_submission = pd.read_csv('/kaggle/input/drw-crypto-market-prediction/sample_submission.csv')\nprint(\"Train shape:\", train.shape)\nprint(\"Test shape:\", test.shape)\n\ntrain.head()\ntrain.info()\n\ntrain.isnull().sum()\n\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-07-20T00:14:39.77198Z","iopub.execute_input":"2025-07-20T00:14:39.77243Z","iopub.status.idle":"2025-07-20T00:37:48.349319Z","shell.execute_reply.started":"2025-07-20T00:14:39.7724Z","shell.execute_reply":"2025-07-20T00:37:48.346484Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import plotly.express as px\n\nfig = px.histogram(train, x=\"label\", title=\"Distribution of Labels (Target)\")\nfig.show()\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-20T00:37:48.352549Z","iopub.execute_input":"2025-07-20T00:37:48.352941Z","iopub.status.idle":"2025-07-20T00:37:50.617594Z","shell.execute_reply.started":"2025-07-20T00:37:48.352909Z","shell.execute_reply":"2025-07-20T00:37:50.616034Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X = train.drop(columns=[\"timestamp\", \"label\"], errors=\"ignore\")\ny = train[\"label\"]\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-20T00:37:50.618699Z","iopub.execute_input":"2025-07-20T00:37:50.619019Z","iopub.status.idle":"2025-07-20T00:37:53.023844Z","shell.execute_reply.started":"2025-07-20T00:37:50.618988Z","shell.execute_reply":"2025-07-20T00:37:53.021711Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y = train['label']\n\n# 1 = موجب أو صفر، 0 = سالب\ny_class = (y >= 0).astype(int)\nfrom sklearn.model_selection import train_test_split\n\nX_train, X_val, y_train, y_val = train_test_split(\n    X, y_class, test_size=0.2, random_state=42, stratify=y_class\n)\nfrom sklearn.ensemble import RandomForestClassifier\n\nmodel = RandomForestClassifier(random_state=42)\nmodel.fit(X_train, y_train)\n\n# التوقع على مجموعة التحقق\ny_pred = model.predict(X_val)\nfrom sklearn.metrics import classification_report, confusion_matrix\n\nprint(confusion_matrix(y_val, y_pred))\nprint(classification_report(y_val, y_pred))\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-20T00:37:53.027221Z","iopub.execute_input":"2025-07-20T00:37:53.027615Z","execution_failed":"2025-07-20T00:38:06.055Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(y.value_counts())\n# Filter out rare classes with only one instance\ncounts = y.value_counts()\nvalid_classes = counts[counts > 1].index\nmask = y.isin(valid_classes)\n\nX_filtered = X[mask]\ny_filtered = y[mask]\n\nX_train, X_val, y_train, y_val = train_test_split(\n    X_filtered, y_filtered, test_size=0.2, random_state=42, stratify=y_filtered\n)\n","metadata":{"trusted":true,"execution":{"execution_failed":"2025-07-20T00:38:06.055Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\nX_train, X_val, y_train, y_val = train_test_split(\n    X, y, test_size=0.2, random_state=42\n)\n\n","metadata":{"trusted":true,"execution":{"execution_failed":"2025-07-20T00:38:06.055Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.ensemble import RandomForestClassifier\n\nmodel = RandomForestClassifier(n_estimators=100, random_state=42)\nmodel.fit(X_train, y_train)\n","metadata":{"trusted":true,"execution":{"execution_failed":"2025-07-20T00:38:06.055Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.metrics import classification_report, accuracy_score\n\ny_pred = model.predict(X_val)\nprint(classification_report(y_val, y_pred))\nprint(\"Accuracy:\", accuracy_score(y_val, y_pred))\n","metadata":{"trusted":true,"execution":{"execution_failed":"2025-07-20T00:38:06.056Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_test = test.drop(columns=[\"timestamp\", \"label\"], errors=\"ignore\")\ny_test_pred = model.predict(X_test)\n\nsubmission = sample_submission.copy()\nsubmission[\"label\"] = y_test_pred\nsubmission.to_csv(\"submission.csv\", index=False)\n","metadata":{"trusted":true,"execution":{"execution_failed":"2025-07-20T00:38:06.056Z"}},"outputs":[],"execution_count":null}]}