diff --git a/disdrodb/l0/l0_reader.py b/disdrodb/l0/l0_reader.py index eafd5ab6..78327337 100644 --- a/disdrodb/l0/l0_reader.py +++ b/disdrodb/l0/l0_reader.py @@ -258,7 +258,7 @@ def _check_reader_arguments(reader): import inspect signature = inspect.signature(reader) - reader_arguments = sorted(list(signature.parameters.keys())) + reader_arguments = sorted(signature.parameters.keys()) expected_arguments = sorted(_get_expected_reader_arguments()) if reader_arguments != expected_arguments: raise ValueError(f"The reader must be defined with the following arguments: {expected_arguments}") diff --git a/disdrodb/tests/test_l0/test_io.py b/disdrodb/tests/test_l0/test_io.py index 2fbee384..d3b546d5 100644 --- a/disdrodb/tests/test_l0/test_io.py +++ b/disdrodb/tests/test_l0/test_io.py @@ -159,7 +159,7 @@ def test__read_l0a(tmp_path): def test_read_l0a_dataframe(tmp_path): - filepaths = list() + filepaths = [] for i in [0, 1]: # create dummy dataframe diff --git a/disdrodb/tests/test_l0/test_l0b_processing.py b/disdrodb/tests/test_l0/test_l0b_processing.py index f381bb54..cd5b20aa 100644 --- a/disdrodb/tests/test_l0/test_l0b_processing.py +++ b/disdrodb/tests/test_l0/test_l0b_processing.py @@ -134,7 +134,7 @@ def test_create_l0b_from_l0a(create_test_config_files): "diameter_bin_center", ] assert set(ds.variables) == set(expected_variables) - assert set(ds.dims) == set(["diameter_bin_center", "time", "velocity_bin_center", "crs"]) + assert set(ds.dims) == {"diameter_bin_center", "time", "velocity_bin_center", "crs"} # Check that the geolocation coordinates have been properly set assert np.allclose(ds.latitude.values, df.latitude.values) diff --git a/pyproject.toml b/pyproject.toml index 0a3faafb..d03ab33b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -173,7 +173,7 @@ select = [ # flake8-slots "SLOT", # flake8-comprehensions - # "C4", + "C4", # Ruff custom rules # "RUF" diff --git a/tutorials/reader_preparation.ipynb b/tutorials/reader_preparation.ipynb index 880a97e3..0e9a1761 100644 --- a/tutorials/reader_preparation.ipynb +++ b/tutorials/reader_preparation.ipynb @@ -2,6 +2,7 @@ "cells": [ { "cell_type": "markdown", + "id": "7fb27b941602401d91542211134fc71a", "metadata": {}, "source": [ "# DISDRODB reader preparation tutorial" @@ -9,6 +10,7 @@ }, { "cell_type": "markdown", + "id": "acae54e37e7d407bbb7b55eff062a284", "metadata": {}, "source": [ "This notebook aims to guide you through creating the reader for the raw files logged by a disdrometer device. \n", @@ -20,6 +22,7 @@ }, { "cell_type": "markdown", + "id": "9a63283cbaf04dbcab1f6479b197f3a8", "metadata": {}, "source": [ "In this notebook, we uses a lightweight dataset for illustratory purposes. You may use it and readapt it for exploring your own dataset, when preparing a new reader. \n", @@ -35,6 +38,7 @@ }, { "cell_type": "markdown", + "id": "8dd0d8092fe74a7c96281538738b07e2", "metadata": {}, "source": [ "For this tutorial, we have prepared some sample data in the folder [data/DISDRODB](https://github.com/ltelab/disdrodb/tree/main/data/DISDRODB) of the [disdrodb](https://github.com/ltelab/disdrodb/) repository. In this tutorial, this `data/DISDRODB` directory will act as toy DISDRODB base directory.\n", @@ -65,6 +69,7 @@ }, { "cell_type": "markdown", + "id": "72eea5119410473aa328ad9291626812", "metadata": {}, "source": [ "## Step 1: Read and analyse the data" @@ -72,6 +77,7 @@ }, { "cell_type": "markdown", + "id": "8edb47106e1a46a883d545849b8ab81b", "metadata": {}, "source": [ "The goal of Step 1 is to define the specifications to read the raw data into a dataframe and ensure that the dataframe columns match the DISDRODB standards.\n", @@ -80,6 +86,7 @@ }, { "cell_type": "markdown", + "id": "10185d26023b46108eb7d9f57d49d2b3", "metadata": {}, "source": [ "--------------------------------------------------------------------\n", @@ -89,6 +96,7 @@ { "cell_type": "code", "execution_count": 1, + "id": "8763a12b2bbd4a93a75aff182afb95dc", "metadata": {}, "outputs": [ { @@ -110,56 +118,54 @@ { "cell_type": "code", "execution_count": 4, + "id": "7623eae2785240b9bd12b16a66d81610", "metadata": {}, "outputs": [], "source": [ - "import logging\n", "import pandas as pd\n", "\n", + "from disdrodb.api.checks import check_sensor_name\n", + "\n", "# Directory\n", "from disdrodb.api.create_directories import create_l0_directory_structure\n", + "from disdrodb.api.info import infer_path_info_dict\n", "\n", - "# Tools to develop the reader\n", - "from disdrodb.l0.template_tools import (\n", - " check_column_names,\n", - " infer_column_names,\n", - " print_df_first_n_rows,\n", - " print_df_random_n_rows,\n", - " print_df_column_names,\n", - " print_valid_l0_column_names,\n", - " get_df_columns_unique_values_dict,\n", - " print_df_columns_unique_values,\n", - " print_df_summary_stats,\n", - ")\n", + "# Standards\n", + "from disdrodb.api.path import define_campaign_dir\n", + "from disdrodb.l0.check_standards import check_l0a_column_names\n", "\n", "# L0A processing\n", "from disdrodb.l0.io import get_raw_filepaths\n", "from disdrodb.l0.l0a_processing import (\n", " read_raw_file,\n", " read_raw_files,\n", - " cast_column_dtypes,\n", - " write_l0a,\n", ")\n", "\n", "# L0B processing\n", "from disdrodb.l0.l0b_processing import (\n", - " retrieve_l0b_arrays,\n", " create_l0b_from_l0a,\n", - " set_encodings,\n", ")\n", "\n", - "# Metadata\n", - "from disdrodb.metadata import read_station_metadata\n", + "# Tools to develop the reader\n", + "from disdrodb.l0.template_tools import (\n", + " check_column_names,\n", + " get_df_columns_unique_values_dict,\n", + " infer_column_names,\n", + " print_df_column_names,\n", + " print_df_columns_unique_values,\n", + " print_df_first_n_rows,\n", + " print_df_random_n_rows,\n", + " print_df_summary_stats,\n", + " print_valid_l0_column_names,\n", + ")\n", "\n", - "# Standards\n", - "from disdrodb.api.path import define_campaign_dir\n", - "from disdrodb.api.info import infer_path_info_dict\n", - "from disdrodb.api.checks import check_sensor_name\n", - "from disdrodb.l0.check_standards import check_l0a_column_names\n" + "# Metadata\n", + "from disdrodb.metadata import read_station_metadata\n" ] }, { "cell_type": "markdown", + "id": "7cdc8c89c7104fffa095e18ddfef8986", "metadata": {}, "source": [ "**1. Define paths and running parameters**\n", @@ -174,6 +180,7 @@ { "cell_type": "code", "execution_count": 5, + "id": "b118ea5561624da68c537baed56e602f", "metadata": {}, "outputs": [ { @@ -189,15 +196,15 @@ "base_dir = os.path.join(root_path, \"data\", \"DISDRODB\")\n", "data_source = \"DATA_SOURCE\"\n", "campaign_name = \"CAMPAIGN_NAME\"\n", - "raw_dir = define_campaign_dir(base_dir=base_dir, \n", + "raw_dir = define_campaign_dir(base_dir=base_dir,\n", " product=\"RAW\",\n", " data_source=data_source,\n", - " campaign_name=campaign_name, \n", + " campaign_name=campaign_name,\n", ")\n", - "processed_dir = define_campaign_dir(base_dir=base_dir, \n", + "processed_dir = define_campaign_dir(base_dir=base_dir,\n", " product=\"L0A\",\n", " data_source=data_source,\n", - " campaign_name=campaign_name, \n", + " campaign_name=campaign_name,\n", ")\n", "assert os.path.exists(raw_dir), \"Raw directory does not exist\"\n", "print(f\"raw_dir: {raw_dir}\")\n", @@ -206,6 +213,7 @@ }, { "cell_type": "markdown", + "id": "938c804e27f84196a10c8828c723f798", "metadata": {}, "source": [ "Then we define the reader execution parameters. When the new reader will be created, these parameters will be become the reader function arguments. Please have a look [at the documentation](https://disdrodb.readthedocs.io/en/latest/readers.html#runing-a-reader) to get a full description. " @@ -214,6 +222,7 @@ { "cell_type": "code", "execution_count": 6, + "id": "504fb2a444614c0babb325280ed9130a", "metadata": {}, "outputs": [], "source": [ @@ -226,6 +235,7 @@ }, { "cell_type": "markdown", + "id": "59bbdb311c014d738909a11f9e486628", "metadata": {}, "source": [ "**2. Selection of the station**\n", @@ -236,6 +246,7 @@ { "cell_type": "code", "execution_count": 7, + "id": "b43b363d81ae4b689946ece5c682cd59", "metadata": {}, "outputs": [], "source": [ @@ -244,6 +255,7 @@ }, { "cell_type": "markdown", + "id": "8a65eabff63a45729fe45fb5ade58bdc", "metadata": {}, "source": [ "**3. Initialization**\n", @@ -254,6 +266,7 @@ { "cell_type": "code", "execution_count": 10, + "id": "c3933fab20d04ec698c2621248eb3be0", "metadata": {}, "outputs": [], "source": [ @@ -270,6 +283,7 @@ }, { "cell_type": "markdown", + "id": "4dd4641cc4064e0191573fe9c69df29b", "metadata": {}, "source": [ "Please, be sure to run the cell above only one time. If it is run many times, the log file blocks the folder creation. " @@ -277,6 +291,7 @@ }, { "cell_type": "markdown", + "id": "8309879909854d7188b41380fd92a7c3", "metadata": {}, "source": [ "**4. Get the list of file to process**\n", @@ -289,6 +304,7 @@ { "cell_type": "code", "execution_count": 11, + "id": "3ed186c9a28b402fb0bc4494df01f08d", "metadata": {}, "outputs": [ { @@ -316,6 +332,7 @@ }, { "cell_type": "markdown", + "id": "cb1e1581032b452c9409d6c6813c49d1", "metadata": {}, "source": [ "🚨 The `glob_pattern` variable definition will be transferred into your reader function at the end of this notebook.\n", @@ -325,6 +342,7 @@ }, { "cell_type": "markdown", + "id": "379cbbc1e968416e875cc15c1202d7eb", "metadata": {}, "source": [ "**5. Retrieve metadata from YAML files**\n", @@ -337,11 +355,12 @@ { "cell_type": "code", "execution_count": 12, + "id": "277c27b1587741f2af2001be3712ef0d", "metadata": {}, "outputs": [], "source": [ "# Retrieve metadata\n", - "attrs = read_station_metadata(station_name=station_name, \n", + "attrs = read_station_metadata(station_name=station_name,\n", " product=\"RAW\",\n", " **infer_path_info_dict(raw_dir))\n", "# Retrieve sensor name\n", @@ -351,6 +370,7 @@ }, { "cell_type": "markdown", + "id": "db7b79bc585a40fcaf58bf750017e135", "metadata": {}, "source": [ "**5. Load the one file into a dataframe**\n", @@ -361,6 +381,7 @@ { "cell_type": "code", "execution_count": 13, + "id": "916684f9a58a4a2aa5f864670399430d", "metadata": {}, "outputs": [ { @@ -805,6 +826,7 @@ { "cell_type": "code", "execution_count": 14, + "id": "1671c31a24314836a5b85d7ef7fbf015", "metadata": {}, "outputs": [ { @@ -825,6 +847,7 @@ }, { "cell_type": "markdown", + "id": "33b0902fd34d4ace834912fa1002cf8e", "metadata": {}, "source": [ "Here we expect the `df_raw` to have: \n", @@ -836,6 +859,7 @@ }, { "cell_type": "markdown", + "id": "f6fa52606d8c4a75a9b52967216f8f3f", "metadata": {}, "source": [ "Depending on the schema of your data, this `reader_kwargs` dictionary may be fairly different from the one above. \n", @@ -845,6 +869,7 @@ }, { "cell_type": "markdown", + "id": "f5a1fa73e5044315a093ec459c9be902", "metadata": {}, "source": [ "**6. Data exploration**\n", @@ -860,6 +885,7 @@ }, { "cell_type": "markdown", + "id": "cdf66aed5cc84ca1b48e60bad68798a8", "metadata": {}, "source": [ "We print the content first 3 rows :\n", @@ -869,6 +895,7 @@ { "cell_type": "code", "execution_count": 15, + "id": "28d3efd5258a48a79c179ea5c6759f01", "metadata": {}, "outputs": [ { @@ -939,6 +966,7 @@ { "cell_type": "code", "execution_count": 16, + "id": "3f9bc0b9dd2c44919cc8dcca39b469f8", "metadata": {}, "outputs": [ { @@ -1103,6 +1131,7 @@ }, { "cell_type": "markdown", + "id": "0e382214b5f147d187d36a2058b9c724", "metadata": {}, "source": [ "We print the content of n rows picked randomly : " @@ -1111,6 +1140,7 @@ { "cell_type": "code", "execution_count": 17, + "id": "5b09d5ef5b5e4bb6ab9b829b10b6a29f", "metadata": {}, "outputs": [ { @@ -1191,6 +1221,7 @@ }, { "cell_type": "markdown", + "id": "a50416e276a0479cbe66534ed1713a40", "metadata": {}, "source": [ "Get the number of column :" @@ -1199,6 +1230,7 @@ { "cell_type": "code", "execution_count": 18, + "id": "46a27a456b804aa2a380d5edf15a5daf", "metadata": {}, "outputs": [ { @@ -1218,6 +1250,7 @@ }, { "cell_type": "markdown", + "id": "1944c39560714e6e80c856f20744a8e5", "metadata": {}, "source": [ "Look at unique values for a single column :" @@ -1226,6 +1259,7 @@ { "cell_type": "code", "execution_count": 19, + "id": "d6ca27006b894b04b6fc8b79396e2797", "metadata": {}, "outputs": [ { @@ -1243,6 +1277,7 @@ }, { "cell_type": "markdown", + "id": "f61877af4e7f4313ad8234302950b331", "metadata": {}, "source": [ "Look at unique values for a few columns :\n", @@ -1253,6 +1288,7 @@ { "cell_type": "code", "execution_count": 20, + "id": "84d5ab97d17b4c38ab41a2b065bbd0c0", "metadata": {}, "outputs": [ { @@ -1272,6 +1308,7 @@ }, { "cell_type": "markdown", + "id": "35ffc1ce1c7b4df9ace1bc936b8b1dc2", "metadata": {}, "source": [ "Get the unique values as dictionary" @@ -1280,6 +1317,7 @@ { "cell_type": "code", "execution_count": 21, + "id": "76127f4a2f6a44fba749ea7800e59d51", "metadata": {}, "outputs": [ { @@ -1360,6 +1398,7 @@ }, { "cell_type": "markdown", + "id": "903197826d2e44dfa0208e8f97c69327", "metadata": {}, "source": [ "**7. Columns name**\n", @@ -1369,6 +1408,7 @@ }, { "cell_type": "markdown", + "id": "015066fb96f841e5be1e03a9eaadc3b6", "metadata": {}, "source": [ "The function `infer_column_names()` tries to guess the column names based on the type of sensor and the sensor specifications described within the [raw_data_format.yml config file](https://disdrodb.readthedocs.io/en/latest/sensor_configs.html#sensor-logged-variables) file." @@ -1377,6 +1417,7 @@ { "cell_type": "code", "execution_count": 23, + "id": "81ff116bae5b45f6b6dae177083008cf", "metadata": {}, "outputs": [ { @@ -1419,6 +1460,7 @@ }, { "cell_type": "markdown", + "id": "9075f00cfa8d463f84130041b1e44ca7", "metadata": {}, "source": [ "This can help us to define later the `column_names` list.\n", @@ -1429,6 +1471,7 @@ { "cell_type": "code", "execution_count": 24, + "id": "15abde8c5d2e435093904b13db685a53", "metadata": {}, "outputs": [ { @@ -1445,6 +1488,7 @@ }, { "cell_type": "markdown", + "id": "5e20a2a0e21149b5b06860e930401eb5", "metadata": {}, "source": [ "It's time now to define our current column names : \n", @@ -1458,6 +1502,7 @@ { "cell_type": "code", "execution_count": 25, + "id": "72c31777baf4441b988909d29205560c", "metadata": {}, "outputs": [], "source": [ @@ -1491,6 +1536,7 @@ }, { "cell_type": "markdown", + "id": "5734001bcbac423990a4356310d8df13", "metadata": {}, "source": [ "> 🚨 The `column_names` list will be transferred to the reader function at the end of this notebook. " @@ -1498,6 +1544,7 @@ }, { "cell_type": "markdown", + "id": "27531e93873647d9a5bf1112f2051a59", "metadata": {}, "source": [ "Check the validity of your definition " @@ -1506,6 +1553,7 @@ { "cell_type": "code", "execution_count": 26, + "id": "f3041e9ffdb2416ea2009d3a6a4c5716", "metadata": {}, "outputs": [ { @@ -1525,6 +1573,7 @@ }, { "cell_type": "markdown", + "id": "94ae71b6e24e4355a139fb9fe2e09b64", "metadata": {}, "source": [ "Ok, fair enough.\n", @@ -1535,6 +1584,7 @@ }, { "cell_type": "markdown", + "id": "9141936c6c8a4c478a75aea4ff665469", "metadata": {}, "source": [ "**8. Read the dataframe with correct columns name**\n", @@ -1545,6 +1595,7 @@ { "cell_type": "code", "execution_count": 27, + "id": "bd7c096f4dcf400fbdceb075ef31fca3", "metadata": {}, "outputs": [], "source": [ @@ -1553,6 +1604,7 @@ }, { "cell_type": "markdown", + "id": "b427a666a1b549ef9b573d6f946bfc3b", "metadata": {}, "source": [ "And print the dataframe column names : " @@ -1561,6 +1613,7 @@ { "cell_type": "code", "execution_count": 28, + "id": "0310869696a145bf841235dd6c036af8", "metadata": {}, "outputs": [ { @@ -1600,6 +1653,7 @@ }, { "cell_type": "markdown", + "id": "91f166d9f0ce4939b04b8e9245f75c27", "metadata": {}, "source": [ "**9. Perform further tests and analysis to check the correctness of `column_names`**" @@ -1607,6 +1661,7 @@ }, { "cell_type": "markdown", + "id": "7c10029e1707434ab3fe295caea7d13f", "metadata": {}, "source": [ "You can for example check some statistics for a specific column." @@ -1615,6 +1670,7 @@ { "cell_type": "code", "execution_count": 29, + "id": "f68f0888c55a4478ace3eac39384dff4", "metadata": {}, "outputs": [ { @@ -1640,6 +1696,7 @@ }, { "cell_type": "markdown", + "id": "f94f5a17fa734d288763e7d9a3758173", "metadata": {}, "source": [ "**10. Final columns formatting**" @@ -1648,6 +1705,7 @@ { "cell_type": "code", "execution_count": 30, + "id": "421b839107204e409e0496d3d944026c", "metadata": {}, "outputs": [ { @@ -1677,6 +1735,7 @@ { "cell_type": "code", "execution_count": 31, + "id": "e981b37c798e44f684168605b9db02c6", "metadata": {}, "outputs": [ { @@ -1696,6 +1755,7 @@ }, { "cell_type": "markdown", + "id": "40c1800d1c114147a536b8aa907907c7", "metadata": {}, "source": [ "Now, it's time to remove all the columns that does not match the DISDRODB standard." @@ -1704,6 +1764,7 @@ { "cell_type": "code", "execution_count": 32, + "id": "9082857fd66e4025bba99b1a80c5d976", "metadata": {}, "outputs": [], "source": [ @@ -1712,6 +1773,7 @@ }, { "cell_type": "markdown", + "id": "71b4158a9f3d49279f06ec9197b84529", "metadata": {}, "source": [ "It's also time to define the column `time` which is requested by the DISDRODB standard." @@ -1720,6 +1782,7 @@ { "cell_type": "code", "execution_count": 33, + "id": "6038e703eb6b4df2ba5a71336b77ea4e", "metadata": {}, "outputs": [], "source": [ @@ -1729,6 +1792,7 @@ }, { "cell_type": "markdown", + "id": "82ca0f16c5be4617b5535c40faa36c79", "metadata": {}, "source": [ "Now let's check that the column names, after custom processing, conform with the DISDRODB standards:" @@ -1737,6 +1801,7 @@ { "cell_type": "code", "execution_count": 34, + "id": "04aa693c20bd460494e518b8cb84ef11", "metadata": {}, "outputs": [], "source": [ @@ -1745,6 +1810,7 @@ }, { "cell_type": "markdown", + "id": "c8acbee542ae4f9e87d350f4747cb88d", "metadata": {}, "source": [ "Finally, check if the dataframe looks as desired:" @@ -1753,6 +1819,7 @@ { "cell_type": "code", "execution_count": 35, + "id": "e0a51dd6baab431990c6adcc83aa7fba", "metadata": {}, "outputs": [ { @@ -1787,6 +1854,7 @@ { "cell_type": "code", "execution_count": 36, + "id": "d84866adce69467fa81441dc6c47fd8a", "metadata": {}, "outputs": [ { @@ -1853,6 +1921,7 @@ { "cell_type": "code", "execution_count": 37, + "id": "deb6c23654f54f5b91a38c31054c5587", "metadata": {}, "outputs": [ { @@ -1870,6 +1939,7 @@ }, { "cell_type": "markdown", + "id": "9768d501ade64311a8ed6e9eb433fa9b", "metadata": {}, "source": [ "**11. Define the dataframe sanitizer function**\n", @@ -1884,6 +1954,7 @@ { "cell_type": "code", "execution_count": 38, + "id": "061962c182f9482c8b1341b2a6f73cd5", "metadata": {}, "outputs": [], "source": [ @@ -1913,6 +1984,7 @@ }, { "cell_type": "markdown", + "id": "8edfd84aa00d4424a71141df99c55e72", "metadata": {}, "source": [ "> 🚨 The `df_sanitizer_fun()` function will be transfered to the reader function at the end of this notebook. " @@ -1920,6 +1992,7 @@ }, { "cell_type": "markdown", + "id": "8c55fba33aa346cf939c9cd632996673", "metadata": {}, "source": [ "**12. Now let's try calling the reader function as it will be called in the DISDRODB L0 reader**\n", @@ -1929,6 +2002,7 @@ }, { "cell_type": "markdown", + "id": "ab13b4b6e2874167b7f2debb11dcd1d9", "metadata": {}, "source": [ "Here we combine all raw files in a single dataframe. \n", @@ -1946,6 +2020,7 @@ { "cell_type": "code", "execution_count": 39, + "id": "47d658866ccb404681cf21a4419000da", "metadata": {}, "outputs": [ { @@ -2362,6 +2437,7 @@ }, { "cell_type": "markdown", + "id": "5d973992396c4b758db40b17e80dc1fc", "metadata": {}, "source": [ "Here we derive the corresponding `xr.Dataset` object " @@ -2370,6 +2446,7 @@ { "cell_type": "code", "execution_count": 40, + "id": "1c9cbe9d9a794dbd8aaa1fa72bce99a9", "metadata": {}, "outputs": [ { @@ -2439,6 +2516,7 @@ }, { "cell_type": "markdown", + "id": "b434e0d67d894725aa1f6d707a143313", "metadata": {}, "source": [ "which can be saved as DISDRODB L0B netCDF by running the following code:" @@ -2447,6 +2525,7 @@ { "cell_type": "code", "execution_count": 41, + "id": "594a68b434714bab9e1df903f88edcdd", "metadata": {}, "outputs": [], "source": [ @@ -2456,6 +2535,7 @@ }, { "cell_type": "markdown", + "id": "4d59fedcae41437686ad1a71a1884d48", "metadata": {}, "source": [ "## Step 2 : Create the reader" @@ -2463,6 +2543,7 @@ }, { "cell_type": "markdown", + "id": "74a36f4709894f8e822f9c383b5c8674", "metadata": {}, "source": [ "Now we have all the parameters required to define a DISDRODB reader.\n", @@ -2472,6 +2553,7 @@ }, { "cell_type": "markdown", + "id": "13e578e05204494e9a74b868b4a9c0da", "metadata": {}, "source": [ "\n", @@ -2492,6 +2574,7 @@ }, { "cell_type": "markdown", + "id": "472c087bdaf047c4bd2daf3102168774", "metadata": {}, "source": [ "2. **Update the** `columns_names` **list**\n", @@ -2536,6 +2619,7 @@ }, { "cell_type": "markdown", + "id": "c11e5ea01d13400882806a9c4ab303ae", "metadata": {}, "source": [ "3. **Update the** `reader_kwargs` **" @@ -2543,6 +2627,7 @@ }, { "cell_type": "markdown", + "id": "a0755c77c2af48ad9c17a637f99c96f7", "metadata": {}, "source": [ "dictionary**\n", @@ -2594,6 +2679,7 @@ }, { "cell_type": "markdown", + "id": "c01db64ab1c14c5599cb15ec16f03e31", "metadata": {}, "source": [ "4. **Update the** `df_sanitizer_fun()` **function**\n", @@ -2637,6 +2723,7 @@ }, { "cell_type": "markdown", + "id": "f9ba92a60e8d4a7c9e00b1317491f415", "metadata": {}, "source": [ "You arrived at the end of the tutorial. Well done 👋👋👋 \n", @@ -2651,6 +2738,7 @@ }, { "cell_type": "markdown", + "id": "8b9c4a8a72cf4b1f8d918f50ea71471d", "metadata": {}, "source": [] }