{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":50160,"databundleVersionId":7602123,"sourceType":"competition"}],"dockerImageVersionId":30648,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport gc\nfrom glob import glob\nfrom pathlib import Path\nfrom datetime import datetime\n\nimport numpy as np\nimport pandas as pd\nimport polars as pl\n\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.base import BaseEstimator, RegressorMixin\n\nimport joblib\n\nimport xgboost as xgb\nimport lightgbm as lgb\nimport shap\n\nimport warnings\nwarnings.simplefilter(action='ignore', category=FutureWarning)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-03-09T13:16:12.121838Z","iopub.execute_input":"2024-03-09T13:16:12.122123Z","iopub.status.idle":"2024-03-09T13:16:23.412797Z","shell.execute_reply.started":"2024-03-09T13:16:12.122096Z","shell.execute_reply":"2024-03-09T13:16:23.411933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Pipeline:\n    @staticmethod\n    def set_table_dtypes(df):\n        for col in df.columns:\n            if col in [\"case_id\", \"WEEK_NUM\", \"num_group1\", \"num_group2\"]:\n                df = df.with_columns(pl.col(col).cast(pl.Int64))\n            elif col in [\"date_decision\"]:\n                df = df.with_columns(pl.col(col).cast(pl.Date))\n            elif col[-1] in (\"P\", \"A\"):\n                df = df.with_columns(pl.col(col).cast(pl.Float64))\n            elif col[-1] in (\"M\",):\n                df = df.with_columns(pl.col(col).cast(pl.String))\n            elif col[-1] in (\"D\",):\n                df = df.with_columns(pl.col(col).cast(pl.Date))            \n\n        return df\n    \n    @staticmethod\n    def handle_dates(df):\n        for col in df.columns:\n            if col[-1] in (\"D\",):\n                df = df.with_columns(pl.col(col) - pl.col(\"date_decision\"))\n                df = df.with_columns(pl.col(col).dt.total_days())\n                \n        df = df.drop(\"date_decision\", \"MONTH\")\n\n        return df\n    \n    @staticmethod\n    def filter_cols(df):\n        for col in df.columns:\n            if col not in [\"target\", \"case_id\", \"WEEK_NUM\"]:\n                isnull = df[col].is_null().mean()\n\n                if isnull > 0.95:\n                    df = df.drop(col)\n\n        for col in df.columns:\n            if (col not in [\"target\", \"case_id\", \"WEEK_NUM\"]) & (df[col].dtype == pl.String):\n                freq = df[col].n_unique()\n\n                if (freq == 1) | (freq > 200):\n                    df = df.drop(col)\n\n        return df","metadata":{"execution":{"iopub.status.busy":"2024-03-09T13:16:23.414272Z","iopub.execute_input":"2024-03-09T13:16:23.414861Z","iopub.status.idle":"2024-03-09T13:16:23.427035Z","shell.execute_reply.started":"2024-03-09T13:16:23.414834Z","shell.execute_reply":"2024-03-09T13:16:23.426208Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Aggregator:\n    @staticmethod\n    def num_expr(df):\n        cols = [col for col in df.columns if col[-1] in (\"P\", \"A\")]\n\n        expr_max = [pl.max(col).alias(f\"max_{col}\") for col in cols]\n\n        return expr_max\n\n    @staticmethod\n    def date_expr(df):\n        cols = [col for col in df.columns if col[-1] in (\"D\",)]\n\n        expr_max = [pl.max(col).alias(f\"max_{col}\") for col in cols]\n\n        return expr_max\n\n    @staticmethod\n    def str_expr(df):\n        cols = [col for col in df.columns if col[-1] in (\"M\",)]\n        \n        expr_max = [pl.max(col).alias(f\"max_{col}\") for col in cols]\n\n        return expr_max\n\n    @staticmethod\n    def other_expr(df):\n        cols = [col for col in df.columns if col[-1] in (\"T\", \"L\")]\n        \n        expr_max = [pl.max(col).alias(f\"max_{col}\") for col in cols]\n\n        return expr_max\n    \n    @staticmethod\n    def count_expr(df):\n        cols = [col for col in df.columns if \"num_group\" in col]\n\n        expr_max = [pl.max(col).alias(f\"max_{col}\") for col in cols]\n\n        return expr_max\n\n    @staticmethod\n    def get_exprs(df):\n        exprs = Aggregator.num_expr(df) + \\\n                Aggregator.date_expr(df) + \\\n                Aggregator.str_expr(df) + \\\n                Aggregator.other_expr(df) + \\\n                Aggregator.count_expr(df)\n\n        return exprs","metadata":{"execution":{"iopub.status.busy":"2024-03-09T13:16:23.428286Z","iopub.execute_input":"2024-03-09T13:16:23.428644Z","iopub.status.idle":"2024-03-09T13:16:23.459822Z","shell.execute_reply.started":"2024-03-09T13:16:23.428611Z","shell.execute_reply":"2024-03-09T13:16:23.459083Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def read_file(path, depth=None):\n    df = pl.read_parquet(path)\n    df = df.pipe(Pipeline.set_table_dtypes)\n    \n    if depth in [1, 2]:\n        df = df.group_by(\"case_id\").agg(Aggregator.get_exprs(df))\n    \n    return df\n\ndef read_files(regex_path, depth=None):\n    chunks = []\n    for path in glob(str(regex_path)):\n        chunks.append(pl.read_parquet(path).pipe(Pipeline.set_table_dtypes))\n        \n    df = pl.concat(chunks, how=\"vertical_relaxed\")\n    if depth in [1, 2]:\n        df = df.group_by(\"case_id\").agg(Aggregator.get_exprs(df))\n    \n    return df","metadata":{"execution":{"iopub.status.busy":"2024-03-09T13:16:23.462401Z","iopub.execute_input":"2024-03-09T13:16:23.462819Z","iopub.status.idle":"2024-03-09T13:16:23.472167Z","shell.execute_reply.started":"2024-03-09T13:16:23.462788Z","shell.execute_reply":"2024-03-09T13:16:23.471234Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def feature_eng(df_base, depth_0):\n    df_base = (\n        df_base\n        .with_columns(\n            month_decision = pl.col(\"date_decision\").dt.month(),\n            weekday_decision = pl.col(\"date_decision\").dt.weekday(),\n        )\n    )\n        \n    for i, df in enumerate(depth_0):\n        df_base = df_base.join(df, how=\"left\", on=\"case_id\", suffix=f\"_{i}\")\n        \n    df_base = df_base.pipe(Pipeline.handle_dates)\n    \n    return df_base","metadata":{"execution":{"iopub.status.busy":"2024-03-09T13:16:23.473042Z","iopub.execute_input":"2024-03-09T13:16:23.473293Z","iopub.status.idle":"2024-03-09T13:16:23.480668Z","shell.execute_reply.started":"2024-03-09T13:16:23.473271Z","shell.execute_reply":"2024-03-09T13:16:23.479933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def to_pandas(df_data, cat_cols=None):\n    df_data = df_data.to_pandas()\n    \n    if cat_cols is None:\n        cat_cols = list(df_data.select_dtypes(\"object\").columns)\n    \n    df_data[cat_cols] = df_data[cat_cols].astype(\"category\")\n    \n    return df_data, cat_cols","metadata":{"execution":{"iopub.status.busy":"2024-03-09T13:16:23.481876Z","iopub.execute_input":"2024-03-09T13:16:23.482478Z","iopub.status.idle":"2024-03-09T13:16:23.492118Z","shell.execute_reply.started":"2024-03-09T13:16:23.482432Z","shell.execute_reply":"2024-03-09T13:16:23.491338Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def fillna_mean(df):\n    for col in df.columns:\n        if df[col].dtype != 'category':\n            df = df.fillna({col : df[col].mean()})\n            \n    return df\n\ndef fillna_median(df):\n    for col in df.columns:\n        if df[col].dtype != 'category':\n            df = df.fillna({col : df[col].median()})\n            \n    return df","metadata":{"execution":{"iopub.status.busy":"2024-03-09T15:47:52.560186Z","iopub.execute_input":"2024-03-09T15:47:52.560524Z","iopub.status.idle":"2024-03-09T15:47:52.566523Z","shell.execute_reply.started":"2024-03-09T15:47:52.560498Z","shell.execute_reply":"2024-03-09T15:47:52.565583Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ROOT            = Path(\"/kaggle/input/home-credit-credit-risk-model-stability\")\nTRAIN_DIR       = ROOT / \"parquet_files\" / \"train\"\nTEST_DIR        = ROOT / \"parquet_files\" / \"test\"","metadata":{"execution":{"iopub.status.busy":"2024-03-09T13:16:23.493232Z","iopub.execute_input":"2024-03-09T13:16:23.493630Z","iopub.status.idle":"2024-03-09T13:16:23.499691Z","shell.execute_reply.started":"2024-03-09T13:16:23.493601Z","shell.execute_reply":"2024-03-09T13:16:23.498910Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data_store = {\n    \"df_base\": read_file(TRAIN_DIR / \"train_base.parquet\"),\n    \"depth_0\": [\n        read_file(TRAIN_DIR / \"train_static_cb_0.parquet\"),\n        read_files(TRAIN_DIR / \"train_static_0_*.parquet\"),\n    ]\n}\n\ntest_data_store = {\n    \"df_base\": read_file(TEST_DIR / \"test_base.parquet\"),\n    \"depth_0\": [\n        read_file(TEST_DIR / \"test_static_cb_0.parquet\"),\n        read_files(TEST_DIR / \"test_static_0_*.parquet\"),\n    ]\n}","metadata":{"execution":{"iopub.status.busy":"2024-03-09T13:16:23.500825Z","iopub.execute_input":"2024-03-09T13:16:23.501160Z","iopub.status.idle":"2024-03-09T13:16:30.973970Z","shell.execute_reply.started":"2024-03-09T13:16:23.501134Z","shell.execute_reply":"2024-03-09T13:16:30.972983Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train = feature_eng(**train_data_store)\ndf_test = feature_eng(**test_data_store)","metadata":{"execution":{"iopub.status.busy":"2024-03-09T13:16:30.975199Z","iopub.execute_input":"2024-03-09T13:16:30.975510Z","iopub.status.idle":"2024-03-09T13:16:33.908548Z","shell.execute_reply.started":"2024-03-09T13:16:30.975485Z","shell.execute_reply":"2024-03-09T13:16:33.907258Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(df_train.shape)\nprint(df_test.shape)\n\ndf_train = df_train.pipe(Pipeline.filter_cols)\ndf_test = df_test.select([col for col in df_train.columns if col != \"target\"])\n\nprint(df_train.shape)\nprint(df_test.shape)","metadata":{"execution":{"iopub.status.busy":"2024-03-09T13:16:33.911855Z","iopub.execute_input":"2024-03-09T13:16:33.912284Z","iopub.status.idle":"2024-03-09T13:16:34.988922Z","shell.execute_reply.started":"2024-03-09T13:16:33.912248Z","shell.execute_reply":"2024-03-09T13:16:34.987954Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train, cat_cols = to_pandas(df_train)\ndf_test, cat_cols = to_pandas(df_test, cat_cols)","metadata":{"execution":{"iopub.status.busy":"2024-03-09T13:16:34.990075Z","iopub.execute_input":"2024-03-09T13:16:34.990489Z","iopub.status.idle":"2024-03-09T13:16:41.892629Z","shell.execute_reply.started":"2024-03-09T13:16:34.990432Z","shell.execute_reply":"2024-03-09T13:16:41.891499Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# null rate\ndf_null = (df_train.isnull().sum() / len(df_train)).sort_values(ascending=False)\ndf_null_60 = df_null[df_null >= 0.6]\ndf_null_60.keys()","metadata":{"execution":{"iopub.status.busy":"2024-03-09T13:16:41.893972Z","iopub.execute_input":"2024-03-09T13:16:41.894272Z","iopub.status.idle":"2024-03-09T13:16:42.282007Z","shell.execute_reply.started":"2024-03-09T13:16:41.894246Z","shell.execute_reply":"2024-03-09T13:16:42.281109Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# null 비율 60% 이상 넘어가는 columns\n\ndf_null[df_null_60.keys()]","metadata":{"execution":{"iopub.status.busy":"2024-03-09T13:32:54.736897Z","iopub.execute_input":"2024-03-09T13:32:54.737698Z","iopub.status.idle":"2024-03-09T13:32:54.748623Z","shell.execute_reply.started":"2024-03-09T13:32:54.737658Z","shell.execute_reply":"2024-03-09T13:32:54.747589Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"- equalitydataagreement_891L\n  - 고객의 교육수준, 주거 형태 등 생활 상황이나 배경에 중요 변화가 발생\n  - boolean type\n  - 제거 X\n- pmtcount_4527229L\n  - 세금 공제 수\n  - 제거 O\n- assignmentdate_4527235D\n  - 세무 기관 데이터에서 특정 작업이나 책임이 지정된 날짜를 의미. 이 용어는 세무 관련 업무에서 자주 사용되며, 세무 기관에서 특정 세금 관련 사건, 문제, 또는 케이스를 처리하기 시작한 시점\n  - 제거 O\n- pmtaverage_4527227A\n  - 세금 공제 항목들의 평균 금액을 의미. 이는 개인 또는 기업이 특정 기간 동안 이용할 수 있는 세금 공제 항목들의 평균적인 가치\n  - 제거 O\n- datelastinstal40dpd_247D\n  - 특정 납부할 금액(분할 납부의 한 회차)이 만기일로부터 40일 이상 지연된 최종 날짜를 의미합니다\n  - 제거 X\n- assignmentdate_238D\n  - 세무 기관에서 특정 세금 사건이나 작업에 대한 책임이 지정된 날짜. 이 날짜는 세금 감사, 세금 신고서의 검토, 또는 이의제기 처리 등의 특정 사건이나 작업이 공식적으로 시작된 시점을 나타내며, 해당 기관의 기록에 남겨짐\n  - 제거 O\n- pmtaverage_3A\n  - 세금 공제 수\n  - 제거 O\n- pmtcount_693L\n  - number of tax deductions\n  - 제거 O\n- validfrom_1069D\n  - 고객이 캠페인 시작한 날짜\n  - 제거 O\n- contractssum_5085716L\n  - 외부 신용 정보 기관에서 수집된 계약들의 총액. 이는 신용 정보 기관이 개인이나 기업과 관련된 모든 금융 계약의 가치를 합산한 금액\n  -  대출, 신용 한도, 할부 계약 등의 총 금액을 포함할 수 있으며, 이는 해당 개인이나 기업의 전체 금융 활동 규모와 신용 위험을 평가하는 데 사용\n  - 제거 X\n- avglnamtstart24m_4525187A\n  - Average loan amount in the last 24 months.\n  - 제거 X\n- cardtype_51L\n  - Type of credit card.\n  - 제거 O\n- inittransactionamount_650A\n  - 신용 신청과 관련된 초기 거래 금액을 의미. 신용 카드 신청, 개인 대출, 주택 대출 등에 대한 신청서에 기재된 처음 대출 요청 금액\n  - 제거 X\n- isdebitcard_729L\n  - 금융 분야에서 이러한 플래그는 데이터베이스나 시스템 내에서 각 금융 제품의 특성을 구분하는 데 사용됩니다. 이 경우, 'Flag'는 해당 제품이 직불카드인지 여부를 나타냅니다. 직불카드는 사용자가 카드를 사용하여 거래할 때, 연결된 은행 계좌에서 직접 자금이 인출되는 카드를 의미합니다.\n  - 제거 O\n- responsedate_4917613D\n  - Tax authority's response date.\n  -  세무 기관이 특정 세무 관련 요청이나 문서에 대해 응답한 날짜를 의미합니다. 이 날짜는 세무 기관이 납세자의 신고, 이의 제기, 환급 요청, 감사 요청, 또는 기타 세무 관련 문의에 대한 공식적인 답변을 제공한 시점을 나타냅니다.\n  - 제거 O","metadata":{}},{"cell_type":"code","source":"df_train['equalitydataagreement_891L'].unique()","metadata":{"execution":{"iopub.status.busy":"2024-03-08T07:14:27.524594Z","iopub.execute_input":"2024-03-08T07:14:27.525850Z","iopub.status.idle":"2024-03-08T07:14:27.548161Z","shell.execute_reply.started":"2024-03-08T07:14:27.525787Z","shell.execute_reply":"2024-03-08T07:14:27.547100Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train.loc[df_train[df_train['equalitydataagreement_891L'].notnull()].index, 'equalitydataagreement_891L']","metadata":{"execution":{"iopub.status.busy":"2024-03-08T07:13:41.116846Z","iopub.execute_input":"2024-03-08T07:13:41.117261Z","iopub.status.idle":"2024-03-08T07:13:41.274979Z","shell.execute_reply.started":"2024-03-08T07:13:41.117229Z","shell.execute_reply":"2024-03-08T07:13:41.273941Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train['assignmentdate_4527235D'].unique()","metadata":{"execution":{"iopub.status.busy":"2024-03-09T13:32:09.261212Z","iopub.execute_input":"2024-03-09T13:32:09.262013Z","iopub.status.idle":"2024-03-09T13:32:09.280762Z","shell.execute_reply.started":"2024-03-09T13:32:09.261963Z","shell.execute_reply":"2024-03-09T13:32:09.279911Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train['pmtaverage_4527227A'].unique()","metadata":{"execution":{"iopub.status.busy":"2024-03-09T13:35:47.300791Z","iopub.execute_input":"2024-03-09T13:35:47.301167Z","iopub.status.idle":"2024-03-09T13:35:47.321480Z","shell.execute_reply.started":"2024-03-09T13:35:47.301136Z","shell.execute_reply":"2024-03-09T13:35:47.320595Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del_col_list = ['pmtcount_4527229L', 'assignmentdate_4527235D', 'pmtaverage_4527227A', 'assignmentdate_238D', 'pmtaverage_3A', 'pmtcount_693L', 'validfrom_1069D', 'cardtype_51L', 'isdebitcard_729L', 'responsedate_4917613D']","metadata":{"execution":{"iopub.status.busy":"2024-03-09T14:44:50.444309Z","iopub.execute_input":"2024-03-09T14:44:50.445128Z","iopub.status.idle":"2024-03-09T14:44:50.449840Z","shell.execute_reply.started":"2024-03-09T14:44:50.445073Z","shell.execute_reply":"2024-03-09T14:44:50.448816Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train_drop = df_train.drop(del_col_list, axis=1)\ndf_test_drop = df_test.drop(del_col_list, axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-03-09T14:47:56.870287Z","iopub.execute_input":"2024-03-09T14:47:56.871248Z","iopub.status.idle":"2024-03-09T14:47:57.575659Z","shell.execute_reply.started":"2024-03-09T14:47:56.871214Z","shell.execute_reply":"2024-03-09T14:47:57.574882Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train_drop_mean = fillna_mean(df_train_drop)\ndf_test_drop_mean = fillna_mean(df_test_drop)","metadata":{"execution":{"iopub.status.busy":"2024-03-09T15:36:36.066317Z","iopub.execute_input":"2024-03-09T15:36:36.067045Z","iopub.status.idle":"2024-03-09T15:41:47.820372Z","shell.execute_reply.started":"2024-03-09T15:36:36.067010Z","shell.execute_reply":"2024-03-09T15:41:47.819242Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"params = {\n    \"boosting_type\": \"gbdt\",\n    \"objective\": \"binary\",\n    \"metric\": \"auc\",\n    \"max_depth\": 8,\n    \"learning_rate\": 0.01,\n    \"n_estimators\": 1000,\n    \"colsample_bytree\": 0.8, \n    \"colsample_bynode\": 0.8,\n    \"verbose\": -1,\n    \"random_state\": 42,\n    \"device\": \"gpu\",\n}","metadata":{"execution":{"iopub.status.busy":"2024-03-09T15:41:47.822475Z","iopub.execute_input":"2024-03-09T15:41:47.822738Z","iopub.status.idle":"2024-03-09T15:41:47.827458Z","shell.execute_reply.started":"2024-03-09T15:41:47.822716Z","shell.execute_reply":"2024-03-09T15:41:47.826414Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import roc_auc_score\n\ndef lgbm_train(X, y):\n    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=10)\n\n    model = lgb.LGBMClassifier(**params)\n    model.fit(\n            X_train, y_train\n        )\n\n    pred = model.predict(X_test)\n    accuracy = roc_auc_score(pred, y_test)\n    \n    return accuracy","metadata":{"execution":{"iopub.status.busy":"2024-03-09T15:57:23.547055Z","iopub.execute_input":"2024-03-09T15:57:23.547732Z","iopub.status.idle":"2024-03-09T15:57:23.553708Z","shell.execute_reply.started":"2024-03-09T15:57:23.547699Z","shell.execute_reply":"2024-03-09T15:57:23.552608Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"origin_acc = lgbm_train(df_train.iloc[:, 3:], df_train['target'])\nmean_acc = lgbm_train(df_train_drop_mean.iloc[:, 3:], df_train_drop_mean['target'])","metadata":{"execution":{"iopub.status.busy":"2024-03-09T15:57:26.495069Z","iopub.execute_input":"2024-03-09T15:57:26.495739Z","iopub.status.idle":"2024-03-09T16:02:59.394191Z","shell.execute_reply.started":"2024-03-09T15:57:26.495706Z","shell.execute_reply":"2024-03-09T16:02:59.393346Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"origin_acc, mean_acc","metadata":{"execution":{"iopub.status.busy":"2024-03-09T16:02:59.395950Z","iopub.execute_input":"2024-03-09T16:02:59.396296Z","iopub.status.idle":"2024-03-09T16:02:59.402725Z","shell.execute_reply.started":"2024-03-09T16:02:59.396264Z","shell.execute_reply":"2024-03-09T16:02:59.401578Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}