{"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":88400,"databundleVersionId":10121331,"sourceType":"competition"}],"dockerImageVersionId":30786,"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\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\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","execution":{"iopub.status.busy":"2024-11-12T07:56:17.772154Z","iopub.execute_input":"2024-11-12T07:56:17.773689Z","iopub.status.idle":"2024-11-12T07:56:17.784499Z","shell.execute_reply.started":"2024-11-12T07:56:17.773632Z","shell.execute_reply":"2024-11-12T07:56:17.782773Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv(\"/kaggle/input/aiffel-ds-3-credit-card-fraud-detection/train.csv\") \ntest = pd.read_csv(\"/kaggle/input/aiffel-ds-3-credit-card-fraud-detection/test.csv\")\nsubmission = pd.read_csv(\"/kaggle/input/aiffel-ds-3-credit-card-fraud-detection/sample_submission.csv\")","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:56:18.698040Z","iopub.execute_input":"2024-11-12T07:56:18.698470Z","iopub.status.idle":"2024-11-12T07:56:21.480990Z","shell.execute_reply.started":"2024-11-12T07:56:18.698433Z","shell.execute_reply":"2024-11-12T07:56:21.479742Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_features = train.drop(['id','Time','Class'], axis=1)\ny_label = train['Class']","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:56:28.055271Z","iopub.execute_input":"2024-11-12T07:56:28.055773Z","iopub.status.idle":"2024-11-12T07:56:28.071114Z","shell.execute_reply.started":"2024-11-12T07:56:28.055729Z","shell.execute_reply":"2024-11-12T07:56:28.069559Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_features","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:56:29.266184Z","iopub.execute_input":"2024-11-12T07:56:29.266622Z","iopub.status.idle":"2024-11-12T07:56:29.314831Z","shell.execute_reply.started":"2024-11-12T07:56:29.266576Z","shell.execute_reply":"2024-11-12T07:56:29.313321Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_label ","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:33:17.093272Z","iopub.execute_input":"2024-11-12T07:33:17.093774Z","iopub.status.idle":"2024-11-12T07:33:17.105199Z","shell.execute_reply.started":"2024-11-12T07:33:17.093732Z","shell.execute_reply":"2024-11-12T07:33:17.103614Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_features['Amount'].sort_values()","metadata":{"execution":{"iopub.status.busy":"2024-11-12T05:48:20.615411Z","iopub.execute_input":"2024-11-12T05:48:20.616325Z","iopub.status.idle":"2024-11-12T05:48:20.658761Z","shell.execute_reply.started":"2024-11-12T05:48:20.616259Z","shell.execute_reply":"2024-11-12T05:48:20.657594Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_features['Amount'] = X_features['Amount'].apply(lambda x: 5000 if x > 5000 else x)","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:56:37.622889Z","iopub.execute_input":"2024-11-12T07:56:37.623421Z","iopub.status.idle":"2024-11-12T07:56:37.722298Z","shell.execute_reply.started":"2024-11-12T07:56:37.623378Z","shell.execute_reply":"2024-11-12T07:56:37.721003Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_features['Amount'].sort_values()","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:56:38.492491Z","iopub.execute_input":"2024-11-12T07:56:38.494036Z","iopub.status.idle":"2024-11-12T07:56:38.529895Z","shell.execute_reply.started":"2024-11-12T07:56:38.493969Z","shell.execute_reply":"2024-11-12T07:56:38.528203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import seaborn as sns\nsns.scatterplot(data=X_features, x=X_features.index, y='Amount')","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:56:41.316477Z","iopub.execute_input":"2024-11-12T07:56:41.317015Z","iopub.status.idle":"2024-11-12T07:56:42.290714Z","shell.execute_reply.started":"2024-11-12T07:56:41.316963Z","shell.execute_reply":"2024-11-12T07:56:42.289343Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_features[X_features['Amount'] == 0]","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:56:43.766664Z","iopub.execute_input":"2024-11-12T07:56:43.767169Z","iopub.status.idle":"2024-11-12T07:56:43.807740Z","shell.execute_reply.started":"2024-11-12T07:56:43.767127Z","shell.execute_reply":"2024-11-12T07:56:43.806511Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"numeric_columns = X_features.columns","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:56:50.065701Z","iopub.execute_input":"2024-11-12T07:56:50.067404Z","iopub.status.idle":"2024-11-12T07:56:50.072638Z","shell.execute_reply.started":"2024-11-12T07:56:50.067353Z","shell.execute_reply":"2024-11-12T07:56:50.071393Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:56:50.300088Z","iopub.execute_input":"2024-11-12T07:56:50.301144Z","iopub.status.idle":"2024-11-12T07:56:50.306123Z","shell.execute_reply.started":"2024-11-12T07:56:50.301097Z","shell.execute_reply":"2024-11-12T07:56:50.304891Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 시각화 라이브러리 불러오기\nimport seaborn as sns  \n\n# 상관 관계 행렬 계산(corr())\ncorr = X_features.corr()\n\n# 행렬이 대각선을 기준으로 대칭이기 때문에 하단만 표시하기 위한 마스크 생성\nmask = np.zeros_like(corr) # np.zeros_like()는 0으로 가득찬 array 생성, 크기는 corr와 동일   \nmask[np.triu_indices_from(mask, k=1)] = True # array의 대각선 영역과 그 윗 부분에 True가 들어가도록 설정\n\n# 히트맵 그리기\nplt.figure(figsize=(16, 12))\nsns.heatmap(corr, mask=mask, cmap='rocket', annot=True, fmt='.1f')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:56:50.543629Z","iopub.execute_input":"2024-11-12T07:56:50.544129Z","iopub.status.idle":"2024-11-12T07:56:52.473695Z","shell.execute_reply.started":"2024-11-12T07:56:50.544087Z","shell.execute_reply":"2024-11-12T07:56:52.472405Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train[train['Amount']==0]['Class'].mean()","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:56:53.363696Z","iopub.execute_input":"2024-11-12T07:56:53.364288Z","iopub.status.idle":"2024-11-12T07:56:53.376614Z","shell.execute_reply.started":"2024-11-12T07:56:53.364239Z","shell.execute_reply":"2024-11-12T07:56:53.375241Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['Class'].mean() # amount가 0이면 사기일확률이 7배.","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:56:53.602739Z","iopub.execute_input":"2024-11-12T07:56:53.603903Z","iopub.status.idle":"2024-11-12T07:56:53.613339Z","shell.execute_reply.started":"2024-11-12T07:56:53.603831Z","shell.execute_reply":"2024-11-12T07:56:53.611662Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_fraud = train[train['Class']==1]","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:57:16.944306Z","iopub.execute_input":"2024-11-12T07:57:16.945084Z","iopub.status.idle":"2024-11-12T07:57:16.954231Z","shell.execute_reply.started":"2024-11-12T07:57:16.945026Z","shell.execute_reply":"2024-11-12T07:57:16.952685Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for column in numeric_columns:\n    fig, axs = plt.subplots(nrows=1, ncols=4, figsize=(10, 4))\n    sns.scatterplot(x=train_fraud.index, y=train_fraud[column], data=train_fraud, ax=axs[0])\n    sns.histplot(x=column, data=train, kde=True, ax=axs[1])\n    sns.scatterplot(x=train.index, y=train[column], data=train, ax=axs[2])\n    sns.histplot(x=column, data=train, kde=True, ax=axs[3])","metadata":{"execution":{"iopub.status.busy":"2024-11-12T06:11:57.214126Z","iopub.execute_input":"2024-11-12T06:11:57.214611Z","iopub.status.idle":"2024-11-12T06:17:34.592949Z","shell.execute_reply.started":"2024-11-12T06:11:57.214563Z","shell.execute_reply":"2024-11-12T06:17:34.591759Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 이상치가 많으니까 트리기반 모델. ","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_features","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:57:35.645304Z","iopub.execute_input":"2024-11-12T07:57:35.646401Z","iopub.status.idle":"2024-11-12T07:57:35.731831Z","shell.execute_reply.started":"2024-11-12T07:57:35.646348Z","shell.execute_reply":"2024-11-12T07:57:35.730616Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_features['Amount_has_zero'] = X_features['Amount'].apply(lambda x:1 if x == 0 else 0)","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:57:39.823005Z","iopub.execute_input":"2024-11-12T07:57:39.823495Z","iopub.status.idle":"2024-11-12T07:57:39.978373Z","shell.execute_reply.started":"2024-11-12T07:57:39.823451Z","shell.execute_reply":"2024-11-12T07:57:39.977010Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_features","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:57:40.291768Z","iopub.execute_input":"2024-11-12T07:57:40.292959Z","iopub.status.idle":"2024-11-12T07:57:40.363945Z","shell.execute_reply.started":"2024-11-12T07:57:40.292887Z","shell.execute_reply":"2024-11-12T07:57:40.362662Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 시각화 라이브러리 불러오기\nimport seaborn as sns  \n\n# 상관 관계 행렬 계산(corr())\ncorr = X_features.corr()\n\n# 행렬이 대각선을 기준으로 대칭이기 때문에 하단만 표시하기 위한 마스크 생성\nmask = np.zeros_like(corr) # np.zeros_like()는 0으로 가득찬 array 생성, 크기는 corr와 동일   \nmask[np.triu_indices_from(mask, k=1)] = True # array의 대각선 영역과 그 윗 부분에 True가 들어가도록 설정\n\n# 히트맵 그리기\nplt.figure(figsize=(16, 12))\nsns.heatmap(corr, mask=mask, cmap='rocket', annot=True, fmt='.1f')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-11-12T06:24:48.770666Z","iopub.execute_input":"2024-11-12T06:24:48.771762Z","iopub.status.idle":"2024-11-12T06:24:50.878355Z","shell.execute_reply.started":"2024-11-12T06:24:48.771710Z","shell.execute_reply":"2024-11-12T06:24:50.877004Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 사기탐지에서는 정확도보다 재현율 값이 중요하다. 오버샘플링.\nfrom imblearn.over_sampling import SMOTE\n\nsmote = SMOTE(random_state=0)\nX_train_over, y_train_over = smote.fit_resample(X_features, y_label)\nprint('SMOTE 적용 전 학습용 피처/레이블 데이터 세트: ', X_features.shape, y_label.shape)\nprint('SMOTE 적용 후 학습용 피처/레이블 데이터 세트: ', X_train_over.shape, y_train_over.shape)\nprint('SMOTE 적용 후 레이블 값 분포: \\n', pd.Series(y_train_over).value_counts())","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:57:48.780955Z","iopub.execute_input":"2024-11-12T07:57:48.781406Z","iopub.status.idle":"2024-11-12T07:57:49.151972Z","shell.execute_reply.started":"2024-11-12T07:57:48.781367Z","shell.execute_reply":"2024-11-12T07:57:49.150509Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from lightgbm import LGBMClassifier\nfrom sklearn.model_selection import train_test_split","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:57:54.523955Z","iopub.execute_input":"2024-11-12T07:57:54.524968Z","iopub.status.idle":"2024-11-12T07:57:54.530828Z","shell.execute_reply.started":"2024-11-12T07:57:54.524899Z","shell.execute_reply":"2024-11-12T07:57:54.529233Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:58:02.061969Z","iopub.execute_input":"2024-11-12T07:58:02.062442Z","iopub.status.idle":"2024-11-12T07:58:02.114490Z","shell.execute_reply.started":"2024-11-12T07:58:02.062399Z","shell.execute_reply":"2024-11-12T07:58:02.113297Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test = test.drop(['Time','id'], axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:58:05.982442Z","iopub.execute_input":"2024-11-12T07:58:05.982938Z","iopub.status.idle":"2024-11-12T07:58:05.994999Z","shell.execute_reply.started":"2024-11-12T07:58:05.982881Z","shell.execute_reply":"2024-11-12T07:58:05.993284Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test['Amount_has_zero'] = X_test['Amount'].apply(lambda x:1 if x == 0 else 0)","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:58:08.046117Z","iopub.execute_input":"2024-11-12T07:58:08.046578Z","iopub.status.idle":"2024-11-12T07:58:08.151630Z","shell.execute_reply.started":"2024-11-12T07:58:08.046528Z","shell.execute_reply":"2024-11-12T07:58:08.150447Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:58:08.369132Z","iopub.execute_input":"2024-11-12T07:58:08.369596Z","iopub.status.idle":"2024-11-12T07:58:08.419044Z","shell.execute_reply.started":"2024-11-12T07:58:08.369554Z","shell.execute_reply":"2024-11-12T07:58:08.417980Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 전체 데이터 중 80%는 학습용 데이터, 20%는 테스트용 데이터 추출\nX_train, X_test, y_train, y_test=train_test_split(X_train_over, y_train_over, test_size=0.2, random_state=156 )\n\n# 위에서 만든 X_train, y_train을 다시 쪼개서 90%는 학습과 10%는 검증용 데이터로 분리\nX_tr, X_val, y_tr, y_val= train_test_split(X_train, y_train, test_size=0.1, random_state=156 )\n\n# n_estimators는 1000 설정.\nlgbm_wrapper = LGBMClassifier(n_estimators=1000, learning_rate=0.05, early_stopping_rounds=100,verbosity=1)\n# 조기 중단 수행 가능.\nevals = [(X_val, y_val)]\nlgbm_wrapper.fit(X_tr, y_tr, eval_metric=\"logloss\", eval_set=evals)\npreds = lgbm_wrapper.predict(X_test)\npred_proba = lgbm_wrapper.predict_proba(X_test)[:, 1]","metadata":{"execution":{"iopub.status.busy":"2024-11-12T07:58:27.068311Z","iopub.execute_input":"2024-11-12T07:58:27.069384Z","iopub.status.idle":"2024-11-12T07:59:35.922358Z","shell.execute_reply.started":"2024-11-12T07:58:27.069337Z","shell.execute_reply":"2024-11-12T07:59:35.921196Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix, accuracy_score\nfrom sklearn.metrics import precision_score, recall_score\nfrom sklearn.metrics import f1_score, roc_auc_score\n\ndef get_clf_eval(y_test, pred=None, pred_proba=None):\n    confusion = confusion_matrix( y_test, pred)\n    accuracy = accuracy_score(y_test , pred)\n    precision = precision_score(y_test , pred)\n    recall = recall_score(y_test , pred)\n    f1 = f1_score(y_test,pred)\n    # ROC-AUC 추가 \n    roc_auc = roc_auc_score(y_test, pred_proba)\n    print('오차 행렬')\n    print(confusion)\n    # ROC-AUC print 추가\n    print('정확도: {0:.4f}, 정밀도: {1:.4f}, 재현율: {2:.4f},\\\n    F1: {3:.4f}, AUC:{4:.4f}'.format(accuracy, precision, \trecall, f1, roc_auc))\n    \nget_clf_eval(y_test, preds, pred_proba)    ","metadata":{"execution":{"iopub.status.busy":"2024-11-12T08:00:50.825194Z","iopub.execute_input":"2024-11-12T08:00:50.825708Z","iopub.status.idle":"2024-11-12T08:00:50.988188Z","shell.execute_reply.started":"2024-11-12T08:00:50.825661Z","shell.execute_reply":"2024-11-12T08:00:50.987025Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plot_importance( )를 이용하여 feature 중요도 시각화\nfrom lightgbm import plot_importance\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\nfig, ax = plt.subplots(figsize=(10, 12))\nplot_importance(lgbm_wrapper, ax=ax)\nplt.savefig('lightgbm_feature_importance.tif', format='tif', dpi=300, bbox_inches='tight')","metadata":{"execution":{"iopub.status.busy":"2024-11-12T08:00:54.957442Z","iopub.execute_input":"2024-11-12T08:00:54.958022Z","iopub.status.idle":"2024-11-12T08:00:56.291000Z","shell.execute_reply.started":"2024-11-12T08:00:54.957965Z","shell.execute_reply":"2024-11-12T08:00:56.289623Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = pd.read_csv(\"/kaggle/input/aiffel-ds-3-credit-card-fraud-detection/test.csv\")","metadata":{"execution":{"iopub.status.busy":"2024-11-12T08:06:34.687321Z","iopub.execute_input":"2024-11-12T08:06:34.687900Z","iopub.status.idle":"2024-11-12T08:06:35.937649Z","shell.execute_reply.started":"2024-11-12T08:06:34.687851Z","shell.execute_reply":"2024-11-12T08:06:35.936239Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test_1 = test.drop(['Time','id'], axis=1)\nX_test_1['Amount_has_zero'] = X_test_1['Amount'].apply(lambda x:1 if x == 0 else 0)","metadata":{"execution":{"iopub.status.busy":"2024-11-12T08:06:40.536665Z","iopub.execute_input":"2024-11-12T08:06:40.537211Z","iopub.status.idle":"2024-11-12T08:06:40.657385Z","shell.execute_reply.started":"2024-11-12T08:06:40.537164Z","shell.execute_reply":"2024-11-12T08:06:40.655947Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test_1","metadata":{"execution":{"iopub.status.busy":"2024-11-12T08:06:45.965739Z","iopub.execute_input":"2024-11-12T08:06:45.966574Z","iopub.status.idle":"2024-11-12T08:06:46.016312Z","shell.execute_reply.started":"2024-11-12T08:06:45.966518Z","shell.execute_reply":"2024-11-12T08:06:46.015002Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred = lgbm_wrapper.predict(X_test_1)\n# 제출 파일 생성\nsubmission = pd.DataFrame({'id': test['id'], 'Class': y_pred})\nsubmission.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2024-11-12T08:06:53.791791Z","iopub.execute_input":"2024-11-12T08:06:53.792312Z","iopub.status.idle":"2024-11-12T08:06:58.551989Z","shell.execute_reply.started":"2024-11-12T08:06:53.792266Z","shell.execute_reply":"2024-11-12T08:06:58.550712Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission","metadata":{"execution":{"iopub.status.busy":"2024-11-12T08:06:58.554109Z","iopub.execute_input":"2024-11-12T08:06:58.554523Z","iopub.status.idle":"2024-11-12T08:06:58.568380Z","shell.execute_reply.started":"2024-11-12T08:06:58.554484Z","shell.execute_reply":"2024-11-12T08:06:58.566987Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}