{"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":"gpu","dataSources":[{"sourceId":70367,"databundleVersionId":9188054,"sourceType":"competition"},{"sourceId":118235,"sourceType":"modelInstanceVersion","modelInstanceId":99430,"modelId":123601},{"sourceId":118238,"sourceType":"modelInstanceVersion","modelInstanceId":99433,"modelId":123604}],"dockerImageVersionId":30761,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"inspired by Ab_Rafey and nickshapiro","metadata":{}},{"cell_type":"markdown","source":"if you like it, please upvote","metadata":{}},{"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\n# for 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-09-22T23:24:42.446158Z","iopub.execute_input":"2024-09-22T23:24:42.44693Z","iopub.status.idle":"2024-09-22T23:24:42.806741Z","shell.execute_reply.started":"2024-09-22T23:24:42.446893Z","shell.execute_reply":"2024-09-22T23:24:42.805968Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport pandas as pd\nimport numpy as np\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torch.utils.data import DataLoader, Dataset\nfrom torch.optim.lr_scheduler import ReduceLROnPlateau\n# import polars as pl","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:42.808338Z","iopub.execute_input":"2024-09-22T23:24:42.808737Z","iopub.status.idle":"2024-09-22T23:24:47.503692Z","shell.execute_reply.started":"2024-09-22T23:24:42.808689Z","shell.execute_reply":"2024-09-22T23:24:47.502751Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_adc_info = pd.read_csv('/kaggle/input/ariel-data-challenge-2024/train_adc_info.csv')\ntest_adc_info = pd.read_csv('/kaggle/input/ariel-data-challenge-2024/test_adc_info.csv')\ntrain_labels = pd.read_csv('/kaggle/input/ariel-data-challenge-2024/train_labels.csv')\nwavelengths = pd.read_csv('/kaggle/input/ariel-data-challenge-2024/wavelengths.csv')","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:47.504942Z","iopub.execute_input":"2024-09-22T23:24:47.505513Z","iopub.status.idle":"2024-09-22T23:24:47.748458Z","shell.execute_reply.started":"2024-09-22T23:24:47.50546Z","shell.execute_reply":"2024-09-22T23:24:47.747463Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_adc_info.describe()","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:47.750657Z","iopub.execute_input":"2024-09-22T23:24:47.751007Z","iopub.status.idle":"2024-09-22T23:24:47.793048Z","shell.execute_reply.started":"2024-09-22T23:24:47.750974Z","shell.execute_reply":"2024-09-22T23:24:47.792086Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def restore_dynamic_range(signal, gain, offset):\n    return signal * gain + offset","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:47.794422Z","iopub.execute_input":"2024-09-22T23:24:47.794807Z","iopub.status.idle":"2024-09-22T23:24:47.799752Z","shell.execute_reply.started":"2024-09-22T23:24:47.794764Z","shell.execute_reply":"2024-09-22T23:24:47.798648Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"signal_data = pd.read_parquet('/kaggle/input/ariel-data-challenge-2024/train/2633183716/AIRS-CH0_signal.parquet')\nadc_info = train_adc_info[train_adc_info['planet_id'] == 2633183716]","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:47.801363Z","iopub.execute_input":"2024-09-22T23:24:47.801794Z","iopub.status.idle":"2024-09-22T23:24:49.949573Z","shell.execute_reply.started":"2024-09-22T23:24:47.801703Z","shell.execute_reply":"2024-09-22T23:24:49.948783Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"adc_info.columns","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:49.950802Z","iopub.execute_input":"2024-09-22T23:24:49.95118Z","iopub.status.idle":"2024-09-22T23:24:49.957851Z","shell.execute_reply.started":"2024-09-22T23:24:49.951137Z","shell.execute_reply":"2024-09-22T23:24:49.95693Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"restored_signal = restore_dynamic_range(signal_data, adc_info['FGS1_adc_gain'].values[0], adc_info['FGS1_adc_offset'].values[0])","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:49.959191Z","iopub.execute_input":"2024-09-22T23:24:49.960045Z","iopub.status.idle":"2024-09-22T23:24:50.413089Z","shell.execute_reply.started":"2024-09-22T23:24:49.960001Z","shell.execute_reply":"2024-09-22T23:24:50.411963Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(restored_signal.iloc[0].values.reshape(32, 356), cmap='viridis')\nplt.colorbar()\nplt.title('Restored Signal Frame')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:50.414299Z","iopub.execute_input":"2024-09-22T23:24:50.414603Z","iopub.status.idle":"2024-09-22T23:24:50.762131Z","shell.execute_reply.started":"2024-09-22T23:24:50.414571Z","shell.execute_reply":"2024-09-22T23:24:50.761254Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ExoplanetDataset(Dataset):\n    def __init__(self, signal_data, labels):\n        self.signal_data = signal_data\n        self.labels = labels\n\n    def __len__(self):\n        return len(self.signal_data)\n\n    def __getitem__(self, idx):\n        x = self.signal_data[idx]\n        y = self.labels[idx]\n        return x, y","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:50.766315Z","iopub.execute_input":"2024-09-22T23:24:50.766628Z","iopub.status.idle":"2024-09-22T23:24:50.772307Z","shell.execute_reply.started":"2024-09-22T23:24:50.766594Z","shell.execute_reply":"2024-09-22T23:24:50.771409Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def prepare_data(planet_id):\n    signal_data = pd.read_parquet(f'/kaggle/input/ariel-data-challenge-2024/train/{planet_id}/AIRS-CH0_signal.parquet')\n    adc_info = train_adc_info[train_adc_info['planet_id'] == planet_id]\n    restored_signal = restore_dynamic_range(signal_data, adc_info['FGS1_adc_gain'].values[0], adc_info['FGS1_adc_offset'].values[0])\n    return restored_signal","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:50.773437Z","iopub.execute_input":"2024-09-22T23:24:50.773741Z","iopub.status.idle":"2024-09-22T23:24:50.782309Z","shell.execute_reply.started":"2024-09-22T23:24:50.773687Z","shell.execute_reply":"2024-09-22T23:24:50.781455Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"planet_id = 2633183716\nrestored_signal = prepare_data(planet_id)","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:50.783356Z","iopub.execute_input":"2024-09-22T23:24:50.783611Z","iopub.status.idle":"2024-09-22T23:24:52.342955Z","shell.execute_reply.started":"2024-09-22T23:24:50.783581Z","shell.execute_reply":"2024-09-22T23:24:52.341915Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_labels.iloc[:, 1:].values","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:52.344211Z","iopub.execute_input":"2024-09-22T23:24:52.344959Z","iopub.status.idle":"2024-09-22T23:24:52.354017Z","shell.execute_reply.started":"2024-09-22T23:24:52.34491Z","shell.execute_reply":"2024-09-22T23:24:52.353195Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(f\"Length of restored_signal: {len(restored_signal)}\")\nprint(f\"Length of train_labels: {len(train_labels)}\")","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:52.355207Z","iopub.execute_input":"2024-09-22T23:24:52.355497Z","iopub.status.idle":"2024-09-22T23:24:52.361425Z","shell.execute_reply.started":"2024-09-22T23:24:52.355465Z","shell.execute_reply":"2024-09-22T23:24:52.360508Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"signal_length = len(restored_signal)\nlabel_length = train_labels.shape[0]","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:52.362517Z","iopub.execute_input":"2024-09-22T23:24:52.362832Z","iopub.status.idle":"2024-09-22T23:24:52.372288Z","shell.execute_reply.started":"2024-09-22T23:24:52.3628Z","shell.execute_reply":"2024-09-22T23:24:52.371447Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if signal_length > label_length:\n    restored_signal = restored_signal[:label_length]\nelif label_length > signal_length:\n    train_labels = train_labels.iloc[:signal_length]\n\nprint(f\"Adjusted length of restored_signal: {len(restored_signal)}\")\nprint(f\"Adjusted length of train_labels: {len(train_labels)}\")","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:52.373483Z","iopub.execute_input":"2024-09-22T23:24:52.373803Z","iopub.status.idle":"2024-09-22T23:24:52.383656Z","shell.execute_reply.started":"2024-09-22T23:24:52.373762Z","shell.execute_reply":"2024-09-22T23:24:52.382714Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"restored_signal.head()","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:52.385205Z","iopub.execute_input":"2024-09-22T23:24:52.385847Z","iopub.status.idle":"2024-09-22T23:24:52.419887Z","shell.execute_reply.started":"2024-09-22T23:24:52.385803Z","shell.execute_reply":"2024-09-22T23:24:52.415832Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device= torch.device('cuda')\ntrain_dataset = ExoplanetDataset(restored_signal.values.reshape(-1, 1, 32, 356), train_labels.iloc[:, 1:].values)\ntrain_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:52.42319Z","iopub.execute_input":"2024-09-22T23:24:52.423794Z","iopub.status.idle":"2024-09-22T23:24:52.429284Z","shell.execute_reply.started":"2024-09-22T23:24:52.423744Z","shell.execute_reply":"2024-09-22T23:24:52.428264Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:52.430435Z","iopub.execute_input":"2024-09-22T23:24:52.430758Z","iopub.status.idle":"2024-09-22T23:24:52.440081Z","shell.execute_reply.started":"2024-09-22T23:24:52.430702Z","shell.execute_reply":"2024-09-22T23:24:52.439197Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"conv_output_size = 64 * 32 * 356\n\nmodel = nn.Sequential(\n    nn.Conv2d(1, 32, kernel_size=3, padding=1),\n    nn.ReLU(),\n    nn.Conv2d(32, 64, kernel_size=3, padding=1),\n    nn.ReLU(),\n    nn.Flatten(),\n    nn.Linear(conv_output_size, 128),\n    # nn.Dropout(0.2),\n    nn.Linear(128, 300), #283 wavelengths\n    nn.Linear(300,283)\n)\n\nmodel.cuda()","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:52.441175Z","iopub.execute_input":"2024-09-22T23:24:52.441461Z","iopub.status.idle":"2024-09-22T23:24:53.547263Z","shell.execute_reply.started":"2024-09-22T23:24:52.44143Z","shell.execute_reply":"2024-09-22T23:24:53.546367Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"criterion = nn.MSELoss()\noptimizer = optim.Adam(model.parameters(), lr=0.001)\nscheduler = ReduceLROnPlateau(optimizer, 'min')\nplanet_id = 2633183716\nrestored_signal = prepare_data(planet_id)","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:53.548413Z","iopub.execute_input":"2024-09-22T23:24:53.548696Z","iopub.status.idle":"2024-09-22T23:24:55.768378Z","shell.execute_reply.started":"2024-09-22T23:24:53.548664Z","shell.execute_reply":"2024-09-22T23:24:55.767324Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(device)","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:55.769575Z","iopub.execute_input":"2024-09-22T23:24:55.770038Z","iopub.status.idle":"2024-09-22T23:24:55.77523Z","shell.execute_reply.started":"2024-09-22T23:24:55.770001Z","shell.execute_reply":"2024-09-22T23:24:55.77427Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.listdir('/kaggle/input/exoplanet_model.pth/pytorch/default/1/')","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:55.776305Z","iopub.execute_input":"2024-09-22T23:24:55.77666Z","iopub.status.idle":"2024-09-22T23:24:55.788924Z","shell.execute_reply.started":"2024-09-22T23:24:55.776627Z","shell.execute_reply":"2024-09-22T23:24:55.788011Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# /kaggle/input/exoplanet_model.pth/pytorch/default/1\n\n# import os\n# if os.path.exists('/kaggle/input/exoplanet_model.pth/pytorch/default/1/exoplanet_model.pth'):\n#     print('True')\n\nmodel_path = '/kaggle/input/exoplanet_model.pth/pytorch/default/1/exoplanet_model.pth'\nmodel.load_state_dict(torch.load(model_path, weights_only=True))","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:55.790088Z","iopub.execute_input":"2024-09-22T23:24:55.790459Z","iopub.status.idle":"2024-09-22T23:24:58.525913Z","shell.execute_reply.started":"2024-09-22T23:24:55.790414Z","shell.execute_reply":"2024-09-22T23:24:58.524919Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# num_epochs = 100\n# model = model.cuda()\n# for epoch in range(num_epochs):\n#     print(total_loss)\n#     model.train()\n#     total_loss = 0\n    \n#     for x, y in train_loader:\n#         # print(total_loss)\n#         x, y = x.float().cuda(), y.float().cuda()\n#         optimizer.zero_grad()\n#         outputs = model(x)\n#         loss = criterion(outputs, y)\n#         loss.backward()\n#         scheduler.step(loss)\n#         optimizer.step()\n#         total_loss += loss.item()\n    \n#     print(f'Epoch {epoch+1}/{num_epochs}, Loss: {total_loss/len(train_loader)}')\n\n# torch.save(model.state_dict(), 'exoplanet_model.pth')","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:58.527092Z","iopub.execute_input":"2024-09-22T23:24:58.527399Z","iopub.status.idle":"2024-09-22T23:24:58.532013Z","shell.execute_reply.started":"2024-09-22T23:24:58.527367Z","shell.execute_reply":"2024-09-22T23:24:58.531002Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_path = '/kaggle/input/exoplanet_model.pth/pytorch/default/1/exoplanet_model.pth'\nmodel.load_state_dict(torch.load(model_path))\nmodel.eval().cuda()","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:58.533182Z","iopub.execute_input":"2024-09-22T23:24:58.533474Z","iopub.status.idle":"2024-09-22T23:24:58.866755Z","shell.execute_reply.started":"2024-09-22T23:24:58.533443Z","shell.execute_reply":"2024-09-22T23:24:58.865738Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def prepare_test_data(planet_id):\n    signal_data = pd.read_parquet(f'/kaggle/input/ariel-data-challenge-2024/test/{planet_id}/AIRS-CH0_signal.parquet')\n    adc_info = test_adc_info[test_adc_info['planet_id'] == planet_id]  # Assuming test_adc_info is available\n    restored_signal = restore_dynamic_range(signal_data, adc_info['FGS1_adc_gain'].values[0], adc_info['FGS1_adc_offset'].values[0])\n    return restored_signal\n\n\n\nplanet_id_test = 499191466 \nrestored_signal_test = prepare_test_data(planet_id_test)\nrestored_signal_test.head()","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:24:58.86779Z","iopub.execute_input":"2024-09-22T23:24:58.868078Z","iopub.status.idle":"2024-09-22T23:25:01.202811Z","shell.execute_reply.started":"2024-09-22T23:24:58.868048Z","shell.execute_reply":"2024-09-22T23:25:01.201843Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"planet_id_test = 499191466  \nrestored_signal_test = prepare_test_data(planet_id_test)\n\nrestored_signal_test = restored_signal_test.values.reshape(-1, 1, 32, 356)\n\ntest_dataset = ExoplanetDataset(restored_signal_test, np.zeros((restored_signal_test.shape[0], 283)))  # Dummy labels\ntest_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:25:01.208066Z","iopub.execute_input":"2024-09-22T23:25:01.208388Z","iopub.status.idle":"2024-09-22T23:25:02.65275Z","shell.execute_reply.started":"2024-09-22T23:25:01.208354Z","shell.execute_reply":"2024-09-22T23:25:02.65152Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def evaluate_model(model, data_loader):\n    model.eval().cuda()\n    total_gll = 0\n    with torch.no_grad():\n        for x, _ in data_loader: \n            x = x.float().cuda()\n            outputs = model(x).detach().cpu().numpy()\n            y_true = np.zeros_like(outputs)  \n            sigma_user = np.ones_like(outputs) * 1e-5 \n            gll = -0.5 * (np.log(2 * np.pi) + np.log(sigma_user**2) + ((y_true - outputs)**2 / sigma_user**2))\n            total_gll += gll.sum()\n    return total_gll","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:25:02.65395Z","iopub.execute_input":"2024-09-22T23:25:02.654255Z","iopub.status.idle":"2024-09-22T23:25:02.661717Z","shell.execute_reply.started":"2024-09-22T23:25:02.654223Z","shell.execute_reply":"2024-09-22T23:25:02.66077Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"gll_value = evaluate_model(model, test_loader)\nprint(f'Gaussian Log-Likelihood: {gll_value}')","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:25:02.663018Z","iopub.execute_input":"2024-09-22T23:25:02.663605Z","iopub.status.idle":"2024-09-22T23:25:06.394996Z","shell.execute_reply.started":"2024-09-22T23:25:02.663554Z","shell.execute_reply":"2024-09-22T23:25:06.393838Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_spectra(y_true, y_pred, wavelengths):\n    plt.figure(figsize=(10, 6))\n    if y_true is not None:\n        plt.plot(wavelengths, y_true, label='True Spectrum', linestyle='--', color='blue')\n    plt.plot(wavelengths, y_pred, label='Predicted Spectrum', linestyle='-', color='red')\n    plt.xlabel('Wavelength')\n    plt.ylabel('Intensity')\n    plt.title('Exoplanet Atmospheric Spectrum')\n    plt.legend()\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:25:06.396242Z","iopub.execute_input":"2024-09-22T23:25:06.396594Z","iopub.status.idle":"2024-09-22T23:25:06.403827Z","shell.execute_reply.started":"2024-09-22T23:25:06.396538Z","shell.execute_reply":"2024-09-22T23:25:06.402834Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for x, _ in test_loader:\n    x = x.float().cuda()\n    outputs = model(x).cuda()\n    y_pred = outputs.detach().cpu().numpy()\n    wavelengths = np.arange(283)\n    plot_spectra(None, y_pred[0], wavelengths)\n    df = pd.DataFrame(y_pred)\n    df.to_csv('submission.csv')\n    break","metadata":{"execution":{"iopub.status.busy":"2024-09-22T23:25:40.369647Z","iopub.execute_input":"2024-09-22T23:25:40.370515Z","iopub.status.idle":"2024-09-22T23:25:40.679298Z","shell.execute_reply.started":"2024-09-22T23:25:40.370474Z","shell.execute_reply":"2024-09-22T23:25:40.678549Z"},"trusted":true},"execution_count":null,"outputs":[]}]}