{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Prepare filelists for MADASR23 dataset\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# See: https://github.com/espeak-ng/espeak-ng/blob/master/docs/languages.md\n",
    "language = \"bn\"\n",
    "audio_dir = \"/path/to/madasr23/bn\"\n",
    "metadata_file_path = \"../filelists/metadata.csv\"\n",
    "symlink = \"DUMMY3\"\n",
    "n_val = 100\n",
    "n_test = 500"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import glob\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Read dataset\n",
    "\n",
    "Here `normalized_text` contains numbers in the form of words.\n",
    "\n",
    "**Note**: you may need to replace all `\"|\"` with `\" | \"` in the file `metadata.csv` if you are using Windows.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>spkidx</th>\n",
       "      <th>spkid</th>\n",
       "      <th>txtid</th>\n",
       "      <th>uttid</th>\n",
       "      <th>text</th>\n",
       "      <th>phonemized_text</th>\n",
       "      <th>cleaned_text</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>16777288</td>\n",
       "      <td>629046</td>\n",
       "      <td>281474981563595</td>\n",
       "      <td>বাঁশের প্রায় দশ হাজার প্রজাতি হয় যেমন বাম্বুসা...</td>\n",
       "      <td>bˈãʃeɾ pɾˈajo dˈɔʃ hˈaɟaɾ pɾˈoɟatˌi hˈɔjo d͡ʒ...</td>\n",
       "      <td>2\\t27\\t136\\t26\\t150\\t109\\t30\\t105\\t5\\t40\\t105\\...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>16777288</td>\n",
       "      <td>629072</td>\n",
       "      <td>281474981405386</td>\n",
       "      <td>এক ধরনের পদ্ধতি যেটা দিয়ে শস্য থেকে খোসা ছাড়ান...</td>\n",
       "      <td>ˈek dʰˈɔɾɔnˌeɾ pˈɔddʰɔtˌi d͡ʒˈeʈa dˈie ʃˈɔssɔ ...</td>\n",
       "      <td>2\\t136\\t30\\t35\\t5\\t29\\t132\\t136\\t66\\t105\\t66\\t...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>16777288</td>\n",
       "      <td>629108</td>\n",
       "      <td>281474981563619</td>\n",
       "      <td>গুগলি বা ঝিনুকের মানে হল ওয়েস্টার আমরা খাই</td>\n",
       "      <td>ɡˈuɡɔlˌi bˈa ɟʰˈinukˌeɾ mˈane hˈɔl ˈoːeʃʈˌaɾ ˌ...</td>\n",
       "      <td>2\\t79\\t136\\t45\\t79\\t66\\t36\\t137\\t33\\t5\\t27\\t13...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>16777288</td>\n",
       "      <td>629112</td>\n",
       "      <td>281474981581650</td>\n",
       "      <td>বাগ আরশোলা ইত্যাদি সব পোকা গুলোর চাষ হয়</td>\n",
       "      <td>bˈaɡ ˈaɾɔʃˌola ˈitædˌi ʃˈɔb pˈoka ɡˈuloɾ t͡ʃˈa...</td>\n",
       "      <td>2\\t27\\t136\\t26\\t79\\t5\\t136\\t26\\t105\\t66\\t109\\t...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>16777288</td>\n",
       "      <td>629121</td>\n",
       "      <td>281474981582236</td>\n",
       "      <td>প্রাকৃতিক সব জিনিস গুলো দিয়া যখন চাষ করা হয়</td>\n",
       "      <td>pɾakɾˈitik ʃˈɔb ɟˈiniʃ ɡˈulo dˈia d͡ʒˈɔkʰɔn t͡...</td>\n",
       "      <td>2\\t40\\t105\\t26\\t35\\t105\\t136\\t33\\t44\\t33\\t35\\t...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   spkidx     spkid   txtid            uttid  \\\n",
       "0       0  16777288  629046  281474981563595   \n",
       "1       0  16777288  629072  281474981405386   \n",
       "2       0  16777288  629108  281474981563619   \n",
       "3       0  16777288  629112  281474981581650   \n",
       "4       0  16777288  629121  281474981582236   \n",
       "\n",
       "                                                text  \\\n",
       "0  বাঁশের প্রায় দশ হাজার প্রজাতি হয় যেমন বাম্বুসা...   \n",
       "1  এক ধরনের পদ্ধতি যেটা দিয়ে শস্য থেকে খোসা ছাড়ান...   \n",
       "2         গুগলি বা ঝিনুকের মানে হল ওয়েস্টার আমরা খাই   \n",
       "3            বাগ আরশোলা ইত্যাদি সব পোকা গুলোর চাষ হয়   \n",
       "4        প্রাকৃতিক সব জিনিস গুলো দিয়া যখন চাষ করা হয়   \n",
       "\n",
       "                                     phonemized_text  \\\n",
       "0  bˈãʃeɾ pɾˈajo dˈɔʃ hˈaɟaɾ pɾˈoɟatˌi hˈɔjo d͡ʒ...   \n",
       "1  ˈek dʰˈɔɾɔnˌeɾ pˈɔddʰɔtˌi d͡ʒˈeʈa dˈie ʃˈɔssɔ ...   \n",
       "2  ɡˈuɡɔlˌi bˈa ɟʰˈinukˌeɾ mˈane hˈɔl ˈoːeʃʈˌaɾ ˌ...   \n",
       "3  bˈaɡ ˈaɾɔʃˌola ˈitædˌi ʃˈɔb pˈoka ɡˈuloɾ t͡ʃˈa...   \n",
       "4  pɾakɾˈitik ʃˈɔb ɟˈiniʃ ɡˈulo dˈia d͡ʒˈɔkʰɔn t͡...   \n",
       "\n",
       "                                        cleaned_text  \n",
       "0  2\\t27\\t136\\t26\\t150\\t109\\t30\\t105\\t5\\t40\\t105\\...  \n",
       "1  2\\t136\\t30\\t35\\t5\\t29\\t132\\t136\\t66\\t105\\t66\\t...  \n",
       "2  2\\t79\\t136\\t45\\t79\\t66\\t36\\t137\\t33\\t5\\t27\\t13...  \n",
       "3  2\\t27\\t136\\t26\\t79\\t5\\t136\\t26\\t105\\t66\\t109\\t...  \n",
       "4  2\\t40\\t105\\t26\\t35\\t105\\t136\\t33\\t44\\t33\\t35\\t...  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.read_csv(\n",
    "    metadata_file_path,\n",
    "    sep=r\"|\",\n",
    "    header=0,\n",
    "    index_col=False,\n",
    ")\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Save train, val, test filelists\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>uttid</th>\n",
       "      <th>path</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>281474978136051</td>\n",
       "      <td>DUMMY3/split2/281474978136051.wav</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>281474979007026</td>\n",
       "      <td>DUMMY3/split2/281474979007026.wav</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>281474980681350</td>\n",
       "      <td>DUMMY3/split2/281474980681350.wav</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>281474980001437</td>\n",
       "      <td>DUMMY3/split2/281474980001437.wav</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>281474978326593</td>\n",
       "      <td>DUMMY3/split2/281474978326593.wav</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             uttid                               path\n",
       "0  281474978136051  DUMMY3/split2/281474978136051.wav\n",
       "1  281474979007026  DUMMY3/split2/281474979007026.wav\n",
       "2  281474980681350  DUMMY3/split2/281474980681350.wav\n",
       "3  281474980001437  DUMMY3/split2/281474980001437.wav\n",
       "4  281474978326593  DUMMY3/split2/281474978326593.wav"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "file_paths = {}\n",
    "for root, dirs, files in os.walk(audio_dir):\n",
    "    root_save = root.replace(audio_dir, symlink)\n",
    "    for file in files:\n",
    "        if file.endswith(\".wav\"):\n",
    "            uttid = file.split(\".\")[0]\n",
    "            file_paths[uttid] = os.path.join(root_save, file)\n",
    "\n",
    "files_paths = pd.DataFrame.from_dict(file_paths, orient=\"index\").reset_index()\n",
    "files_paths.columns = [\"uttid\", \"path\"]\n",
    "files_paths[\"uttid\"] = files_paths[\"uttid\"].astype(\"int64\")\n",
    "\n",
    "# pd.set_option(\"display.max_colwidth\", None)\n",
    "\n",
    "files_paths.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "files_paths types\n",
      "uttid     int64\n",
      "path     object\n",
      "dtype: object\n",
      "\n",
      "data types\n",
      "spkidx              int64\n",
      "spkid               int64\n",
      "txtid               int64\n",
      "uttid               int64\n",
      "text               object\n",
      "phonemized_text    object\n",
      "dtype: object\n"
     ]
    }
   ],
   "source": [
    "types = files_paths.dtypes\n",
    "print(\"files_paths types\")\n",
    "print(types)\n",
    "types = data.dtypes\n",
    "print(\"\\ndata types\")\n",
    "print(types)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>spkidx</th>\n",
       "      <th>spkid</th>\n",
       "      <th>txtid</th>\n",
       "      <th>uttid</th>\n",
       "      <th>text</th>\n",
       "      <th>phonemized_text</th>\n",
       "      <th>path</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>16777288</td>\n",
       "      <td>629046</td>\n",
       "      <td>281474981563595</td>\n",
       "      <td>বাঁশের প্রায় দশ হাজার প্রজাতি হয় যেমন বাম্বুসা ভেন্ট্রিকসা জায়ন্ট ব্যাম্বু ইত্যাদি</td>\n",
       "      <td>bˈãʃeɾ pɾˈajo dˈɔʃ hˈaɟaɾ pɾˈoɟatˌi hˈɔjo d͡ʒˈemɔn bˈambuʃˌa bʰˈenʈɾikˌɔʃa ɟˈajɔnʈˌɔ bˈæmbu ˈitædˌi</td>\n",
       "      <td>DUMMY3/split1/281474981563595.wav</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>16777288</td>\n",
       "      <td>629072</td>\n",
       "      <td>281474981405386</td>\n",
       "      <td>এক ধরনের পদ্ধতি যেটা দিয়ে শস্য থেকে খোসা ছাড়ানো হয়</td>\n",
       "      <td>ˈek dʰˈɔɾɔnˌeɾ pˈɔddʰɔtˌi d͡ʒˈeʈa dˈie ʃˈɔssɔ tʰˈeke kʰˈoʃa t͡ʃʰˈar.anˌo hˈɔjo</td>\n",
       "      <td>DUMMY3/split1/281474981405386.wav</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>16777288</td>\n",
       "      <td>629108</td>\n",
       "      <td>281474981563619</td>\n",
       "      <td>গুগলি বা ঝিনুকের মানে হল ওয়েস্টার আমরা খাই</td>\n",
       "      <td>ɡˈuɡɔlˌi bˈa ɟʰˈinukˌeɾ mˈane hˈɔl ˈoːeʃʈˌaɾ ˌamɔɾˌa kʰˈai</td>\n",
       "      <td>DUMMY3/split1/281474981563619.wav</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>16777288</td>\n",
       "      <td>629112</td>\n",
       "      <td>281474981581650</td>\n",
       "      <td>বাগ আরশোলা ইত্যাদি সব পোকা গুলোর চাষ হয়</td>\n",
       "      <td>bˈaɡ ˈaɾɔʃˌola ˈitædˌi ʃˈɔb pˈoka ɡˈuloɾ t͡ʃˈaʃ hˈɔjo</td>\n",
       "      <td>DUMMY3/split1/281474981581650.wav</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>16777288</td>\n",
       "      <td>629121</td>\n",
       "      <td>281474981582236</td>\n",
       "      <td>প্রাকৃতিক সব জিনিস গুলো দিয়া যখন চাষ করা হয়</td>\n",
       "      <td>pɾakɾˈitik ʃˈɔb ɟˈiniʃ ɡˈulo dˈia d͡ʒˈɔkʰɔn t͡ʃˈaʃ kˈɔɾa hˈɔjo</td>\n",
       "      <td>DUMMY3/split1/281474981582236.wav</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   spkidx     spkid   txtid            uttid  \\\n",
       "0       0  16777288  629046  281474981563595   \n",
       "1       0  16777288  629072  281474981405386   \n",
       "2       0  16777288  629108  281474981563619   \n",
       "3       0  16777288  629112  281474981581650   \n",
       "4       0  16777288  629121  281474981582236   \n",
       "\n",
       "                                                                                 text  \\\n",
       "0  বাঁশের প্রায় দশ হাজার প্রজাতি হয় যেমন বাম্বুসা ভেন্ট্রিকসা জায়ন্ট ব্যাম্বু ইত্যাদি   \n",
       "1                                  এক ধরনের পদ্ধতি যেটা দিয়ে শস্য থেকে খোসা ছাড়ানো হয়   \n",
       "2                                          গুগলি বা ঝিনুকের মানে হল ওয়েস্টার আমরা খাই   \n",
       "3                                             বাগ আরশোলা ইত্যাদি সব পোকা গুলোর চাষ হয়   \n",
       "4                                         প্রাকৃতিক সব জিনিস গুলো দিয়া যখন চাষ করা হয়   \n",
       "\n",
       "                                                                                        phonemized_text  \\\n",
       "0  bˈãʃeɾ pɾˈajo dˈɔʃ hˈaɟaɾ pɾˈoɟatˌi hˈɔjo d͡ʒˈemɔn bˈambuʃˌa bʰˈenʈɾikˌɔʃa ɟˈajɔnʈˌɔ bˈæmbu ˈitædˌi   \n",
       "1                        ˈek dʰˈɔɾɔnˌeɾ pˈɔddʰɔtˌi d͡ʒˈeʈa dˈie ʃˈɔssɔ tʰˈeke kʰˈoʃa t͡ʃʰˈar.anˌo hˈɔjo   \n",
       "2                                            ɡˈuɡɔlˌi bˈa ɟʰˈinukˌeɾ mˈane hˈɔl ˈoːeʃʈˌaɾ ˌamɔɾˌa kʰˈai   \n",
       "3                                                 bˈaɡ ˈaɾɔʃˌola ˈitædˌi ʃˈɔb pˈoka ɡˈuloɾ t͡ʃˈaʃ hˈɔjo   \n",
       "4                                        pɾakɾˈitik ʃˈɔb ɟˈiniʃ ɡˈulo dˈia d͡ʒˈɔkʰɔn t͡ʃˈaʃ kˈɔɾa hˈɔjo   \n",
       "\n",
       "                                path  \n",
       "0  DUMMY3/split1/281474981563595.wav  \n",
       "1  DUMMY3/split1/281474981405386.wav  \n",
       "2  DUMMY3/split1/281474981563619.wav  \n",
       "3  DUMMY3/split1/281474981581650.wav  \n",
       "4  DUMMY3/split1/281474981582236.wav  "
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Merge data and file paths\n",
    "df = pd.merge(data, files_paths, on=\"uttid\", how=\"left\")\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "281474981563595 DUMMY3/split1/281474981563595.wav\n",
      "281474981405386 DUMMY3/split1/281474981405386.wav\n",
      "281474981563619 DUMMY3/split1/281474981563619.wav\n",
      "281474981581650 DUMMY3/split1/281474981581650.wav\n",
      "281474981582236 DUMMY3/split1/281474981582236.wav\n",
      "281474981406024 DUMMY3/split1/281474981406024.wav\n",
      "281474981406039 DUMMY3/split1/281474981406039.wav\n",
      "281474981405337 DUMMY3/split1/281474981405337.wav\n",
      "281474981405777 DUMMY3/split1/281474981405777.wav\n",
      "281474981581658 DUMMY3/split1/281474981581658.wav\n"
     ]
    }
   ],
   "source": [
    "for i in range(10):\n",
    "    print(df[\"uttid\"][i], df[\"path\"][i])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Print first 10 rows with NaNs\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>spkidx</th>\n",
       "      <th>spkid</th>\n",
       "      <th>txtid</th>\n",
       "      <th>uttid</th>\n",
       "      <th>text</th>\n",
       "      <th>phonemized_text</th>\n",
       "      <th>path</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [spkidx, spkid, txtid, uttid, text, phonemized_text, path]\n",
       "Index: []"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df.isna().any(axis=1)].head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Save train, val, test filelists\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_save = df[[\"path\", \"spkidx\", \"cleaned_text\"]]\n",
    "data_save = data_save.sample(frac=1).reset_index(drop=True)\n",
    "\n",
    "# data_train = data_save.iloc[n_val + n_test :]\n",
    "# For testing purposes, we use a small subset of the training data\n",
    "data_train = data_save.iloc[n_val + n_test:]\n",
    "data_val = data_save.iloc[:n_val]\n",
    "data_test = data_save.iloc[n_val: n_val + n_test]\n",
    "\n",
    "data_train.to_csv(\"../filelists/train.txt\", sep=\"|\", index=False, header=False)\n",
    "data_val.to_csv(\"../filelists/val.txt\", sep=\"|\", index=False, header=False)\n",
    "data_test.to_csv(\"../filelists/test.txt\", sep=\"|\", index=False, header=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
