{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":77090,"databundleVersionId":8412854,"sourceType":"competition"}],"dockerImageVersionId":30918,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\n# Import necessary libraries\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import f1_score\nimport warnings\nwarnings.filterwarnings('ignore')\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-04-04T04:44:19.718915Z","iopub.execute_input":"2025-04-04T04:44:19.719339Z","iopub.status.idle":"2025-04-04T04:44:20.912761Z","shell.execute_reply.started":"2025-04-04T04:44:19.719306Z","shell.execute_reply":"2025-04-04T04:44:20.911654Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Problem Understanding","metadata":{}},{"cell_type":"code","source":"# Load the training data\ntrain_df = pd.read_csv('/kaggle/input/desafo-clasificacin-de-proveedores-activos/train_202201-202402.csv')\n\n# Display the first few rows\nprint(train_df.head())\n\n# Check the shape of the data\nprint(f\"Shape of the training data: {train_df.shape}\")\n\n# Check data types and missing values\nprint(train_df.info())\n\n# Check basic statistics\nprint(train_df.describe())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T04:44:35.595166Z","iopub.execute_input":"2025-04-04T04:44:35.595719Z","iopub.status.idle":"2025-04-04T04:44:39.972375Z","shell.execute_reply.started":"2025-04-04T04:44:35.595681Z","shell.execute_reply":"2025-04-04T04:44:39.971236Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load the sample submission file\nsample_submission = pd.read_csv('/kaggle/input/desafo-clasificacin-de-proveedores-activos/sample_submission.csv')\n\n# Display the first few rows\nprint(sample_submission.head())\n\n# Check the shape of the submission file\nprint(f\"Shape of the sample submission: {sample_submission.shape}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T04:44:59.425307Z","iopub.execute_input":"2025-04-04T04:44:59.425647Z","iopub.status.idle":"2025-04-04T04:44:59.444414Z","shell.execute_reply.started":"2025-04-04T04:44:59.425614Z","shell.execute_reply":"2025-04-04T04:44:59.443155Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Data Understanding and Preprocessing","metadata":{}},{"cell_type":"code","source":"# Convert date columns to datetime\ntrain_df['FECHA_FORMALIZACIÓN'] = pd.to_datetime(train_df['FECHA_FORMALIZACIÓN'])\ntrain_df['FECHA_ÚLTIMO_ESTADO'] = pd.to_datetime(train_df['FECHA_ÚLTIMO_ESTADO'])\n\n# Extract month and year from FECHA_FORMALIZACIÓN to create CODMES\ntrain_df['CODMES'] = train_df['FECHA_FORMALIZACIÓN'].dt.strftime('%Y%m')\n\n# Create the CODMES_RUC_PROVEEDOR column as in the submission format\ntrain_df['CODMES_RUC_PROVEEDOR'] = train_df['CODMES'] + '_' + train_df['RUC_PROVEEDOR'].astype(str)\n\n# Check the unique months in the dataset\nprint(\"Unique months in the dataset:\")\nprint(train_df['CODMES'].unique())\n\n# Count orders by month\nmonthly_orders = train_df.groupby('CODMES').size()\nprint(\"\\nNumber of orders by month:\")\nprint(monthly_orders)\n\n# Count unique suppliers by month\nmonthly_suppliers = train_df.groupby('CODMES')['RUC_PROVEEDOR'].nunique()\nprint(\"\\nNumber of unique suppliers by month:\")\nprint(monthly_suppliers)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T04:46:47.217305Z","iopub.execute_input":"2025-04-04T04:46:47.217704Z","iopub.status.idle":"2025-04-04T04:46:48.818193Z","shell.execute_reply.started":"2025-04-04T04:46:47.217672Z","shell.execute_reply":"2025-04-04T04:46:48.817092Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Create a dataframe with unique supplier-month combinations\nsupplier_month_df = train_df.groupby(['CODMES', 'RUC_PROVEEDOR']).size().reset_index(name='order_count')\n\n# Create a pivot table to see which suppliers received orders in which months\npivot_df = supplier_month_df.pivot_table(\n    index='RUC_PROVEEDOR', \n    columns='CODMES', \n    values='order_count',\n    fill_value=0\n)\n\n# Convert to binary (1 if supplier received at least one order in that month, 0 otherwise)\npivot_binary_df = (pivot_df > 0).astype(int)\n\n# Display the first few rows\nprint(\"\\nSupplier-Month Order Matrix (1 = received order, 0 = no order):\")\nprint(pivot_binary_df.head())\n\n# Get all unique suppliers\nall_suppliers = train_df['RUC_PROVEEDOR'].unique()\nprint(f\"\\nTotal number of unique suppliers: {len(all_suppliers)}\")\n\n# Get all unique months\nall_months = sorted(train_df['CODMES'].unique())\nprint(f\"\\nTotal number of unique months: {len(all_months)}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T04:47:30.665856Z","iopub.execute_input":"2025-04-04T04:47:30.666224Z","iopub.status.idle":"2025-04-04T04:47:30.765271Z","shell.execute_reply.started":"2025-04-04T04:47:30.666194Z","shell.execute_reply":"2025-04-04T04:47:30.764071Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Calculate how many months each supplier was active\nsupplier_activity = pivot_binary_df.sum(axis=1).reset_index()\nsupplier_activity.columns = ['RUC_PROVEEDOR', 'active_months']\n\nprint(\"\\nSupplier activity distribution:\")\nprint(supplier_activity['active_months'].value_counts().sort_index())\n\n# Plot the distribution\nplt.figure(figsize=(12, 6))\nsns.histplot(supplier_activity['active_months'], bins=len(all_months), kde=False)\nplt.title('Distribution of Supplier Activity (Number of Active Months)')\nplt.xlabel('Number of Active Months')\nplt.ylabel('Number of Suppliers')\nplt.xticks(range(1, len(all_months)+1))\nplt.grid(True, alpha=0.3)\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T04:48:28.680345Z","iopub.execute_input":"2025-04-04T04:48:28.680758Z","iopub.status.idle":"2025-04-04T04:48:29.181078Z","shell.execute_reply.started":"2025-04-04T04:48:28.680694Z","shell.execute_reply":"2025-04-04T04:48:29.179837Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Function to create features for a given month\ndef create_features_for_month(target_month, history_months, pivot_df):\n    # Convert the pivot table to a DataFrame for easier manipulation\n    activity_df = pivot_df.copy().reset_index()\n    \n    features = []\n    \n    for supplier in activity_df['RUC_PROVEEDOR']:\n        supplier_data = activity_df[activity_df['RUC_PROVEEDOR'] == supplier]\n        \n        # Basic features\n        row = {\n            'RUC_PROVEEDOR': supplier,\n            'target_month': target_month\n        }\n        \n        # Activity in previous months\n        for i, month in enumerate(history_months):\n            if month in pivot_df.columns:\n                row[f'active_{i+1}_months_ago'] = supplier_data[month].values[0]\n            else:\n                row[f'active_{i+1}_months_ago'] = 0\n        \n        # Calculate activity patterns\n        history_values = [supplier_data[month].values[0] if month in pivot_df.columns else 0 for month in history_months]\n        \n        # Total active months in history\n        row['total_active_months'] = sum(history_values)\n        \n        # Active in last month\n        row['active_last_month'] = history_values[0] if history_values else 0\n        \n        # Active in any of last 3 months\n        row['active_in_last_3_months'] = 1 if sum(history_values[:3]) > 0 else 0\n        \n        # Percentage of active months\n        row['active_month_ratio'] = sum(history_values) / len(history_values) if history_values else 0\n        \n        # Trend: increasing or decreasing activity\n        if len(history_values) >= 3:\n            recent = sum(history_values[:3])\n            older = sum(history_values[3:6]) if len(history_values) >= 6 else sum(history_values[3:])\n            row['activity_trend'] = recent - older\n        else:\n            row['activity_trend'] = 0\n            \n        features.append(row)\n    \n    return pd.DataFrame(features)\n\n# Let's test this for one month\n# We'll use February 2024 (202402) as our target month and use previous months as history\nall_months = sorted(train_df['CODMES'].unique())\nprint(\"All months in chronological order:\")\nprint(all_months)\n\n# Choose a test month\ntest_month = '202402'  # February 2024\n# Get previous months for history (up to 6 months)\nhistory_months = [m for m in all_months if m < test_month][-6:]\nhistory_months.reverse()  # Most recent first\n\nprint(f\"\\nTarget month: {test_month}\")\nprint(f\"History months (most recent first): {history_months}\")\n\n# Create features for the test month\ntest_features = create_features_for_month(test_month, history_months, pivot_binary_df)\nprint(\"\\nFeatures for prediction (first few rows):\")\nprint(test_features.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T04:49:09.286722Z","iopub.execute_input":"2025-04-04T04:49:09.287124Z","iopub.status.idle":"2025-04-04T04:49:10.978177Z","shell.execute_reply.started":"2025-04-04T04:49:09.287095Z","shell.execute_reply":"2025-04-04T04:49:10.976802Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load the sample submission to get the required suppliers for March and April 2024\nsample_sub = pd.read_csv('/kaggle/input/desafo-clasificacin-de-proveedores-activos/sample_submission.csv')\n\n# Extract the CODMES and RUC_PROVEEDOR from the CODMES_RUC_PROVEEDOR column\nsample_sub[['CODMES', 'RUC_PROVEEDOR']] = sample_sub['CODMES_RUC_PROVEEDOR'].str.split('_', expand=True)\nsample_sub['RUC_PROVEEDOR'] = sample_sub['RUC_PROVEEDOR'].astype(int)\n\n# Get unique months in the submission file\nsubmission_months = sample_sub['CODMES'].unique()\nprint(f\"\\nMonths to predict: {submission_months}\")\n\n# Get unique suppliers in the submission file\nsubmission_suppliers = sample_sub['RUC_PROVEEDOR'].unique()\nprint(f\"Number of suppliers to predict: {len(submission_suppliers)}\")\n\n# Check if all submission suppliers are in our training data\nsuppliers_in_train = set(train_df['RUC_PROVEEDOR'].unique())\nsuppliers_in_submission = set(submission_suppliers)\nmissing_suppliers = suppliers_in_submission - suppliers_in_train\n\nprint(f\"Number of suppliers in submission not found in training data: {len(missing_suppliers)}\")\nif len(missing_suppliers) > 0:\n    print(\"First few missing suppliers:\", list(missing_suppliers)[:5])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T04:49:45.928799Z","iopub.execute_input":"2025-04-04T04:49:45.929252Z","iopub.status.idle":"2025-04-04T04:49:45.962186Z","shell.execute_reply.started":"2025-04-04T04:49:45.929217Z","shell.execute_reply":"2025-04-04T04:49:45.961086Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Feature Engineering and Model Building","metadata":{}},{"cell_type":"code","source":"# Function to prepare data for all months\ndef prepare_all_data(pivot_binary_df, history_window=6):\n    all_months = sorted(pivot_binary_df.columns)\n    all_data = []\n    \n    # Start from the 7th month to have enough history\n    for i in range(history_window, len(all_months)):\n        target_month = all_months[i]\n        history_months = all_months[i-history_window:i]\n        history_months.reverse()  # Most recent first\n        \n        # Create features\n        month_features = create_features_for_month(target_month, history_months, pivot_binary_df)\n        \n        # Add target (whether supplier was active in the target month)\n        month_features['TARGET'] = month_features.apply(\n            lambda row: pivot_binary_df.loc[row['RUC_PROVEEDOR'], target_month], \n            axis=1\n        )\n        \n        all_data.append(month_features)\n    \n    return pd.concat(all_data, ignore_index=True)\n\n# Prepare all data\nall_data = prepare_all_data(pivot_binary_df)\n\nprint(\"Prepared data shape:\", all_data.shape)\nprint(\"First few rows:\")\nprint(all_data.head())\n\n# Check class distribution\nprint(\"\\nTarget distribution:\")\nprint(all_data['TARGET'].value_counts(normalize=True))\n\n# Split the data into features and target\nX = all_data.drop(['RUC_PROVEEDOR', 'target_month', 'TARGET'], axis=1)\ny = all_data['TARGET']\n\n# Split into training and validation sets\nX_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)\n\nprint(\"\\nTraining set shape:\", X_train.shape)\nprint(\"Validation set shape:\", X_val.shape)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T04:55:04.635977Z","iopub.execute_input":"2025-04-04T04:55:04.636345Z","iopub.status.idle":"2025-04-04T04:55:38.022331Z","shell.execute_reply.started":"2025-04-04T04:55:04.636318Z","shell.execute_reply":"2025-04-04T04:55:38.021235Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier\nfrom sklearn.metrics import classification_report, confusion_matrix, f1_score\nfrom sklearn.preprocessing import StandardScaler\n\n# Scale the features\nscaler = StandardScaler()\nX_train_scaled = scaler.fit_transform(X_train)\nX_val_scaled = scaler.transform(X_val)\n\n# Train a Random Forest model\nrf_model = RandomForestClassifier(n_estimators=100, random_state=42, class_weight='balanced')\nrf_model.fit(X_train_scaled, y_train)\n\n# Make predictions\ny_pred_rf = rf_model.predict(X_val_scaled)\n\n# Evaluate the model\nprint(\"\\nRandom Forest Model Evaluation:\")\nprint(\"F1 Score:\", f1_score(y_val, y_pred_rf))\nprint(\"\\nClassification Report:\")\nprint(classification_report(y_val, y_pred_rf))\n\n# Train a Gradient Boosting model\ngb_model = GradientBoostingClassifier(n_estimators=100, random_state=42)\ngb_model.fit(X_train_scaled, y_train)\n\n# Make predictions\ny_pred_gb = gb_model.predict(X_val_scaled)\n\n# Evaluate the model\nprint(\"\\nGradient Boosting Model Evaluation:\")\nprint(\"F1 Score:\", f1_score(y_val, y_pred_gb))\nprint(\"\\nClassification Report:\")\nprint(classification_report(y_val, y_pred_gb))\n\n# Feature importance\nfeature_importance = pd.DataFrame({\n    'Feature': X.columns,\n    'Importance': rf_model.feature_importances_\n}).sort_values('Importance', ascending=False)\n\nprint(\"\\nFeature Importance:\")\nprint(feature_importance)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T04:56:32.079405Z","iopub.execute_input":"2025-04-04T04:56:32.079787Z","iopub.status.idle":"2025-04-04T04:56:36.063491Z","shell.execute_reply.started":"2025-04-04T04:56:32.079761Z","shell.execute_reply":"2025-04-04T04:56:36.062311Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Function to prepare prediction data for a specific month\ndef prepare_prediction_data(target_month, suppliers, pivot_df):\n    # Get the 6 most recent months before the target month\n    all_months = sorted(pivot_df.columns)\n    history_months = [m for m in all_months if m < target_month][-6:]\n    history_months.reverse()  # Most recent first\n    \n    # Create features\n    features = []\n    \n    for supplier in suppliers:\n        # Basic features\n        row = {\n            'RUC_PROVEEDOR': supplier,\n            'target_month': target_month\n        }\n        \n        # Activity in previous months\n        for i, month in enumerate(history_months):\n            if month in pivot_df.columns and supplier in pivot_df.index:\n                row[f'active_{i+1}_months_ago'] = pivot_df.loc[supplier, month]\n            else:\n                row[f'active_{i+1}_months_ago'] = 0\n        \n        # Calculate activity patterns\n        history_values = []\n        for month in history_months:\n            if month in pivot_df.columns and supplier in pivot_df.index:\n                history_values.append(pivot_df.loc[supplier, month])\n            else:\n                history_values.append(0)\n        \n        # Total active months in history\n        row['total_active_months'] = sum(history_values)\n        \n        # Active in last month\n        row['active_last_month'] = history_values[0] if history_values else 0\n        \n        # Active in any of last 3 months\n        row['active_in_last_3_months'] = 1 if sum(history_values[:3]) > 0 else 0\n        \n        # Percentage of active months\n        row['active_month_ratio'] = sum(history_values) / len(history_values) if history_values else 0\n        \n        # Trend: increasing or decreasing activity\n        if len(history_values) >= 3:\n            recent = sum(history_values[:3])\n            older = sum(history_values[3:6]) if len(history_values) >= 6 else sum(history_values[3:])\n            row['activity_trend'] = recent - older\n        else:\n            row['activity_trend'] = 0\n            \n        features.append(row)\n    \n    return pd.DataFrame(features)\n\n# Get unique suppliers from the sample submission\nsample_sub = pd.read_csv('/kaggle/input/desafo-clasificacin-de-proveedores-activos/sample_submission.csv')\nsample_sub[['CODMES', 'RUC_PROVEEDOR']] = sample_sub['CODMES_RUC_PROVEEDOR'].str.split('_', expand=True)\nsample_sub['RUC_PROVEEDOR'] = sample_sub['RUC_PROVEEDOR'].astype(int)\n\n# Get unique suppliers and months\nsubmission_suppliers = sample_sub['RUC_PROVEEDOR'].unique()\nsubmission_months = sample_sub['CODMES'].unique()\n\n# Prepare prediction data for March 2024\nmarch_data = prepare_prediction_data('202403', submission_suppliers, pivot_binary_df)\nprint(\"March 2024 prediction data shape:\", march_data.shape)\n\n# Prepare prediction data for April 2024\napril_data = prepare_prediction_data('202404', submission_suppliers, pivot_binary_df)\nprint(\"April 2024 prediction data shape:\", april_data.shape)\n\n# Scale the features\nX_march = march_data.drop(['RUC_PROVEEDOR', 'target_month'], axis=1)\nX_april = april_data.drop(['RUC_PROVEEDOR', 'target_month'], axis=1)\n\nX_march_scaled = scaler.transform(X_march)\nX_april_scaled = scaler.transform(X_april)\n\n# Make predictions\nmarch_preds = rf_model.predict(X_march_scaled)\napril_preds = rf_model.predict(X_april_scaled)\n\n# Create submission dataframe\nmarch_submission = pd.DataFrame({\n    'CODMES_RUC_PROVEEDOR': '202403_' + march_data['RUC_PROVEEDOR'].astype(str),\n    'TARGET': march_preds\n})\n\napril_submission = pd.DataFrame({\n    'CODMES_RUC_PROVEEDOR': '202404_' + april_data['RUC_PROVEEDOR'].astype(str),\n    'TARGET': april_preds\n})\n\n# Combine the predictions\nfinal_submission = pd.concat([march_submission, april_submission], ignore_index=True)\n\n# Check the submission\nprint(\"\\nFinal submission shape:\", final_submission.shape)\nprint(\"First few rows:\")\nprint(final_submission.head())\n\n# Check the distribution of predictions\nprint(\"\\nPrediction distribution:\")\nprint(final_submission['TARGET'].value_counts())\n\n# Save the submission file\nfinal_submission.to_csv('submission.csv', index=False)\nprint(\"\\nSubmission file saved as 'submission.csv'\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T04:57:10.111515Z","iopub.execute_input":"2025-04-04T04:57:10.111911Z","iopub.status.idle":"2025-04-04T04:57:11.144364Z","shell.execute_reply.started":"2025-04-04T04:57:10.111880Z","shell.execute_reply":"2025-04-04T04:57:11.142897Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import GridSearchCV\n\n# Define the parameter grid\nparam_grid = {\n    'n_estimators': [50, 100, 200],\n    'max_depth': [None, 10, 20],\n    'min_samples_split': [2, 5, 10],\n    'min_samples_leaf': [1, 2, 4],\n    'class_weight': ['balanced', 'balanced_subsample']\n}\n\n# Create the grid search\ngrid_search = GridSearchCV(\n    RandomForestClassifier(random_state=42),\n    param_grid,\n    cv=3,\n    scoring='f1',\n    n_jobs=-1\n)\n\n# Fit the grid search\ngrid_search.fit(X_train_scaled, y_train)\n\n# Best parameters\nprint(\"\\nBest parameters:\", grid_search.best_params_)\n\n# Best model\nbest_model = grid_search.best_estimator_\n\n# Make predictions with the best model\ny_pred_best = best_model.predict(X_val_scaled)\n\n# Evaluate the best model\nprint(\"\\nBest Model Evaluation:\")\nprint(\"F1 Score:\", f1_score(y_val, y_pred_best))\nprint(\"\\nClassification Report:\")\nprint(classification_report(y_val, y_pred_best))\n\n# Make predictions for March and April with the best model\nmarch_preds_best = best_model.predict(X_march_scaled)\napril_preds_best = best_model.predict(X_april_scaled)\n\n# Create submission dataframe with the best model\nmarch_submission_best = pd.DataFrame({\n    'CODMES_RUC_PROVEEDOR': '202403_' + march_data['RUC_PROVEEDOR'].astype(str),\n    'TARGET': march_preds_best\n})\n\napril_submission_best = pd.DataFrame({\n    'CODMES_RUC_PROVEEDOR': '202404_' + april_data['RUC_PROVEEDOR'].astype(str),\n    'TARGET': april_preds_best\n})\n\n# Combine the predictions\nfinal_submission_best = pd.concat([march_submission_best, april_submission_best], ignore_index=True)\n\n# Save the submission file\nfinal_submission_best.to_csv('submission_best.csv', index=False)\nprint(\"\\nBest model submission file saved as 'submission_best.csv'\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-04T04:58:01.738225Z","iopub.execute_input":"2025-04-04T04:58:01.738713Z","iopub.status.idle":"2025-04-04T05:03:58.032875Z","shell.execute_reply.started":"2025-04-04T04:58:01.738674Z","shell.execute_reply":"2025-04-04T05:03:58.031547Z"}},"outputs":[],"execution_count":null}]}