{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"}],"dockerImageVersionId":30804,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install -q pytorch-tabnet colorama catboost lightgbm xgboost\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-20T09:44:40.396146Z","iopub.execute_input":"2024-12-20T09:44:40.396571Z","iopub.status.idle":"2024-12-20T09:44:51.028207Z","shell.execute_reply.started":"2024-12-20T09:44:40.396533Z","shell.execute_reply":"2024-12-20T09:44:51.026292Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"1.Import Libraries","metadata":{}},{"cell_type":"code","source":"# ==========================\n# 1. Import Libraries\n# ==========================\nimport pandas as pd\nimport numpy as np\nimport os\nfrom glob import glob\nfrom sklearn.base import clone\nfrom sklearn.model_selection import StratifiedKFold, train_test_split\nfrom sklearn.metrics import cohen_kappa_score, mean_squared_error\nfrom sklearn.impute import SimpleImputer, KNNImputer\nfrom sklearn.preprocessing import LabelEncoder, StandardScaler\nfrom sklearn.ensemble import VotingRegressor, RandomForestRegressor, GradientBoostingRegressor\nfrom sklearn.pipeline import Pipeline\nfrom lightgbm import LGBMRegressor\nfrom xgboost import XGBRegressor\nfrom catboost import CatBoostRegressor\nfrom scipy.optimize import minimize\nfrom scipy.stats import mode\nfrom concurrent.futures import ThreadPoolExecutor\nfrom tqdm import tqdm\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport warnings\nimport torch  # For checking CUDA availability\nimport optuna  # For hyperparameter optimization\n    \n# Suppress warnings for cleaner output\nwarnings.filterwarnings('ignore')\npd.options.display.max_columns = None\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-20T09:44:51.030861Z","iopub.execute_input":"2024-12-20T09:44:51.031297Z","iopub.status.idle":"2024-12-20T09:44:51.041579Z","shell.execute_reply.started":"2024-12-20T09:44:51.031258Z","shell.execute_reply":"2024-12-20T09:44:51.040295Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"2.Define Helper Functions","metadata":{}},{"cell_type":"code","source":"# ==========================\n# 2. Define Helper Functions\n# ==========================\n# Evaluation Metric\ndef quadratic_weighted_kappa(y_true, y_pred):\n    return cohen_kappa_score(y_true, y_pred, weights='quadratic')\n\n# Threshold Rounder\ndef threshold_Rounder(oof_non_rounded, thresholds):\n    return np.where(oof_non_rounded < thresholds[0], 0,\n                    np.where(oof_non_rounded < thresholds[1], 1,\n                             np.where(oof_non_rounded < thresholds[2], 2, 3)))\n\n# Prediction Evaluation for Threshold Optimization\ndef evaluate_predictions(thresholds, y_true, oof_non_rounded):\n    rounded_p = threshold_Rounder(oof_non_rounded, thresholds)\n    return -quadratic_weighted_kappa(y_true, rounded_p)\n\n# Function to Create Submission File\ndef create_submission(test_ids, predictions, filename='submission.csv'):\n    submission = pd.DataFrame({\n        'id': test_ids,\n        'sii': predictions\n    })\n    submission.to_csv(filename, index=False)\n    print(f\"Submission file '{filename}' created successfully.\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-20T09:44:51.043412Z","iopub.execute_input":"2024-12-20T09:44:51.043793Z","iopub.status.idle":"2024-12-20T09:44:51.066132Z","shell.execute_reply.started":"2024-12-20T09:44:51.043756Z","shell.execute_reply":"2024-12-20T09:44:51.064598Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"3.Load and Merge Data","metadata":{}},{"cell_type":"code","source":"# ==========================\n# 3. Load and Merge Data\n# ==========================\n# Define paths\ntrain_path = '/kaggle/input/child-mind-institute-problematic-internet-use/train.csv'\ntest_path = '/kaggle/input/child-mind-institute-problematic-internet-use/test.csv'\nsample_path = '/kaggle/input/child-mind-institute-problematic-internet-use/sample_submission.csv'\nts_train_path = \"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\"\nts_test_path = \"/kaggle/input/child-mind-institute-problematic-internet-use/series_test.parquet\"\n\n# Load datasets\nprint(\"Loading datasets...\")\ntrain = pd.read_csv(train_path)\ntest = pd.read_csv(test_path)\nsample = pd.read_csv(sample_path)\n\n# Function to process time-series data\ndef process_time_series(filename, dirname):\n    df = pd.read_parquet(os.path.join(dirname, filename, 'part-0.parquet'))\n    df.drop('step', axis=1, inplace=True)\n    return df.describe().values.reshape(-1), filename.split('=')[1]\n\n# Function to load time-series data\ndef load_time_series(dirname):\n    ids = os.listdir(dirname)\n    with ThreadPoolExecutor() as executor:\n        results = list(tqdm(executor.map(lambda fname: process_time_series(fname, dirname), ids), total=len(ids)))\n    stats, indexes = zip(*results)\n    df = pd.DataFrame(stats, columns=[f\"stat_{i}\" for i in range(len(results[0][0]))])\n    df['id'] = indexes\n    return df\n\n# Load time-series features\nprint(\"Loading time-series data...\")\ntrain_ts = load_time_series(ts_train_path)\ntest_ts = load_time_series(ts_test_path)\n\n# Merge time-series data with train and test\nprint(\"Merging time-series data with main datasets...\")\ntrain = pd.merge(train, train_ts, how=\"left\", on='id')\ntest = pd.merge(test, test_ts, how=\"left\", on='id')\n\n# Drop 'id' as it's no longer needed\ntrain = train.drop('id', axis=1)\ntest = test.drop('id', axis=1)\n\nprint(f'Train Shape : {train.shape} || Test Shape : {test.shape}')\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-20T09:44:51.068513Z","iopub.execute_input":"2024-12-20T09:44:51.069033Z","iopub.status.idle":"2024-12-20T09:47:10.355889Z","shell.execute_reply.started":"2024-12-20T09:44:51.068995Z","shell.execute_reply":"2024-12-20T09:47:10.354609Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"4.Handle Missing Target Values","metadata":{}},{"cell_type":"code","source":"# ==========================\n# 4. Handle Missing Target Values\n# ==========================\n# Check for missing values in target\nprint(\"Checking for missing values in target 'sii'...\")\nmissing_target = train['sii'].isnull().sum()\nprint(f\"Number of missing 'sii' values: {missing_target}\")\n\n# Drop rows with missing 'sii'\ntrain = train.dropna(subset=['sii'])\nprint(f\"Train shape after dropping missing 'sii': {train.shape}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-20T09:47:10.357370Z","iopub.execute_input":"2024-12-20T09:47:10.357818Z","iopub.status.idle":"2024-12-20T09:47:10.371399Z","shell.execute_reply.started":"2024-12-20T09:47:10.357768Z","shell.execute_reply":"2024-12-20T09:47:10.370092Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"5.Feature Engineering","metadata":{}},{"cell_type":"code","source":"# ==========================\n# 5. Feature Engineering\n# ==========================\n# Feature engineering: create interaction terms and ratios\ndef feature_engineering(df):\n    # Avoid division by zero by adding a small constant (1e-6)\n    df['BMI_Age'] = df['Physical-BMI'] * df['Basic_Demos-Age']\n    df['Internet_Hours_Age'] = df['PreInt_EduHx-computerinternet_hoursday'] * df['Basic_Demos-Age']\n    df['BMI_Internet_Hours'] = df['Physical-BMI'] * df['PreInt_EduHx-computerinternet_hoursday']\n    df['BFP_BMI'] = df['BIA-BIA_Fat'] / (df['BIA-BIA_BMI'] + 1e-6)\n    df['FFMI_BFP'] = df['BIA-BIA_FFMI'] / (df['BIA-BIA_Fat'] + 1e-6)\n    df['FMI_BFP'] = df['BIA-BIA_FMI'] / (df['BIA-BIA_Fat'] + 1e-6)\n    df['LST_TBW'] = df['BIA-BIA_LST'] / (df['BIA-BIA_TBW'] + 1e-6)\n    df['BFP_BMR'] = df['BIA-BIA_Fat'] * df['BIA-BIA_BMR']\n    df['BFP_DEE'] = df['BIA-BIA_Fat'] * df['BIA-BIA_DEE']\n    df['BMR_Weight'] = df['BIA-BIA_BMR'] / (df['Physical-Weight'] + 1e-6)\n    df['DEE_Weight'] = df['BIA-BIA_DEE'] / (df['Physical-Weight'] + 1e-6)\n    df['SMM_Height'] = df['BIA-BIA_SMM'] / (df['Physical-Height'] + 1e-6)\n    df['Muscle_to_Fat'] = df['BIA-BIA_SMM'] / (df['BIA-BIA_FMI'] + 1e-6)\n    df['Hydration_Status'] = df['BIA-BIA_TBW'] / (df['Physical-Weight'] + 1e-6)\n    df['ICW_TBW'] = df['BIA-BIA_ICW'] / (df['BIA-BIA_TBW'] + 1e-6)\n    return df\n\n# Apply feature engineering\nprint(\"Applying feature engineering...\")\ntrain = feature_engineering(train)\ntest = feature_engineering(test)\n\nprint(\"Feature engineering completed.\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-20T09:47:10.373187Z","iopub.execute_input":"2024-12-20T09:47:10.374411Z","iopub.status.idle":"2024-12-20T09:47:10.408332Z","shell.execute_reply.started":"2024-12-20T09:47:10.374356Z","shell.execute_reply":"2024-12-20T09:47:10.407085Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"6.Handle Categorical Variables","metadata":{}},{"cell_type":"code","source":"# ==========================\n# 6. Handle Categorical Variables\n# ==========================\n# Define categorical columns\ncat_cols = [\n    'Basic_Demos-Enroll_Season', 'CGAS-Season', 'Physical-Season', \n    'Fitness_Endurance-Season', 'FGC-Season', 'BIA-Season', \n    'PAQ_A-Season', 'PAQ_C-Season', 'SDS-Season', 'PreInt_EduHx-Season',\n    'PCIAT-Season'  # Added 'PCIAT-Season' to handle its encoding\n]\n\n# Fill missing values and encode categorical variables\ndef encode_categorical(df, cat_cols):\n    for col in cat_cols:\n        if col in df.columns:\n            df[col] = df[col].fillna('Missing').astype(str)\n            le = LabelEncoder()\n            df[col] = le.fit_transform(df[col])\n    return df\n\nprint(\"Encoding categorical variables...\")\ntrain = encode_categorical(train, cat_cols)\ntest = encode_categorical(test, cat_cols)\nprint(\"Categorical variables encoded successfully.\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-20T09:47:10.409555Z","iopub.execute_input":"2024-12-20T09:47:10.409971Z","iopub.status.idle":"2024-12-20T09:47:10.453564Z","shell.execute_reply.started":"2024-12-20T09:47:10.409931Z","shell.execute_reply":"2024-12-20T09:47:10.452064Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"7.Handle Missing values in Features","metadata":{}},{"cell_type":"code","source":"# ==========================\n# 7. Handle Missing Values in Features (Corrected)\n# ==========================\n# Identify numerical columns\nnum_cols = train.select_dtypes(include=['int64', 'float64']).columns.tolist()\nnum_cols.remove('sii')  # Exclude target\n\nprint(\"Handling missing values in numerical features...\")\n\n# Identify columns present in train but missing in test\nmissing_in_test = set(num_cols) - set(test.columns)\nprint(f\"Number of missing numerical columns in test: {len(missing_in_test)}\")\nprint(\"Missing columns in test:\", missing_in_test)\n\n# Add missing columns to test with median values from train\nfor col in missing_in_test:\n    median_value = train[col].median()\n    test[col] = median_value\n    print(f\"Added missing column '{col}' to test with median value: {median_value}\")\n\nprint(f\"Total {len(missing_in_test)} missing numerical columns added to test.\")\n\n# Separate features and target\nX = train.drop(['sii'], axis=1)\ny = train['sii']\n\n# Align X and test\nX, test = X.align(test, join='left', axis=1, fill_value=0)\n\nprint(f\"Train Shape after alignment: {X.shape}\")\nprint(f\"Test Shape after alignment: {test.shape}\")\n\n# Re-define numerical columns after alignment\nnum_cols = X.select_dtypes(include=['int64', 'float64']).columns.tolist()\n\nprint(f\"Total numerical columns to impute: {len(num_cols)}\")\nprint(\"Numerical columns:\", num_cols)\n\n# Initialize imputer\nimputer = KNNImputer(n_neighbors=5)\n\n# Fit imputer on training data and transform both X and test\nX[num_cols] = imputer.fit_transform(X[num_cols])\ntest[num_cols] = imputer.transform(test[num_cols])\n\nprint(\"Missing values imputed successfully.\")\n\n# Assign train features and target\ntrain_features = X.copy()\ntrain_target = y.copy()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-20T09:47:10.455887Z","iopub.execute_input":"2024-12-20T09:47:10.456369Z","iopub.status.idle":"2024-12-20T09:47:18.712942Z","shell.execute_reply.started":"2024-12-20T09:47:10.456318Z","shell.execute_reply":"2024-12-20T09:47:18.711527Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"8.Define Model Training with Cross_Validation","metadata":{}},{"cell_type":"code","source":"# ==========================\n# 8. Define Model Training with Cross-Validation\n# ==========================\n# Define training function\ndef TrainML(model_class, test_data, n_splits=5, seed=42):\n    X = train_features\n    y = train_target.astype(int)\n    \n    SKF = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=seed)\n    \n    oof_non_rounded = np.zeros(len(y), dtype=float) \n    test_preds = np.zeros((len(test_data), n_splits))\n    \n    for fold, (train_idx, val_idx) in enumerate(tqdm(SKF.split(X, y), desc=\"Training Folds\", total=n_splits)):\n        X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]\n        y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]\n        \n        model = clone(model_class)\n        model.fit(X_train, y_train)\n        \n        y_val_pred = model.predict(X_val)\n        oof_non_rounded[val_idx] = y_val_pred\n        \n        # Predict on test data\n        test_preds[:, fold] = model.predict(test_data)\n        \n        # Calculate Validation QWK\n        y_val_pred_rounded = np.clip(y_val_pred.round().astype(int), 0, 3)\n        val_kappa = quadratic_weighted_kappa(y_val, y_val_pred_rounded)\n        print(f\"Fold {fold+1} - Validation QWK: {val_kappa:.4f}\")\n    \n    # Optimize thresholds\n    print(\"Optimizing thresholds...\")\n    KappaOptimizer = minimize(\n        evaluate_predictions,\n        x0=[0.5, 1.5, 2.5],\n        args=(y, oof_non_rounded), \n        method='Nelder-Mead'\n    )\n    assert KappaOptimizer.success, \"Optimization did not converge.\"\n    \n    # Apply optimized thresholds\n    oof_tuned = threshold_Rounder(oof_non_rounded, KappaOptimizer.x)\n    tKappa = quadratic_weighted_kappa(y, oof_tuned)\n    print(f\"Optimized QWK Score: {tKappa:.3f}\")\n    \n    # Average test predictions and apply thresholds\n    tpm = test_preds.mean(axis=1)\n    tpTuned = threshold_Rounder(tpm, KappaOptimizer.x)\n    tpTuned = np.clip(tpTuned, 0, 3).astype(int)  # Ensure within [0,3]\n    \n    return tpTuned\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-20T09:47:18.715029Z","iopub.execute_input":"2024-12-20T09:47:18.715530Z","iopub.status.idle":"2024-12-20T09:47:18.731040Z","shell.execute_reply.started":"2024-12-20T09:47:18.715478Z","shell.execute_reply":"2024-12-20T09:47:18.729740Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"9.Intialize Models","metadata":{}},{"cell_type":"code","source":"# ==========================\n# 9. Initialize Models\n# ==========================\n# Define model parameters\n\n# LightGBM Parameters\nParams_LightGBM = {\n    'learning_rate': 0.1,\n    'max_depth': 10,\n    'num_leaves': 100,\n    'min_data_in_leaf': 10,\n    'feature_fraction': 0.5,\n    'bagging_fraction': 0.5,\n    'bagging_freq': 2,\n    'lambda_l1': 1,\n    'lambda_l2': 1e-04,\n    'verbose': -1,\n    'n_estimators': 200,\n    'random_state': 42\n}\n\n# XGBoost Parameters\nParams_XGBoost = {\n    'learning_rate': 0.05,\n    'max_depth': 6,\n    'n_estimators': 200,\n    'subsample': 0.8,\n    'colsample_bytree': 0.8,\n    'reg_alpha': 1,\n    'reg_lambda': 5,\n    'random_state': 42,\n    'tree_method': 'gpu_hist' if torch.cuda.is_available() else 'auto'\n}\n\n# CatBoost Parameters\nParams_CatBoost = {\n    'learning_rate': 0.05,\n    'depth': 6,\n    'iterations': 200,\n    'random_seed': 42,\n    'verbose': 0,\n    'l2_leaf_reg': 10,\n    'task_type': 'GPU' if torch.cuda.is_available() else 'CPU'\n}\n\n# Initialize models\nprint(\"Initializing models...\")\nLightGBM_model = LGBMRegressor(**Params_LightGBM)\nXGBoost_model = XGBRegressor(**Params_XGBoost)\nCatBoost_model = CatBoostRegressor(**Params_CatBoost)\n\nprint(\"Models initialized successfully.\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-20T09:47:18.734681Z","iopub.execute_input":"2024-12-20T09:47:18.735163Z","iopub.status.idle":"2024-12-20T09:47:18.754103Z","shell.execute_reply.started":"2024-12-20T09:47:18.735125Z","shell.execute_reply":"2024-12-20T09:47:18.752875Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"10.Train Individual Models and Create Ensemble","metadata":{}},{"cell_type":"code","source":"# ==========================\n# 10. Train Individual Models and Create Ensemble\n# ==========================\n# Train individual models and get predictions\nprint(\"\\nTraining LightGBM...\")\npred_lgb = TrainML(LightGBM_model, test)\n\nprint(\"\\nTraining XGBoost...\")\npred_xgb = TrainML(XGBoost_model, test)\n\nprint(\"\\nTraining CatBoost...\")\npred_cat = TrainML(CatBoost_model, test)\n\n# Combine predictions\ncombined_preds = np.vstack([pred_lgb, pred_xgb, pred_cat])\n\n# Majority Voting\nprint(\"\\nPerforming majority voting...\")\nfinal_preds = mode(combined_preds, axis=0).mode.flatten()\n\n# Ensure predictions are within the valid range [0,3]\nfinal_preds = np.clip(final_preds, 0, 3).astype(int)\n\n# Prepare submission\nprint(\"\\nPreparing submission file...\")\ncreate_submission(sample['id'], final_preds, filename='submission.csv')\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-20T09:47:18.755375Z","iopub.execute_input":"2024-12-20T09:47:18.755822Z","iopub.status.idle":"2024-12-20T09:47:50.959116Z","shell.execute_reply.started":"2024-12-20T09:47:18.755785Z","shell.execute_reply":"2024-12-20T09:47:50.957898Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"11.Ensembling with Additional Models","metadata":{}},{"cell_type":"code","source":"# Initialize additional models\n\n# Random Forest Parameters\nParams_RF = {\n    'n_estimators': 100,\n    'random_state': 42,\n    'n_jobs': -1\n}\n\n# Gradient Boosting Parameters\nParams_GB = {\n    'n_estimators': 100,\n    'learning_rate': 0.1,\n    'max_depth': 3,\n    'random_state': 42\n}\n\n# Initialize additional models\nRF_model = RandomForestRegressor(**Params_RF)\nGB_model = GradientBoostingRegressor(**Params_GB)\n\n# Train additional models\nprint(\"\\nTraining Random Forest...\")\npred_rf = TrainML(RF_model, test)\n\nprint(\"\\nTraining Gradient Boosting...\")\npred_gb = TrainML(GB_model, test)\n\n# Combine all predictions\ncombined_preds_extended = np.vstack([pred_lgb, pred_xgb, pred_cat, pred_rf, pred_gb])\n\n# Majority Voting\nfinal_preds_extended = mode(combined_preds_extended, axis=0).mode.flatten()\n\n# Ensure predictions are within the valid range [0,3]\nfinal_preds_extended = np.clip(final_preds_extended, 0, 3).astype(int)\n\n# Prepare extended submission\ncreate_submission(sample['id'], final_preds_extended, filename='submission_extended.csv')\n","metadata":{"execution":{"iopub.status.busy":"2024-12-20T09:47:50.961100Z","iopub.execute_input":"2024-12-20T09:47:50.961587Z","iopub.status.idle":"2024-12-20T09:48:18.155299Z","shell.execute_reply.started":"2024-12-20T09:47:50.961521Z","shell.execute_reply":"2024-12-20T09:48:18.153920Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"12.Visualize Feature Importances","metadata":{}},{"cell_type":"code","source":"# Example with LightGBM\nLightGBM_model.fit(train.drop(['sii'], axis=1), train['sii'])\nfeature_importance = pd.DataFrame({\n    'Feature': LightGBM_model.feature_name_,\n    'Importance': LightGBM_model.feature_importances_\n}).sort_values(by='Importance', ascending=False)\n\n# Plot top 20 features\nplt.figure(figsize=(10, 12))\nsns.barplot(x='Importance', y='Feature', data=feature_importance.head(20))\nplt.title(\"Top 20 Feature Importances from LightGBM\")\nplt.tight_layout()\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-20T09:48:18.156944Z","iopub.execute_input":"2024-12-20T09:48:18.157296Z","iopub.status.idle":"2024-12-20T09:48:20.401403Z","shell.execute_reply.started":"2024-12-20T09:48:18.157264Z","shell.execute_reply":"2024-12-20T09:48:20.399956Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"13.Hyperparameter Optimization with Optuna ","metadata":{}},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}