| @@ -0,0 +1,688 @@ |
| 1 | { |
| 2 | "cells": [ |
| 3 | { |
| 4 | "cell_type": "markdown", |
| 5 | "id": "2bc817b1", |
| 6 | "metadata": {}, |
| 7 | "source": [ |
| 8 | "\n", |
| 9 | "# π Basic Data Analysis & Visualization\n", |
| 10 | "\n", |
| 11 | "This notebook demonstrates how to load a sample dataset, perform quick exploratory analysis, group and pivot the data, and create visualizations.\n", |
| 12 | "\n", |
| 13 | "Weβre using a CSV file from: https://sample-files.com/downloads/data/csv/basic-data.csv\n", |
| 14 | " " |
| 15 | ] |
| 16 | }, |
| 17 | { |
| 18 | "cell_type": "markdown", |
| 19 | "id": "a92fdfd1", |
| 20 | "metadata": {}, |
| 21 | "source": [ |
| 22 | "\n", |
| 23 | "## π¦ Install Dependencies\n", |
| 24 | "\n", |
| 25 | "If you haven't installed the required libraries, run:\n", |
| 26 | "\n", |
| 27 | "```bash\n", |
| 28 | "pip install pandas matplotlib seaborn\n", |
| 29 | "```\n", |
| 30 | " " |
| 31 | ] |
| 32 | }, |
| 33 | { |
| 34 | "cell_type": "code", |
| 35 | "execution_count": 15, |
| 36 | "id": "b5d7308a", |
| 37 | "metadata": {}, |
| 38 | "outputs": [ |
| 39 | { |
| 40 | "name": "stdout", |
| 41 | "output_type": "stream", |
| 42 | "text": [ |
| 43 | "Defaulting to user installation because normal site-packages is not writeable\n", |
| 44 | "Requirement already satisfied: pandas in /Users/cmc/Library/Python/3.9/lib/python/site-packages (2.2.3)\n", |
| 45 | "Requirement already satisfied: matplotlib in /Users/cmc/Library/Python/3.9/lib/python/site-packages (3.9.4)\n", |
| 46 | "Requirement already satisfied: seaborn in /Users/cmc/Library/Python/3.9/lib/python/site-packages (0.13.2)\n", |
| 47 | "Requirement already satisfied: numpy>=1.22.4 in /Users/cmc/Library/Python/3.9/lib/python/site-packages (from pandas) (1.26.4)\n", |
| 48 | "Requirement already satisfied: python-dateutil>=2.8.2 in /Users/cmc/Library/Python/3.9/lib/python/site-packages (from pandas) (2.9.0.post0)\n", |
| 49 | "Requirement already satisfied: pytz>=2020.1 in /Users/cmc/Library/Python/3.9/lib/python/site-packages (from pandas) (2025.2)\n", |
| 50 | "Requirement already satisfied: tzdata>=2022.7 in /Users/cmc/Library/Python/3.9/lib/python/site-packages (from pandas) (2025.2)\n", |
| 51 | "Requirement already satisfied: contourpy>=1.0.1 in /Users/cmc/Library/Python/3.9/lib/python/site-packages (from matplotlib) (1.3.0)\n", |
| 52 | "Requirement already satisfied: cycler>=0.10 in /Users/cmc/Library/Python/3.9/lib/python/site-packages (from matplotlib) (0.12.1)\n", |
| 53 | "Requirement already satisfied: fonttools>=4.22.0 in /Users/cmc/Library/Python/3.9/lib/python/site-packages (from matplotlib) (4.58.1)\n", |
| 54 | "Requirement already satisfied: kiwisolver>=1.3.1 in /Users/cmc/Library/Python/3.9/lib/python/site-packages (from matplotlib) (1.4.7)\n", |
| 55 | "Requirement already satisfied: packaging>=20.0 in /Users/cmc/Library/Python/3.9/lib/python/site-packages (from matplotlib) (24.2)\n", |
| 56 | "Requirement already satisfied: pillow>=8 in /Users/cmc/Library/Python/3.9/lib/python/site-packages (from matplotlib) (11.2.1)\n", |
| 57 | "Requirement already satisfied: pyparsing>=2.3.1 in /Users/cmc/Library/Python/3.9/lib/python/site-packages (from matplotlib) (3.2.3)\n", |
| 58 | "Requirement already satisfied: importlib-resources>=3.2.0 in /Users/cmc/Library/Python/3.9/lib/python/site-packages (from matplotlib) (6.5.2)\n", |
| 59 | "Requirement already satisfied: zipp>=3.1.0 in /Users/cmc/Library/Python/3.9/lib/python/site-packages (from importlib-resources>=3.2.0->matplotlib) (3.21.0)\n", |
| 60 | "Requirement already satisfied: six>=1.5 in /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/site-packages (from python-dateutil>=2.8.2->pandas) (1.15.0)\n", |
| 61 | "\n", |
| 62 | "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m25.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.1.1\u001b[0m\n", |
| 63 | "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49m/Library/Developer/CommandLineTools/usr/bin/python3 -m pip install --upgrade pip\u001b[0m\n", |
| 64 | "Note: you may need to restart the kernel to use updated packages.\n" |
| 65 | ] |
| 66 | } |
| 67 | ], |
| 68 | "source": [ |
| 69 | "pip install pandas matplotlib seaborn" |
| 70 | ] |
| 71 | }, |
| 72 | { |
| 73 | "cell_type": "code", |
| 74 | "execution_count": 16, |
| 75 | "id": "0632140a", |
| 76 | "metadata": {}, |
| 77 | "outputs": [], |
| 78 | "source": [ |
| 79 | "import pandas as pd\n", |
| 80 | "import matplotlib.pyplot as plt\n", |
| 81 | "import seaborn as sns\n", |
| 82 | "\n", |
| 83 | "# Set plot style\n", |
| 84 | "sns.set(style=\"whitegrid\")" |
| 85 | ] |
| 86 | }, |
| 87 | { |
| 88 | "cell_type": "markdown", |
| 89 | "id": "d326b5b6", |
| 90 | "metadata": {}, |
| 91 | "source": [ |
| 92 | "## π Load Dataset" |
| 93 | ] |
| 94 | }, |
| 95 | { |
| 96 | "cell_type": "code", |
| 97 | "execution_count": 21, |
| 98 | "id": "5d5de24b", |
| 99 | "metadata": {}, |
| 100 | "outputs": [ |
| 101 | { |
| 102 | "data": { |
| 103 | "text/html": [ |
| 104 | "<div>\n", |
| 105 | "<style scoped>\n", |
| 106 | " .dataframe tbody tr th:only-of-type {\n", |
| 107 | " vertical-align: middle;\n", |
| 108 | " }\n", |
| 109 | "\n", |
| 110 | " .dataframe tbody tr th {\n", |
| 111 | " vertical-align: top;\n", |
| 112 | " }\n", |
| 113 | "\n", |
| 114 | " .dataframe thead th {\n", |
| 115 | " text-align: right;\n", |
| 116 | " }\n", |
| 117 | "</style>\n", |
| 118 | "<table border=\"1\" class=\"dataframe\">\n", |
| 119 | " <thead>\n", |
| 120 | " <tr style=\"text-align: right;\">\n", |
| 121 | " <th></th>\n", |
| 122 | " <th>ID</th>\n", |
| 123 | " <th>Name</th>\n", |
| 124 | " <th>Age</th>\n", |
| 125 | " <th>Country</th>\n", |
| 126 | " <th>Email</th>\n", |
| 127 | " </tr>\n", |
| 128 | " </thead>\n", |
| 129 | " <tbody>\n", |
| 130 | " <tr>\n", |
| 131 | " <th>0</th>\n", |
| 132 | " <td>1</td>\n", |
| 133 | " <td>Name_1</td>\n", |
| 134 | " <td>62</td>\n", |
| 135 | " <td>Country_1</td>\n", |
| 136 | " <td>email_1@example.com</td>\n", |
| 137 | " </tr>\n", |
| 138 | " <tr>\n", |
| 139 | " <th>1</th>\n", |
| 140 | " <td>2</td>\n", |
| 141 | " <td>Name_2</td>\n", |
| 142 | " <td>48</td>\n", |
| 143 | " <td>Country_2</td>\n", |
| 144 | " <td>email_2@example.com</td>\n", |
| 145 | " </tr>\n", |
| 146 | " <tr>\n", |
| 147 | " <th>2</th>\n", |
| 148 | " <td>3</td>\n", |
| 149 | " <td>Name_3</td>\n", |
| 150 | " <td>61</td>\n", |
| 151 | " <td>Country_3</td>\n", |
| 152 | " <td>email_3@example.com</td>\n", |
| 153 | " </tr>\n", |
| 154 | " <tr>\n", |
| 155 | " <th>3</th>\n", |
| 156 | " <td>4</td>\n", |
| 157 | " <td>Name_4</td>\n", |
| 158 | " <td>32</td>\n", |
| 159 | " <td>Country_4</td>\n", |
| 160 | " <td>email_4@example.com</td>\n", |
| 161 | " </tr>\n", |
| 162 | " <tr>\n", |
| 163 | " <th>4</th>\n", |
| 164 | " <td>5</td>\n", |
| 165 | " <td>Name_5</td>\n", |
| 166 | " <td>69</td>\n", |
| 167 | " <td>Country_5</td>\n", |
| 168 | " <td>email_5@example.com</td>\n", |
| 169 | " </tr>\n", |
| 170 | " </tbody>\n", |
| 171 | "</table>\n", |
| 172 | "</div>" |
| 173 | ], |
| 174 | "text/plain": [ |
| 175 | " ID Name Age Country Email\n", |
| 176 | "0 1 Name_1 62 Country_1 email_1@example.com\n", |
| 177 | "1 2 Name_2 48 Country_2 email_2@example.com\n", |
| 178 | "2 3 Name_3 61 Country_3 email_3@example.com\n", |
| 179 | "3 4 Name_4 32 Country_4 email_4@example.com\n", |
| 180 | "4 5 Name_5 69 Country_5 email_5@example.com" |
| 181 | ] |
| 182 | }, |
| 183 | "execution_count": 21, |
| 184 | "metadata": {}, |
| 185 | "output_type": "execute_result" |
| 186 | } |
| 187 | ], |
| 188 | "source": [ |
| 189 | "# Load the dataset from URL\n", |
| 190 | "url = \"https://sample-files.com/downloads/data/csv/basic-data.csv\"\n", |
| 191 | "df = pd.read_csv(url, skiprows=1)\n", |
| 192 | "df.columns = df.columns.str.strip()\n", |
| 193 | "\n", |
| 194 | "# Preview the data\n", |
| 195 | "df.head()" |
| 196 | ] |
| 197 | }, |
| 198 | { |
| 199 | "cell_type": "markdown", |
| 200 | "id": "e7f7c2e7", |
| 201 | "metadata": {}, |
| 202 | "source": [ |
| 203 | "## π Basic Exploration" |
| 204 | ] |
| 205 | }, |
| 206 | { |
| 207 | "cell_type": "code", |
| 208 | "execution_count": 22, |
| 209 | "id": "aca7309e", |
| 210 | "metadata": {}, |
| 211 | "outputs": [ |
| 212 | { |
| 213 | "name": "stdout", |
| 214 | "output_type": "stream", |
| 215 | "text": [ |
| 216 | "(100, 5)\n" |
| 217 | ] |
| 218 | }, |
| 219 | { |
| 220 | "data": { |
| 221 | "text/html": [ |
| 222 | "<div>\n", |
| 223 | "<style scoped>\n", |
| 224 | " .dataframe tbody tr th:only-of-type {\n", |
| 225 | " vertical-align: middle;\n", |
| 226 | " }\n", |
| 227 | "\n", |
| 228 | " .dataframe tbody tr th {\n", |
| 229 | " vertical-align: top;\n", |
| 230 | " }\n", |
| 231 | "\n", |
| 232 | " .dataframe thead th {\n", |
| 233 | " text-align: right;\n", |
| 234 | " }\n", |
| 235 | "</style>\n", |
| 236 | "<table border=\"1\" class=\"dataframe\">\n", |
| 237 | " <thead>\n", |
| 238 | " <tr style=\"text-align: right;\">\n", |
| 239 | " <th></th>\n", |
| 240 | " <th>ID</th>\n", |
| 241 | " <th>Name</th>\n", |
| 242 | " <th>Age</th>\n", |
| 243 | " <th>Country</th>\n", |
| 244 | " <th>Email</th>\n", |
| 245 | " </tr>\n", |
| 246 | " </thead>\n", |
| 247 | " <tbody>\n", |
| 248 | " <tr>\n", |
| 249 | " <th>count</th>\n", |
| 250 | " <td>100.000000</td>\n", |
| 251 | " <td>100</td>\n", |
| 252 | " <td>100.000000</td>\n", |
| 253 | " <td>100</td>\n", |
| 254 | " <td>100</td>\n", |
| 255 | " </tr>\n", |
| 256 | " <tr>\n", |
| 257 | " <th>unique</th>\n", |
| 258 | " <td>NaN</td>\n", |
| 259 | " <td>100</td>\n", |
| 260 | " <td>NaN</td>\n", |
| 261 | " <td>10</td>\n", |
| 262 | " <td>100</td>\n", |
| 263 | " </tr>\n", |
| 264 | " <tr>\n", |
| 265 | " <th>top</th>\n", |
| 266 | " <td>NaN</td>\n", |
| 267 | " <td>Name_1</td>\n", |
| 268 | " <td>NaN</td>\n", |
| 269 | " <td>Country_1</td>\n", |
| 270 | " <td>email_1@example.com</td>\n", |
| 271 | " </tr>\n", |
| 272 | " <tr>\n", |
| 273 | " <th>freq</th>\n", |
| 274 | " <td>NaN</td>\n", |
| 275 | " <td>1</td>\n", |
| 276 | " <td>NaN</td>\n", |
| 277 | " <td>10</td>\n", |
| 278 | " <td>1</td>\n", |
| 279 | " </tr>\n", |
| 280 | " <tr>\n", |
| 281 | " <th>mean</th>\n", |
| 282 | " <td>50.500000</td>\n", |
| 283 | " <td>NaN</td>\n", |
| 284 | " <td>44.530000</td>\n", |
| 285 | " <td>NaN</td>\n", |
| 286 | " <td>NaN</td>\n", |
| 287 | " </tr>\n", |
| 288 | " <tr>\n", |
| 289 | " <th>std</th>\n", |
| 290 | " <td>29.011492</td>\n", |
| 291 | " <td>NaN</td>\n", |
| 292 | " <td>15.190012</td>\n", |
| 293 | " <td>NaN</td>\n", |
| 294 | " <td>NaN</td>\n", |
| 295 | " </tr>\n", |
| 296 | " <tr>\n", |
| 297 | " <th>min</th>\n", |
| 298 | " <td>1.000000</td>\n", |
| 299 | " <td>NaN</td>\n", |
| 300 | " <td>18.000000</td>\n", |
| 301 | " <td>NaN</td>\n", |
| 302 | " <td>NaN</td>\n", |
| 303 | " </tr>\n", |
| 304 | " <tr>\n", |
| 305 | " <th>25%</th>\n", |
| 306 | " <td>25.750000</td>\n", |
| 307 | " <td>NaN</td>\n", |
| 308 | " <td>32.000000</td>\n", |
| 309 | " <td>NaN</td>\n", |
| 310 | " <td>NaN</td>\n", |
| 311 | " </tr>\n", |
| 312 | " <tr>\n", |
| 313 | " <th>50%</th>\n", |
| 314 | " <td>50.500000</td>\n", |
| 315 | " <td>NaN</td>\n", |
| 316 | " <td>43.500000</td>\n", |
| 317 | " <td>NaN</td>\n", |
| 318 | " <td>NaN</td>\n", |
| 319 | " </tr>\n", |
| 320 | " <tr>\n", |
| 321 | " <th>75%</th>\n", |
| 322 | " <td>75.250000</td>\n", |
| 323 | " <td>NaN</td>\n", |
| 324 | " <td>59.250000</td>\n", |
| 325 | " <td>NaN</td>\n", |
| 326 | " <td>NaN</td>\n", |
| 327 | " </tr>\n", |
| 328 | " <tr>\n", |
| 329 | " <th>max</th>\n", |
| 330 | " <td>100.000000</td>\n", |
| 331 | " <td>NaN</td>\n", |
| 332 | " <td>69.000000</td>\n", |
| 333 | " <td>NaN</td>\n", |
| 334 | " <td>NaN</td>\n", |
| 335 | " </tr>\n", |
| 336 | " </tbody>\n", |
| 337 | "</table>\n", |
| 338 | "</div>" |
| 339 | ], |
| 340 | "text/plain": [ |
| 341 | " ID Name Age Country Email\n", |
| 342 | "count 100.000000 100 100.000000 100 100\n", |
| 343 | "unique NaN 100 NaN 10 100\n", |
| 344 | "top NaN Name_1 NaN Country_1 email_1@example.com\n", |
| 345 | "freq NaN 1 NaN 10 1\n", |
| 346 | "mean 50.500000 NaN 44.530000 NaN NaN\n", |
| 347 | "std 29.011492 NaN 15.190012 NaN NaN\n", |
| 348 | "min 1.000000 NaN 18.000000 NaN NaN\n", |
| 349 | "25% 25.750000 NaN 32.000000 NaN NaN\n", |
| 350 | "50% 50.500000 NaN 43.500000 NaN NaN\n", |
| 351 | "75% 75.250000 NaN 59.250000 NaN NaN\n", |
| 352 | "max 100.000000 NaN 69.000000 NaN NaN" |
| 353 | ] |
| 354 | }, |
| 355 | "execution_count": 22, |
| 356 | "metadata": {}, |
| 357 | "output_type": "execute_result" |
| 358 | } |
| 359 | ], |
| 360 | "source": [ |
| 361 | "# Check shape and summary stats\n", |
| 362 | "print(df.shape)\n", |
| 363 | "df.describe(include=\"all\")" |
| 364 | ] |
| 365 | }, |
| 366 | { |
| 367 | "cell_type": "code", |
| 368 | "execution_count": 23, |
| 369 | "id": "e775e42f", |
| 370 | "metadata": {}, |
| 371 | "outputs": [ |
| 372 | { |
| 373 | "name": "stdout", |
| 374 | "output_type": "stream", |
| 375 | "text": [ |
| 376 | " ID Name Age Country Email\n", |
| 377 | "0 1 Name_1 62 Country_1 email_1@example.com\n", |
| 378 | "1 2 Name_2 48 Country_2 email_2@example.com\n", |
| 379 | "2 3 Name_3 61 Country_3 email_3@example.com\n", |
| 380 | "3 4 Name_4 32 Country_4 email_4@example.com\n", |
| 381 | "4 5 Name_5 69 Country_5 email_5@example.com\n", |
| 382 | ".. ... ... ... ... ...\n", |
| 383 | "95 96 Name_96 60 Country_6 email_96@example.com\n", |
| 384 | "96 97 Name_97 26 Country_7 email_97@example.com\n", |
| 385 | "97 98 Name_98 52 Country_8 email_98@example.com\n", |
| 386 | "98 99 Name_99 24 Country_9 email_99@example.com\n", |
| 387 | "99 100 Name_100 55 Country_0 email_100@example.com\n", |
| 388 | "\n", |
| 389 | "[100 rows x 5 columns]\n" |
| 390 | ] |
| 391 | } |
| 392 | ], |
| 393 | "source": [ |
| 394 | "print(df)" |
| 395 | ] |
| 396 | }, |
| 397 | { |
| 398 | "cell_type": "markdown", |
| 399 | "id": "dc10be72", |
| 400 | "metadata": {}, |
| 401 | "source": [ |
| 402 | "## π Grouping and Pivoting Data" |
| 403 | ] |
| 404 | }, |
| 405 | { |
| 406 | "cell_type": "code", |
| 407 | "execution_count": 24, |
| 408 | "id": "f87ea8af", |
| 409 | "metadata": {}, |
| 410 | "outputs": [ |
| 411 | { |
| 412 | "data": { |
| 413 | "text/html": [ |
| 414 | "<div>\n", |
| 415 | "<style scoped>\n", |
| 416 | " .dataframe tbody tr th:only-of-type {\n", |
| 417 | " vertical-align: middle;\n", |
| 418 | " }\n", |
| 419 | "\n", |
| 420 | " .dataframe tbody tr th {\n", |
| 421 | " vertical-align: top;\n", |
| 422 | " }\n", |
| 423 | "\n", |
| 424 | " .dataframe thead th {\n", |
| 425 | " text-align: right;\n", |
| 426 | " }\n", |
| 427 | "</style>\n", |
| 428 | "<table border=\"1\" class=\"dataframe\">\n", |
| 429 | " <thead>\n", |
| 430 | " <tr style=\"text-align: right;\">\n", |
| 431 | " <th></th>\n", |
| 432 | " <th>Country</th>\n", |
| 433 | " <th>RecordCount</th>\n", |
| 434 | " </tr>\n", |
| 435 | " </thead>\n", |
| 436 | " <tbody>\n", |
| 437 | " <tr>\n", |
| 438 | " <th>0</th>\n", |
| 439 | " <td>Country_1</td>\n", |
| 440 | " <td>10</td>\n", |
| 441 | " </tr>\n", |
| 442 | " <tr>\n", |
| 443 | " <th>1</th>\n", |
| 444 | " <td>Country_2</td>\n", |
| 445 | " <td>10</td>\n", |
| 446 | " </tr>\n", |
| 447 | " <tr>\n", |
| 448 | " <th>2</th>\n", |
| 449 | " <td>Country_3</td>\n", |
| 450 | " <td>10</td>\n", |
| 451 | " </tr>\n", |
| 452 | " <tr>\n", |
| 453 | " <th>3</th>\n", |
| 454 | " <td>Country_4</td>\n", |
| 455 | " <td>10</td>\n", |
| 456 | " </tr>\n", |
| 457 | " <tr>\n", |
| 458 | " <th>4</th>\n", |
| 459 | " <td>Country_5</td>\n", |
| 460 | " <td>10</td>\n", |
| 461 | " </tr>\n", |
| 462 | " </tbody>\n", |
| 463 | "</table>\n", |
| 464 | "</div>" |
| 465 | ], |
| 466 | "text/plain": [ |
| 467 | " Country RecordCount\n", |
| 468 | "0 Country_1 10\n", |
| 469 | "1 Country_2 10\n", |
| 470 | "2 Country_3 10\n", |
| 471 | "3 Country_4 10\n", |
| 472 | "4 Country_5 10" |
| 473 | ] |
| 474 | }, |
| 475 | "execution_count": 24, |
| 476 | "metadata": {}, |
| 477 | "output_type": "execute_result" |
| 478 | } |
| 479 | ], |
| 480 | "source": [ |
| 481 | "# Example: Group by 'Country' and count number of records\n", |
| 482 | "country_counts = df[\"Country\"].value_counts().reset_index()\n", |
| 483 | "country_counts.columns = [\"Country\", \"RecordCount\"]\n", |
| 484 | "country_counts.head()" |
| 485 | ] |
| 486 | }, |
| 487 | { |
| 488 | "cell_type": "markdown", |
| 489 | "id": "f156d6de", |
| 490 | "metadata": {}, |
| 491 | "source": [ |
| 492 | "## π Visualizing Record Counts by Country" |
| 493 | ] |
| 494 | }, |
| 495 | { |
| 496 | "cell_type": "code", |
| 497 | "execution_count": 25, |
| 498 | "id": "d644fc06", |
| 499 | "metadata": {}, |
| 500 | "outputs": [ |
| 501 | { |
| 502 | "name": "stderr", |
| 503 | "output_type": "stream", |
| 504 | "text": [ |
| 505 | "/var/folders/pf/tt0qdz214wn0q90g989_0r0h0000gn/T/ipykernel_79108/1394705902.py:3: FutureWarning: \n", |
| 506 | "\n", |
| 507 | "Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.\n", |
| 508 | "\n", |
| 509 | " sns.barplot(data=country_counts, x='Country', y='RecordCount', palette='viridis')\n" |
| 510 | ] |
| 511 | }, |
| 512 | { |
| 513 | "data": { |
| 514 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAA00AAAJUCAYAAADJrc3LAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAABLd0lEQVR4nO3dB5hU5dk/4BcpAnZR0VhRbBi72A12jb3X2GtsGDR2JbFi+RT7Z+899hhbRKOxa4waRQ0KdqygKCjF+V/P+f6z7uJy5BwWt8x9X9e6uzPD7DuP786e33nLaVepVCoJAACARk3T+M0AAAAEoQkAACCH0AQAAJBDaAIAAMghNAEAAOQQmgAAAHIITQAAADmEJgAAgBxCEwDU45rvk6Y2QK0SmgBagF122SUtuuiiDT4WW2yxtNxyy6Wtttoq3X333aml++CDD7J233HHHT/72E8++SSdccYZacMNN0xLL710Wn311dP++++fXnjhhdScHnnkkXTkkUfmPuaoo45Ka6+99lRrw/fff5+uvvrqtPXWW6fll18+rbjiimmHHXZId911V7OGlv/+979pxx13bLafD9CcOjTrTwegTq9evVL//v3rvp8wYUIaPnx4dgB9xBFHpJlnnjn16dMntXYvvvhiOvDAA9Mss8ySdt1119SjR480cuTIdMstt2Th8bTTTktbbLFFs7Qtat2cPv/887T33nunjz/+OKvFUkstlX744Yf06KOPZmEtQuVJJ52U2rVr94u37YEHHkgvvfTSL/5zAVoCoQmghZh++unTMsss85Pbf/Ob36RVVlklG8Fp7aEpwtGhhx6aFlhggXTVVVelLl261N23wQYbpH333TedcMIJ2cjTbLPNlmpNjHJFUI4AGTWqWnPNNdOvfvWrdPbZZ6e11lorrbPOOs3aToBaY3oeQAs37bTTpk6dOjUYXYjRh0svvTStt9566de//nUWOK677rqf/NuY0rXllltmU+DiwPt//ud/0tixY+vuf/XVV9Nee+2VVlpppWwqYEyRi2lYVc8++2w25e7mm2/ODtbjMU8++WR230MPPZQ222yzbDQkfsYbb7zxs68l2vPpp5+mY445pkFgCtNMM006/PDD084775y++eabutvj5+20007ZVLVo52GHHZaNxFSdf/75WRsnFrfFffWnDt5///3pkEMOScsuu2w27e24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fs6f//znrEbbbbddtqtfvJ7YeS5ef2zKEDsbVte3Re1jDVtcIDj+38X/w7gwbgSuqFuIvhKbL8SmFfE80d54zMRT8Sa3NiFCbGOhbmJFXztASyY0AbRwMWoU21m/+eabWTgKMVIToSGunxQHwbHtc0yBuvLKK+sW80c4ioASoWS//fbLprzts88+dTvOxUhArJuKEZ84yI4QFmElduaLTSjyxGhXjIjEGps4eI/wE9uWT46YhnbbbbdlI10xehJtit3xYjpiPE+s1aqKEYoIYxFkIsjF64lRrpiGGKNQIUakImjF1tsRAGN0I4Li5KyxmljULAJqtCnC4KTEtuQR+iKcRT1jc4obb7yxwfS8aqCLKXKTO9ISa76iBhGaIpzEa47txGOdU9Qofl79kan4mbGWKrZij9AcI3/x+mMzhhB9IeoXtY3/xzHNM+q7/vrrF65N/JsYwTrqqKOynQt/TtHXDtCStauUWQELAPys2Ho7QlWMkk1qU462qpZfO9D2uE4TADSxmAYXm13ESGCMtNRSaKjl1w60XabnAUATi6mCsc4rpiDGtLlaUsuvHWi7TM8DAADIYaQJAAAgh9AEAACQQ2gCAADIUXO758UV22MZV1yHAwAAqF3jxo3LrikX1wDMU3OhKQKTvS8AAIDKZOaCmgtN1RGmuKo5AABQu1599dXJepw1TQAAADmEJgAAgBxCEwAAQA6hCQAAIIfQBAAAkENoAgAAyCE0AQAA5BCaAAAAcghNAAAAOYQmAACAHEITAABADqEJAAAgh9AEAACQQ2gCAADIITQBAAC0ltB0ySWXpF122aXBbYMHD06/+93v0jLLLJPWXnvtdO211zZb+wAAgNrTYkLTDTfckAYOHNjgthEjRqQ99tgjzTfffOn2229PBx54YDrrrLOyrwEAAH4JHVIz++STT1L//v3Ts88+mxZYYIEG9916662pY8eO6cQTT0wdOnRICy20UHr33XfTpZdemrbeeutmazMAAFA7mn2k6bXXXsuC0T333JOWXnrpBve98MILacUVV8wCU9XKK6+chg0blj7//PNmaC0AAFBrmn2kKdYpxUdjhg8fnhZZZJEGt80xxxzZ548//jjNNttspX5mpVJJo0ePnuT97dq1S7UqalOGmpWjbsWpWTnqVpyalaNuxalZOepWnJo1fvvk1KXZQ1Oe7777LnXq1KnBbdNOO232+fvvvy/9vOPGjcs2mGhMjHr16tWrwehWrRg/fnx6/fXXs/oUoWbFa/Zj3ZZIHTq0T7Vm/PgJ6fXXXyvZ19SsKHUr2deW6JU6tK/B97UJ49Prr03B+5q6Ffp3ala+ry2xRK/UvgbrNmHC+PRayb6mZuMavX/ivNGYFl21zp07p7Fjxza4rRqWunbtWvp5o9P07Nmz0fsiacbB/xlHXZnef2d4qhXzLjhnOmLAnmnhhRcufPaiWrMzT78tvf/+Z6lWzDvv7OmPR25bqmY/1q19OvXCO9N7H9XOdNP5fjVbOubALaegr7VPf7r6zjRseO3UbIE5Z0t/2r1czerX7bhb70hDP6uduvWYfbZ08nZble9r7Tuko+/7S3rni9qp2YLdZkunbbzNlPW19h3Snx+/Nb07snb+Hsw/8+yp/2+2m6K+dsnL16ePv/kk1Yq5pu+e9lv6d1PU1+Lg/943L0pfjP4o1YpuXX+VNl30gNJ9LWr2ryF/Tt+MeTfVium7zJ+W69l/kjUbMmTIZD1Piw5Nc845Z/r0008b3Fb9vnv37qWfNzrNz4WuCExvD34/1ZouXbqU/rcRmN4e8nGqNVNSsxCBaciw2gnoTVG3CExvfaBmRUVgeuMjdSsiAtMbn3pfKyoC01tf1s6BbFPULQLTu19/mGrNlPa1CEyffDss1ZopqVsEpq9Gv5VqTZdJ1Gxypyw2+0YQeXr37p1efPHFNGHChLrbnnnmmdSjR4/UrVu3Zm0bAABQG1p0aIptxb/55pt07LHHZkNnd9xxR7r66qvTfvvt19xNAwAAakSLDk0xmnT55ZenoUOHpi233DJdcMEF6Ygjjsi+BgAA+CW0qDVNAwYM+MltSy21VLrllluapT0AAAAteqQJAACguQlNAAAAOYQmAACAHEITAABADqEJAAAgh9AEAACQQ2gCAADIITQBAADkEJoAAAByCE0AAAA5hCYAAIAcQhMAAEAOoQkAACCH0AQAAJBDaAIAAMghNAEAAOQQmgAAAHIITQAAADmEJgAAgBxCEwAAQA6hCQAAIIfQBAAAkENoAgAAyCE0AQAA5BCaAAAAcghNAAAAOYQmAACAHEITAABADqEJAAAgh9AEAACQQ2gCAADIITQBAADkEJoAAAByCE0AAAA5hCYAAIAcQhMAAEAOoQkAACCH0AQAAJBDaAIAAMghNAEAAOQQmgAAAHIITQAAADmEJgAAgBxCEwAAQA6hCQAAIIfQBAAAkENoAgAAyCE0AQAA5BCaAAAAcghNAAAAOYQmAACAHEITAABADqEJAAAgh9AEAACQQ2gCAADIITQBAADkEJoAAAByCE0AAAA5hCYAAIAcQhMAAEAOoQkAACCH0AQAAJBDaAIAAMghNAEAAOQQmgAAAHIITQAAADmEJgAAgBxCEwAAQA6hCQAAIIfQBAAAkENoAgAAyCE0AQAA5BCaAAAAcghNAAAAOYQmAACAHEITAABAaw9N48ePT+eee25aa6210rLLLpt23nnn9O9//7u5mwUAANSAVhGaLr744nTbbbelk046Kd11112pR48eae+9906ffvppczcNAABo41pFaPr73/+eNtlkk7T66qun+eefPx111FFp1KhRRpsAAICprlWEpm7duqVHH300ffDBB2nChAnplltuSZ06dUqLLbZYczcNAABo4zqkVuDYY49Nffv2Teuss05q3759mmaaadL555+f5ptvvlLPV6lU0ujRoxu9r127dqlLly6pVo0ZMyarTxFqVrxmQd30taL0tXL0teL0tXL0teL0tXL0taarWdwWtWkToWnIkCFphhlmSBdeeGHq3r17tr7p8MMPT9dff31afPHFCz/fuHHj0uDBgxu9LzpTr169Uq0aOnRo1qmKULPiNQvqpq8Vpa+Vo68Vp6+Vo68Vp6+Vo681bc1iBlurD00ff/xxOuyww9LVV1+dVlhhhey2JZdcMgtSMdp00UUXFX7Ojh07pp49ezZ63+QkzbYsNtkoc+ailpWpWVA3fa0ofa0cfa04fa0cfa04fa0cfa3pahaZYnK0+ND08ssvZyNDEZTqW3rppdPjjz9e6jmj03Tt2rWJWti21PKwbVlqVo66Fadm5ahbcWpWjroVp2blqFvT1Wxyw2SL3whizjnnzD6/+eabDW5/66230gILLNBMrQIAAGpFiw9NSy21VFp++eXTkUcemZ555pk0bNiwNHDgwPT000+nfffdt7mbBwAAtHEtfnpe7JQXF7eNoHT00Uenr776Ki2yyCLZGqeYogcAAFDToSnMNNNMqX///tkHAADAL6nFT88DAABoTkITAABADqEJAAAgh9AEAACQQ2gCAADIITQBAADkEJoAAAByCE0AAAA5hCYAAIAcQhMAAEAOoQkAACCH0AQAAJBDaAIAAMghNAEAAOQQmgAAAHIITQAAADmEJgAAgBxCEwAAQA6hCQAAIIfQBAAAkENoAgAAyCE0AQAA5BCaAAAAcghNAAAAOYQmAACAHEITAABADqEJAAAgh9AEAACQQ2gCAADIITQBAADkEJoAAAByCE0AAAA5hCYAAIAcQhMAAEAOoQkAACCH0AQAAJBDaAIAAMghNAEAAOQQmgAAAHIITQAAADmEJgAAgBxCEwAAQA6hCQAAIIfQBAAAkENoAgAAyCE0AQAA5BCaAAAAcghNAAAAOYQmAACAHEITAABADqEJAAAgh9AEAACQQ2gCAADIITQBAADkEJoAAAByCE0AAAA5hCYAAIAcQhMAAEAOoQkAACCH0AQAAJBDaAIAAMghNAEAAOQQmgAAAHIITQAAADmEJgAAgBxCEwAAQA6hCQAAIIfQBAAA0NSh6eijj07vv/9+o/e98847af/99y/ztAAAAC1Oh8l94EcffVT39V133ZXWXXfd1L59+5887vHHH09PPfVU07UQAACgNYSmP//5z1kgqjrooIMafVylUkmrrbZa07QOAACgtYSmE088MRtBilB0zDHHpN///vdpvvnma/CYaaaZJs0444xppZVWmhptBQAAaLmhqXv37mnLLbfMvm7Xrl3q06dPmnXWWadm2wAAAFpPaKovwlOMOL3++utp9OjR2dcT6927d1O0DwAAoPWFpldeeSX17ds3DR8+PPu+GppiBCq+js+DBw9u2pYCAAC0ltB02mmnpQ4dOmSf55xzzmwtEwAAQFtUKjS99tpr6eyzz862Hf+lxDbnl156aXZ9qNiAInbv++1vf/uL/XwAAKA2lRoi6tatW6PXaJpa7r777nTsscemnXfeOd13331pk002Sf369UsvvfTSL9YGAACgNpUKTTvttFO65JJLsk0gprZYI3XuueemXXfdNQtNMcoU252vuuqq6bnnnpvqPx8AAKhtpabnvfvuu+ntt9/OLmK78MILp86dOze4PzaCuOaaa5qkgUOHDk0ffvhh2nTTTRvcfsUVVzTJ8wMAAEyV0LTYYovVfT/xluONbUE+JaEpxKjWXnvtlW1zPs8882SjTWuvvXap54z2TWqULAJfly5dUq0aM2ZM4f9/ala8ZkHd9LWi9LVy9LXi9LVy9LXi9LVy9LWmq1l15++pEpquu+669Ev55ptvss9HHnlktvnD4Ycfnh588MF0wAEHpKuuuiqtssoqhZ9z3Lhxk9wSPTpTr169Uq2KkBqdqgg1K16zoG76WlH6Wjn6WnH6Wjn6WnH6Wjn6WtPWrFOnTlMnNP2SOnbsmH2OUaa4qG5YfPHFsxGnsqEpnrNnz56N3jc5SbMt69GjR6kzF7WsTM2CuulrRelr5ehrxelr5ehrxelr5ehrTVezIUOGTNa/LxWaYlrczxX+kUceSU2he/fu2edFFlmkwe0Reh577LFSzxlt79q1a5O0r62p5WHbstSsHHUrTs3KUbfi1KwcdStOzcpRt6ar2eSGyVKhacUVV/zJD/j222/Tq6++mr7//vu02267paayxBJLpOmmmy69/PLLaYUVVqi7/a233sp20gMAAJiaSoWmAQMGTHKtUKw1KjM3dVJiZ7699947XXjhhdmo01JLLZVdq+nJJ59MV199dZP9HAAAgKm+pinWCsX1lI4++uh06KGHNtnzRhCLIbVzzjknffLJJ2mhhRZK559/flpppZWa7GcAAAD8IhtBfPXVV9lUvaa2xx57ZB8AAAAtPjTdddddP7ltwoQJafjw4en6669vsPYIAACg5kLTUUcdNcn7ll122XT88cdPSZsAAABad2hqbDvx2E1v+umnTzPOOGNTtAsAAKD1hqa555677uu33347jRo1Ks0yyywCEwAA0OaU3gjir3/9azr99NPT559/XnfbbLPNlg477LC0xRZbNFX7AAAAWl9oGjRoUPrjH/+YVl555dSvX78sLH366afpnnvuybYbn3nmmdOaa67Z9K0FAABoDaHp4osvThtuuGF23aT6tt566/SHP/whXXLJJUITAADQJkxT5h+99dZbacstt2z0vrj9jTfemNJ2AQAAtN7QFJs+xEVsGzNy5MjUqVOnKW0XAABA6w1Nq6yySrrggguyi9nW9/HHH6cLL7wwrbbaak3VPgAAgNa3pik2f4j1S+uvv352MdvYCCJ20XvppZfSTDPNlO2gBwAAULMjTbPPPnu688470y677JLGjBmT/vOf/2Sf4/u4vf51nAAAAGryOk3dunXLth0HAABoywqNNI0fPz5df/316eGHH25w+4QJE7Jd866++ur0ww8/NHUbAQAAWn5oGjduXDrggAPSKaeckq1dqu/LL7/MwtKAAQPSQQcdlIUoAACAmgpNt9xyS3rmmWfSWWedlY444oifrHG6++67s9D0+OOPp9tvv31qtBUAAKDlhqY77rgj7b777mnjjTee5GO22GKLtO2226bbbrutqdoHAADQOkLTu+++m1ZeeeWffVyfPn3SsGHDprRdAAAArSs0dejQIVvXNDmPa9eu3ZS2CwAAoHWFpoUXXjg9++yzP/u45557Ls0zzzxT2i4AAIDWFZo233zzdNNNN6VXXnllko957bXX0g033JB++9vfNlX7AAAAWsfFbbfZZpv017/+Ne2yyy7Z12uuuWY2ohRbjX/44YfZrnm33nprWnTRRbPHAAAA1FRoinVKl1xySTr11FOz7cdvvPHGuvsqlUq2lil2zuvXr1/q3Lnz1GovAABAywxNIcLQiSeemA499ND09NNPp+HDh6f27dunueeeO9tZb4YZZph6LQUAAGjpoalq1llnzb1eEwAAQM2FprvuuqvQE8eFbgEAAGomNB111FENvq9eiynWM018WxCaAACAmgpNjzzySN3XgwcPTn/84x/TAQcckG0vPsccc6QRI0akQYMGpfPPPz+ddtppU6u9AAAALTM0xWYPVQcffHAWmPbZZ5+627p375523HHHNHbs2HTmmWemPn36NH1rAQAAWurFbet7++23U69evRq9b8EFF0wffPDBlLYLAACg9YamBRZYIN17772N3hfXcFpkkUWmtF0AAACtd8vxAw88MPXt2zcNGzYsrbXWWmmWWWZJn3/+eXrooYfSkCFD0mWXXdb0LQUAAGgtoWn99ddPF154YbrooovSwIEDsx30pplmmrTsssumq6++Oq2wwgpN31IAAIDWEpqefvrptOqqq6a11147ff/99+mrr75KM888c+rUqVPTtxAAAKC1rWmK3fNiKl6Ydtppsy3HBSYAAKAtKhWaZpxxxtS5c+embw0AAEBbmJ633377pZNPPjkNHTo0LbbYYqlr164/eUzv3r2bon0AAACtLzT1798/+3zOOedkn9u1a1d3X2wKEd8PHjy4qdoIAADQukLTtdde2/QtAQAAaCuhacUVV2z6lgAAALSV0BRiPdN5552XnnvuufT1119nF7iN6zPFhW8XWmihpm0lAABAawpNQ4YMSTvssENq3759dq2m2WabLX322Wfp0UcfTY899li67bbbBCcAAKB2Q9NZZ52V5plnnnTdddelGWaYoe72UaNGpd122y3bIOKCCy5oynYCAAC0nus0Pf/882n//fdvEJhCfL/vvvtm9wMAANRsaOrQoUOadtppG72vU6dOaezYsVPaLgAAgNYbmpZccsl04403Ztdkqi++v+GGG9Kvf/3rpmofAABAsyq1pqlv375pxx13TJtttlnacMMN0+yzz55tBPHAAw9ku+pdddVVTd9SAACA1hKaYqTp8ssvT//zP/+TbfgQI0zt2rXLRpguu+yy1Lt376ZvKQAAQGu6TtPKK6+cbr755mz9UlynacYZZ0zjx4//yeYQAAAANbemady4cal///5pu+22S126dEndu3dPL730UlpllVXS6aefnn744YembykAAEBrCU3nn39+uueee9LGG29cd1uvXr3S4Ycfnm699dZs6h4AAEDNTs+7995705FHHpl22GGHuttmnnnmtPvuu2fbkV977bXZ9ZoAAABqcqRpxIgRad555230vgUXXDANHz58StsFAADQekNTBKMHH3yw0fsGDRqU5p9//iltFwAAQOudnrfrrrumo446Ko0cOTKtu+66qVu3bunLL79Mjz76aLr//vvTaaed1vQtBQAAaC2haYsttkjffvttuuiii9JDDz1Ud/sss8ySjj/++Ox+AACAmr5O084775x22mmnNHTo0GzEKa7TFNP2ppmm1Iw/AACAFmmKEk5c1DZC05tvvplmnXXWNGzYsFSpVJqudQAAAK11pOniiy9Ol1xySfruu+9Su3bt0lJLLZUGDhyY7ax35ZVXZiNPAAAANTnSdP3112cXuN1jjz2yi9lWR5d+97vfpffffz+de+65Td1OAACA1hOarrvuuuzitX379k1LLLFE3e19+vRJhx56aLbtOAAAQM2Gpo8++iituOKKjd4Xm0F8/vnnU9ouAACA1hua5pprrvTSSy81et9//vOf7H4AAICa3Qhim222ydY0de7cOa255prZbaNHj04PPvhgtjlErHUCAACo2dC0zz77pA8++CCdddZZ2UfYddddsw0hNttss7Tffvs1dTsBAABaT2iKLcZPPPHEtOeee6Znnnkmu7jtDDPMkHr37p169uyZbrrppuzitwAAADUVmh5//PF05513ZqFp8803z3bLW2CBBeruf+GFF9JWW22VXexWaAIAAGoqNN1zzz3piCOOSB07dkydOnVK999/fzrvvPPSeuutl400nXzyyem+++5L7du3t6YJAACovdB0zTXXpKWXXjpdccUVWWg6+uij04UXXpgWXnjhLCR9/PHHaY011kjHHHNM6tGjx9RtNQAAQEsLTcOGDUsnnXRSmn766bPvDzrooLTRRhulAw44II0dOzade+65aYMNNpiabQUAAGi5oSm2FK9//aW555472y2vQ4cO2dS9bt26Ta02AgAAtPyL20ZAivVKVdWv//CHPwhMAABAmzXZoWlS5phjjqZpCQAAQFsMTbH9OAAAQFtV6DpNf/rTn+o2gojpeuH4449P00033U+CVOy2BwAAUDOhqXfv3g3C0qRua+x7AACANh+arrvuutTchg4dmrbaaqtsdCs+AwAAtPg1Tb+UcePGpcMPPzzb+hwAAOCX0mpC0/nnn1+3ngoAAOCX0ipC0/PPP59uueWWNGDAgOZuCgAAUGMK7Z7XHL7++ut0xBFHpOOOOy7NNddcTfKcsVHFpKb5xc5/Xbp0SbVqzJgxhTfyULPiNQvqpq8Vpa+Vo68Vp6+Vo68Vp6+Vo681Xc3itsm5hFKLD02xzfmyyy6bNt100yZdHzV48OBG74vO1KtXr1SrYrON6FRFqFnxmgV109eK0tfK0deK09fK0deK09fK0deatmadOnVq3aHprrvuSi+88EK69957m/R5O3bsmHr27NnofbV+sd4ePXqUOnNRy8rULKibvlaUvlaOvlacvlaOvlacvlaOvtZ0NRsyZMhk/fsWHZpuv/329MUXX6Q111yzwe39+/dPf/vb39Lll19e6nmj03Tt2rWJWtm21PKwbVlqVo66Fadm5ahbcWpWjroVp2blqFvT1Wxyw2SLDk1nnXVW+u677xrctv7666dDDjkkbbbZZs3WLgAAoHa06NDUvXv3Rm/v1q3bJO8DAACouS3HAQAAmkuLHmlqzJtvvtncTQAAAGqIkSYAAIAcQhMAAEAOoQkAACCH0AQAAJBDaAIAAMghNAEAAOQQmgAAAHIITQAAADmEJgAAgBxCEwAAQA6hCQAAIIfQBAAAkENoAgAAyCE0AQAA5BCaAAAAcghNAAAAOYQmAACAHEITAABADqEJAAAgh9AEAACQQ2gCAADIITQBAADkEJoAAAByCE0AAAA5hCYAAIAcQhMAAEAOoQkAACCH0AQAAJBDaAIAAMghNAEAAOQQmgAAAHIITQAAADmEJgAAgBxCEwAAQA6hCQAAIIfQBAAAkENoAgAAyCE0AQAA5BCaAAAAcghNAAAAOYQmAACAHEITAABADqEJAAAgh9AEAACQQ2gCAADIITQBAADkEJoAAAByCE0AAAA5hCYAAIAcQhMAAEAOoQkAACCH0AQAAJBDaAIAAMghNAEAAOQQmgAAAHIITQAAADmEJgAAgBxCEwAAQA6hCQAAIIfQBAAAkENoAgAAyCE0AQAA5BCaAAAAcghNAAAAOYQmAACAHEITAABADqEJAAAgh9AEAACQQ2gCAADIITQBAADkEJoAAAByCE0AAAA5hCYAAIAcQhMAAEAOoQkAACCH0AQAANDaQ9PIkSPTCSeckH7zm9+k5ZZbLu24447phRdeaO5mAQAANaBVhKZ+/fqll156KZ199tnp9ttvT4svvnjaa6+90jvvvNPcTQMAANq4Fh+a3n333fTkk0+mP/3pT2mFFVZIPXr0SMcff3yaY4450r333tvczQMAANq4Fh+aZplllnTppZemJZdcsu62du3aZR9ff/11s7YNAABo+zqkFm7GGWdMffr0aXDbgw8+mI1AHXPMMaWes1KppNGjRzd6X4SxLl26pFo1ZsyYrD5FqFnxmgV109eK0tfK0deK09fK0deK09fK0dearmZxW9Sm1Yemif3rX/9KRx99dFp//fXTmmuuWeo5xo0blwYPHtzofdGZevXqlWrV0KFDs05VhJoVr1lQN32tKH2tHH2tOH2tHH2tOH2tHH2taWvWqVOnthWa/v73v6fDDz8820HvrLPOKv08HTt2TD179mz0vslJmm1ZrBkrc+ailpWpWVA3fa0ofa0cfa04fa0cfa04fa0cfa3pajZkyJDJ+vetJjRdf/316ZRTTkkbbrhhOv300ycrEeZ1mq5duzZp+9qKWh62LUvNylG34tSsHHUrTs3KUbfi1KwcdStuUjWb3DDZ4jeCCDfeeGM66aST0s4775xtOz4lgQkAAKCIDq1h/uGpp56a1ltvvbTffvulzz//vO6+zp07pxlmmKFZ2wcAALRtLT40xU55sXHDww8/nH3Ut+WWW6YBAwY0W9sAAIC2r8WHpv333z/7AAAAaA6tYk0TAABAcxGaAAAAcghNAAAAOYQmAACAHEITAABADqEJAAAgh9AEAACQQ2gCAADIITQBAADkEJoAAAByCE0AAAA5hCYAAIAcQhMAAEAOoQkAACCH0AQAAJBDaAIAAMghNAEAAOQQmgAAAHIITQAAADmEJgAAgBxCEwAAQA6hCQAAIIfQBAAAkENoAgAAyCE0AQAA5BCaAAAAcghNAAAAOYQmAACAHEITAABADqEJAAAgh9AEAACQQ2gCAADIITQBAADkEJoAAAByCE0AAAA5hCYAAIAcQhMAAEAOoQkAACCH0AQAAJBDaAIAAMghNAEAAOQQmgAAAHIITQAAADmEJgAAgBxCEwAAQA6hCQAAIIfQBAAAkENoAgAAyCE0AQAA5BCaAAAAcghNAAAAOYQmAACAHEITAABADqEJAAAgh9AEAACQQ2gCAADIITQBAADkEJoAAAByCE0AAAA5hCYAAIAcQhMAAEAOoQkAACCH0AQAAJBDaAIAAMghNAEAAOQQmgAAAHIITQAAADmEJgAAgBxCEwAAQA6hCQAAIIfQBAAAkENoAgAAyCE0AQAA5BCaAAAAcghNAAAAOYQmAACA1h6afvjhh3TeeeelNdZYIy2zzDJpn332Se+//35zNwsAAKgBrSI0XXTRRenGG29MJ510Urr55puzELX33nunsWPHNnfTAACANq7Fh6YIRldeeWU65JBD0pprrpkWW2yxdM4556Thw4enhx56qLmbBwAAtHEtPjS98cYb6dtvv02rrLJK3W0zzjhj6tWrV3r++eebtW0AAEDb165SqVRSCxajSQcffHB6+eWXU+fOnetu79u3b/ruu+/SJZdcUuj5/vWvf6V4yR07dpzkY9q1a5e++nJUGj9+QqoVHTq0TzPNOkNWmzKymo38No2fUEM1a98+zTTzdKVrVq3byK9H11zdZp6x6xT1tRHfjK65389Zpi9fs7q6ffttGjfhh1QrOrafJs0yXfnf0ajZl6O/TeN/qKG+Nk37NGvXKX9fG/Fd7dVtls5T1tdGjf2m5mo2Q6fpp7ivjR73dfqhUjt1m6Zd+9S144xT1NfGjhuRfqiMT7VimnYdUqeOs0yyZuPGjcvqstxyy+U+T4fUwo0ZMyb73KlTpwa3TzvttOmrr74q/HxRlPqfJyUCRC36ubrkiQBRi6akZiECRC2akrpFgKhFU9rXIkDUoimpWwSIWjTFfa2zuhUVAaIWTWlfiwBRi6akbhEgalG7SdQsbp+cerb40FQdXYq1TfVHmr7//vvUpUuXws+37LLLNmn7AACAtq3Fr2maa665ss+ffvppg9vj++7duzdTqwAAgFrR4kNT7JY3/fTTp2effbbutq+//jq9/vrrqXfv3s3aNgAAoO1r8dPzYi3T7373u3TWWWelWWedNc0999zpzDPPTHPOOWdaf/31m7t5AABAG9fiQ1OIazSNHz8+HXfccdmOeTHCdMUVV+TugAcAAFATW44DAAA0pxa/pgkAAKA5CU0AAAA5hCYAAIAcQhMAAEAOoQkAACCH0AQAAJBDaAIAmIgrsgD1CU0AtAoOYvmlfPnll6ldu3bN3YxWye8pbZXQBPAL++6775q7Ca3OySefnIYOHdrczWh1fvjhh+ZuQqvzhz/8IZ1zzjnZ1wJAccImbVWH5m4ATevaa69NK664YlpsscWauymtyoUXXpg+/fTT9PXXX6cddtghLbnkkqlr167N3awW39e++uqr9P3332cHGe3bt88OMPzBzNe3b98022yzpYMPPjjNPPPMzd2cVmHHHXdMX3zxRTriiCOauymtyqmnnpo++eST9M0336Rdd901rbrqqqljx47N3awWbZdddknPP/986t27d/a997PJc/HFF2e/o3FC6KCDDkpzzjmnvwc/46677kqjRo3Kfj+32GKL1K1bt9SpU6fmblaLd8MNN2R1mzBhQtp2223TLLPM8ou9rwlNbcjbb7+drr766vSf//wn7b///mnBBRds7ia1CnvuuWc2FaNXr17ZmezDDjssHX300WnjjTdu7qa16AOLCEzxh/Hll19O77zzTrrooov8gZwMo0ePzt70Z5111qyOM844Y3M3qcUHprFjx2YHGHFA4UBs8uyxxx7ZQezaa6+dnnvuueykkMCUL06YjR8/Pv35z39Of/nLX7ITQlGzaaYxKSfP7rvvnkaOHJkWXnjh9OKLL6bBgwen22+/Pfs99fs66d/POPCfaaaZ0nvvvZduu+229Lvf/S5ts802/ibkiL+Z8b4Wfz8//PDDdOedd2YnhDbddNMsPE1tQlMbMsccc2TJ+4UXXkj/+7//m/bbb7+00EILNXezWrRLLrkke+O66aabUpcuXbLbdtppp3TNNdcITZNw7rnnpm+//TY7qIg/iPHHMT7iDGPnzp2bu3ktXowCR9C84IILspHNGHGafvrpm7tZLfbAIk5oPPjgg3W3jRs3Lnuf69ChQza6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+NlSSy3V4DniukJnnnlmdsGvDTbYINUCdStOzcpRt+LUrBx1K07NylG34tSsRuv2i0Y0Jsuzzz5b2XLLLStDhgypS9ZPPPFE5eyzz64sueSS2XzPpZdeOkvhY8eOrUvtjz76aHZ7LZ2xqE/dilOzctStODUrR92KU7Ny1K04NautuglNzWz48OENhioffvjhyoorrljZfffdK99++21l3LhxDR7/4YcfVs4999zK9ttvX1l55ZUrX3/9dd19I0eOrLzwwguVWqBuxalZOepWnJqVo27FqVk56lacmpXTlupmy/FmNHbs2DRw4MB04403Zt+/8cYb2dDlwgsvnF555ZX0+eefpw4dOmSPq269+Ktf/SodeOCB6dprr03zzjtvuuiii7L7xo8fn2aaaaa0/PLLp7ZO3YpTs3LUrTg1K0fdilOzctStODUrp63VTWhqRp06dco6x8knn5zN4Yw5miuuuGLq27dvmnvuudNee+2Vvvnmm+xx0VmqF+2Kz3Fbr1690siRI7PbotPVCnUrTs3KUbfi1KwcdStOzcpRt+LUrJy2VjehqZkdfPDBafHFF0///ve/0yKLLJJmnnnmtNxyy6XjjjsuTTvttGnrrbfOOlR0luhQVSNGjMgW0H3wwQdZQq+1/TzUrTg1K0fdilOzctStODUrR92KU7Ny2lLdhKZmUP9//JdffpkNP26zzTbpqquuSldffXWWsGP48YQTTsiS9rbbbptGjRrVIGVX/92xxx6bPaZ6ZeS2TN2KU7Ny1K04NStH3YpTs3LUrTg1K6fSVuvWbKupalT9xXDVxW2xM0g455xzKosuumjlqquuqnvM888/X1ljjTUqhxxyyE+e6/vvv6/UCnUrTs3KUbfi1KwcdStOzcpRt+LUrJwJbbhuzT9BsIZE8q7uT3/FFVdke9J37do1m+e5yiqrZHM8I0mffvrp2eeddtopffvtt9kiuqWXXvonzxfJuxaoW3FqVo66Fadm5ahbcWpWjroVp2blVNp63Zo7tdWK+lcyHjhwYHYl45NOOqmy/vrrV9Zee+3KrbfemiXqeFxstRhJvHfv3pUDDzyw7t+OHz++UmvUrTg1K0fdilOzctStODUrR92KU7NyfqiBuglNv7DYf36fffapvPTSS3W37bfffpUNNtigrkNV97E/77zz6vavr98Za5G6Fadm5ahbcWpWjroVp2blqFtxalbOh224bkLTL+iaa66prLnmmpXNNtus8t5779XdHnM963eouNhXfRNf+KvWqFtxalaOuhWnZuWoW3FqVo66Fadm5VzTxutm97ypaOLtETfddNPUuXPn9Oabb9Zd4Ct07NgxXXDBBWnBBRdMZ5xxRnrqqaca/LuWsDf9L0ndilOzctStODUrR92KU7Ny1K04NSunUmt1a+7UVguuu+66yv333599/dVXX1XWXXfdykYbbZTtGFJ/ODKS9hlnnNHi53T+UtStODUrR92KU7Ny1K04NStH3YpTs3Kuq5G6CU1T2fDhwyt77LFHZbXVVqsMGjQou23EiBGVtdZaq7Lpppv+pENVtdYO1VTUrTg1K0fdilOzctStODUrR92KU7NyhtdQ3YSmqbQ/ff0OEovh+vbtW+nTp0/lkUceqetQsZvIFltsUXnqqadaxQK4qUndilOzctStODUrR92KU7Ny1K04NStnQg3XTWiaism7vn//+9+Vgw8+OOtQ1SQ+cuTIylJLLVU54ogjmqmVLY+6Fadm5ahbcWpWjroVp2blqFtxalbO8Bqsm9A0Fdx3332V5ZdfPhuSrC+S+N577135zW9+U3nyySez20aNGtUqhyinBnUrTs3KUbfi1KwcdStOzcpRt+LUrJz7arRuds+bCmaeeebsysbHHntseuGFF+puX2aZZdJGG22UPvnkk7TvvvumZ599Nk0//fSpffv2acKECanWqVtxalaOuhWnZuWoW3FqVo66Fadm5cxcq3Vr7tTWVuZ2TuyVV16p7Lnnntl8zvpJ/MUXX6z069evctttt7WZ5F2GuhWnZuWoW3FqVo66Fadm5ahbcWpWjrr9qF38p7mDW2sV+89PM83/Ddbde++9adiwYemjjz5Kq622WlpvvfXS+++/nwYMGJDeeeed1L9//9SzZ890yimnpNlmmy2deOKJ2b+L5B0JvJaoW3FqVo66Fadm5ahbcWpWjroVp2blqFtDQlMTiAt13XHHHWmFFVZIb7/9dhozZkxaeOGF08CBA9MHH3yQzj777PSPf/wj/epXv0rTTTdd9ti40FeUvl27dqlWqVtxalaOuhWnZuWoW3FqVo66Fadm5ajb/1dv1IkSHn744ewiXq+99lrdbTfddFNls802y4Yn40JeX375ZeWJJ57ILvxVHaqM22uZuhWnZuWoW3FqVo66Fadm5ahbcWpWjrr9qEM1PPHzvvjii/TZZ59lw4yRsMN7772X5pprrrTQQgulcePGZcl6q622Sl999VW6+eabs6HMGK5cffXV654nhio7dKid0qtbcWpWjroVp2blqFtxalaOuhWnZuWoWz67502mY445JvXt2zdtscUW2cdVV12V3R6dJTrOtNNOm3WksWPHpk6dOqWtt946DR8+PBvGnFhbmds5OdStODUrR92KU7Ny1K04NStH3YpTs3LU7ecJTZNhjz32yBa57bnnnunaa6/N5nDGlophk002yTrMJZdckn0fHSlEB1tsscWy+Z21St2KU7Ny1K04NStH3YpTs3LUrTg1K0fdJk/bGztrYueff3624O2iiy5Ks846a4PdRGKB21JLLZV22WWXdOWVV6Zvv/02bb/99umbb75J55xzTurcuXNaYoklUi1St+LUrBx1K07NylG34tSsHHUrTs3KUbfJJzT9jNdffz2tu+66dR0pVLdfjB1BosN06dIl7bPPPumKK67IEnr37t1Tt27dsq/jsfW3bKwV6lacmpWjbsWpWTnqVpyalaNuxalZOeo2+YSmSYgOEIvh/vWvf6Xddtut7raJO8WIESPSfffdl/r06ZPtYf/aa69lHalXr17ZY8ePH98mF8NNiroVp2blqFtxalaOuhWnZuWoW3FqVo66Fdf2Y2FJ0RHi4lzTTz99evrpp+tuqy+GLWeZZZbUo0eP9Mknn2SPj07161//ui5510pHqlK34tSsHHUrTs3KUbfi1KwcdStOzcpRt+KEpkmIjhJbKy644ILpmWeeSUOHDv3JY6oX7IqtFeNiXhOrhaHKialbcWpWjroVp2blqFtxalaOuhWnZuWoW3G19WoLqM7jPOigg7L5npdffnk2jDmxL7/8Mo0aNSobpkTdylCzctStODUrR92KU7Ny1K04NStH3Uqod6FbJuHWW2+tLLHEEpWDDz648tRTT9Vd6fjDDz+s7LfffpXtttuu7grI/EjdilOzctStODUrR92KU7Ny1K04NStH3SZPu/hPmbBVS6JEDz/8cOrfv392wa7YNSQSeszjjKHJa665JrvgVwxfttULepWhbsWpWTnqVpyalaNuxalZOepWnJqVo26TR2gq4KOPPkpPPfVUeuWVV7KFcYsuumjaYIMNsg5US7uHFKVuxalZOepWnJqVo27FqVk56lacmpWjbvmEpiZQ68m7LHUrTs3KUbfi1KwcdStOzcpRt+LUrBx1+z9CU0FRrupuIvW/Jp+6Fadm5ahbcWpWjroVp2blqFtxalaOuk2a0AQAAJDDluMAAAA5hCYAAIAcQhMAAEAOoQkAACCH0AQAAJBDaAIAAMghNAHAZHKVDoDa1KG5GwAAE3v11VfTtddem55//vn05ZdfpjnmmCOtssoqad99903zzjtvs7TpoosuSp06dUp77713s/x8AJqPkSYAWpQbbrgh7bDDDumLL75Ihx12WLrsssuysPTcc8+lbbbZJr3xxhvN0q5zzz03jRkzpll+NgDNy0gTAC3Giy++mE455ZS08847p2OPPbbu9pVWWimtu+66aYsttkjHHHNMuuOOO5q1nQDUFiNNALQYV1xxRZphhhlSv379fnLfrLPOmo466qi0zjrrpNGjR6cJEyZko1KbbrppWmqppdKaa66ZzjrrrPT999/X/Ztddtkl+6jv2WefTYsuumj2OUQA69WrV3r55ZfT9ttvn5Zccsm01lprZW2piseHCy64oO7r888/P6233nrZbSuuuGJaffXV03HHHZe1ZdSoUT+Z2rf88ssbqQJopYQmAFrMJgv//Oc/s7VLXbp0afQxG220UTrwwANT165d0wknnJBOO+20bATq4osvzkanrr/++nTAAQcU3rDhhx9+SIceemj2/Jdeemlabrnl0hlnnJGeeOKJ7P5bbrkl+xzTA6tfh48++ij94x//SOecc046+uij0x577JGFtgceeKDB8999993Zc0/qdQHQspmeB0CLMGLEiCxwzDPPPD/72CFDhqS//OUv2ZqnWO8UVltttWzDiCOOOCI9/vjjqU+fPpP9syNkRdjadttts+9jVOjhhx9Ojz32WFpjjTXSMsssk90+55xz1n0dxo8fn4488si0wgor1N227LLLZiGp+lz/+te/0rBhw9KAAQMKVAOAlsRIEwAtQvv27bPPMe3u58SmEGHjjTducHt8H89TnXpXRISdqtglL6YDxjTAn7P44os3+H7rrbdOL7zwQvrwww+z7++8887Uo0ePBs8PQOsiNAHQIsw000xpuummy6a8TUqEmK+++ir7CLPPPnuD+zt06JBmmWWWn6wpmhydO3du8P0000wzWdP8os31VafhxWhTjJzdf//9aauttircHgBaDqEJgBYjNlOIUaL6mznUd+utt6aVV1657vvPPvuswf3jxo3LpvlFcKqaeORqckaPpkSEqA033DALS7EmKn7e5ptvPlV/JgBTl9AEQIux5557ppEjR6aBAwf+5L4ISFdeeWXq2bNntmtduO+++xo8Jr6PkBRrksL000+fhg8f/pNtzcuIkafJFRtGvPXWW+maa65Jq666aurevXupnwlAy2AjCABajNhkoW/fvlloevvtt7PrMsWo0X//+99sC/AYgYr7FlpoobTlllum8847L9vGu3fv3mnw4MHZ9t9xTafYvCHE1uGDBg3Kdtlbe+21s7VGd911V6m2zTjjjNmmDs8//3yDjR8aE6Et1jHF2qvYWQ+A1k1oAqBF+f3vf59dNymuwXTqqadm65fmmmuu7DpM+++/f/Z1iIvgzj///On2229Pl112WbZz3q677prtglcdFYpNGd57771sM4abb745C1cRtHbcccfC7YqfHddb2meffdLf/va3n318tPfLL7/MtkQHoHVrVyl6MQsAIFf8aY2d/GKN1jHHHNPczQFgChlpAoAm8s0336Srr746vfrqq+n9999Pu+yyS3M3CYAmIDQBQBOJbctjGuAPP/yQTS2cd955m7tJADQB0/MAAABy2HIcAAAgh9AEAACQQ2gCAADIITQBAADkEJoAAAByCE0AAAA5hCYAAIAcQhMAAEAOoQkAACBN2v8DXW28pR6Q0MgAAAAASUVORK5CYII=", |
| 515 | "text/plain": [ |
| 516 | "<Figure size 1000x600 with 1 Axes>" |
| 517 | ] |
| 518 | }, |
| 519 | "metadata": {}, |
| 520 | "output_type": "display_data" |
| 521 | } |
| 522 | ], |
| 523 | "source": [ |
| 524 | "# Plot bar chart\n", |
| 525 | "plt.figure(figsize=(10, 6))\n", |
| 526 | "sns.barplot(data=country_counts, x=\"Country\", y=\"RecordCount\", palette=\"viridis\")\n", |
| 527 | "plt.title(\"Record Count by Country\")\n", |
| 528 | "plt.xticks(rotation=45)\n", |
| 529 | "plt.show()" |
| 530 | ] |
| 531 | }, |
| 532 | { |
| 533 | "cell_type": "markdown", |
| 534 | "id": "887b2525", |
| 535 | "metadata": {}, |
| 536 | "source": [ |
| 537 | "## π Pivot Table Example" |
| 538 | ] |
| 539 | }, |
| 540 | { |
| 541 | "cell_type": "code", |
| 542 | "execution_count": 26, |
| 543 | "id": "1e26e06b", |
| 544 | "metadata": {}, |
| 545 | "outputs": [ |
| 546 | { |
| 547 | "data": { |
| 548 | "text/html": [ |
| 549 | "<div>\n", |
| 550 | "<style scoped>\n", |
| 551 | " .dataframe tbody tr th:only-of-type {\n", |
| 552 | " vertical-align: middle;\n", |
| 553 | " }\n", |
| 554 | "\n", |
| 555 | " .dataframe tbody tr th {\n", |
| 556 | " vertical-align: top;\n", |
| 557 | " }\n", |
| 558 | "\n", |
| 559 | " .dataframe thead th {\n", |
| 560 | " text-align: right;\n", |
| 561 | " }\n", |
| 562 | "</style>\n", |
| 563 | "<table border=\"1\" class=\"dataframe\">\n", |
| 564 | " <thead>\n", |
| 565 | " <tr style=\"text-align: right;\">\n", |
| 566 | " <th></th>\n", |
| 567 | " <th>Age</th>\n", |
| 568 | " </tr>\n", |
| 569 | " <tr>\n", |
| 570 | " <th>Country</th>\n", |
| 571 | " <th></th>\n", |
| 572 | " </tr>\n", |
| 573 | " </thead>\n", |
| 574 | " <tbody>\n", |
| 575 | " <tr>\n", |
| 576 | " <th>Country_0</th>\n", |
| 577 | " <td>43.7</td>\n", |
| 578 | " </tr>\n", |
| 579 | " <tr>\n", |
| 580 | " <th>Country_1</th>\n", |
| 581 | " <td>43.8</td>\n", |
| 582 | " </tr>\n", |
| 583 | " <tr>\n", |
| 584 | " <th>Country_2</th>\n", |
| 585 | " <td>51.0</td>\n", |
| 586 | " </tr>\n", |
| 587 | " <tr>\n", |
| 588 | " <th>Country_3</th>\n", |
| 589 | " <td>38.2</td>\n", |
| 590 | " </tr>\n", |
| 591 | " <tr>\n", |
| 592 | " <th>Country_4</th>\n", |
| 593 | " <td>44.3</td>\n", |
| 594 | " </tr>\n", |
| 595 | " <tr>\n", |
| 596 | " <th>Country_5</th>\n", |
| 597 | " <td>48.3</td>\n", |
| 598 | " </tr>\n", |
| 599 | " <tr>\n", |
| 600 | " <th>Country_6</th>\n", |
| 601 | " <td>47.3</td>\n", |
| 602 | " </tr>\n", |
| 603 | " <tr>\n", |
| 604 | " <th>Country_7</th>\n", |
| 605 | " <td>41.1</td>\n", |
| 606 | " </tr>\n", |
| 607 | " <tr>\n", |
| 608 | " <th>Country_8</th>\n", |
| 609 | " <td>40.5</td>\n", |
| 610 | " </tr>\n", |
| 611 | " <tr>\n", |
| 612 | " <th>Country_9</th>\n", |
| 613 | " <td>47.1</td>\n", |
| 614 | " </tr>\n", |
| 615 | " </tbody>\n", |
| 616 | "</table>\n", |
| 617 | "</div>" |
| 618 | ], |
| 619 | "text/plain": [ |
| 620 | " Age\n", |
| 621 | "Country \n", |
| 622 | "Country_0 43.7\n", |
| 623 | "Country_1 43.8\n", |
| 624 | "Country_2 51.0\n", |
| 625 | "Country_3 38.2\n", |
| 626 | "Country_4 44.3\n", |
| 627 | "Country_5 48.3\n", |
| 628 | "Country_6 47.3\n", |
| 629 | "Country_7 41.1\n", |
| 630 | "Country_8 40.5\n", |
| 631 | "Country_9 47.1" |
| 632 | ] |
| 633 | }, |
| 634 | "metadata": {}, |
| 635 | "output_type": "display_data" |
| 636 | } |
| 637 | ], |
| 638 | "source": [ |
| 639 | "# If 'Age' exists, average age by country (example only if dataset has relevant column)\n", |
| 640 | "if \"Age\" in df.columns:\n", |
| 641 | " age_pivot = df.pivot_table(index=\"Country\", values=\"Age\", aggfunc=\"mean\")\n", |
| 642 | " display(age_pivot)\n", |
| 643 | "else:\n", |
| 644 | " print(\"No 'Age' column in dataset to pivot on.\")" |
| 645 | ] |
| 646 | }, |
| 647 | { |
| 648 | "cell_type": "markdown", |
| 649 | "id": "d9793c4e", |
| 650 | "metadata": {}, |
| 651 | "source": [ |
| 652 | "\n", |
| 653 | "## π Summary\n", |
| 654 | "\n", |
| 655 | "In this notebook, we:\n", |
| 656 | "- Loaded a sample CSV dataset\n", |
| 657 | "- Explored its structure\n", |
| 658 | "- Grouped and counted records by country\n", |
| 659 | "- Visualized results with a bar chart\n", |
| 660 | "- Created a pivot table (if applicable)\n", |
| 661 | "\n", |
| 662 | "π₯οΈ Try modifying this notebook for your own datasets or audit use cases!\n", |
| 663 | " " |
| 664 | ] |
| 665 | } |
| 666 | ], |
| 667 | "metadata": { |
| 668 | "kernelspec": { |
| 669 | "display_name": "Python 3", |
| 670 | "language": "python", |
| 671 | "name": "python3" |
| 672 | }, |
| 673 | "language_info": { |
| 674 | "codemirror_mode": { |
| 675 | "name": "ipython", |
| 676 | "version": 3 |
| 677 | }, |
| 678 | "file_extension": ".py", |
| 679 | "mimetype": "text/x-python", |
| 680 | "name": "python", |
| 681 | "nbconvert_exporter": "python", |
| 682 | "pygments_lexer": "ipython3", |
| 683 | "version": "3.9.6" |
| 684 | } |
| 685 | }, |
| 686 | "nbformat": 4, |
| 687 | "nbformat_minor": 5 |
| 688 | } |