pytae 3.1.2__tar.gz → 3.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. pytae-3.2.0/.githooks/pre-commit +4 -0
  2. {pytae-3.1.2 → pytae-3.2.0}/CHANGELOG.md +11 -0
  3. {pytae-3.1.2 → pytae-3.2.0}/PKG-INFO +22 -2
  4. {pytae-3.1.2 → pytae-3.2.0}/README.md +12 -0
  5. {pytae-3.1.2 → pytae-3.2.0}/docs/CLI.md +41 -2
  6. {pytae-3.1.2 → pytae-3.2.0}/notebooks/agg_df.ipynb +23 -23
  7. pytae-3.2.0/notebooks/more_plots.ipynb +494 -0
  8. {pytae-3.1.2 → pytae-3.2.0}/notebooks/other_utilities.ipynb +182 -182
  9. {pytae-3.1.2 → pytae-3.2.0}/pyproject.toml +5 -3
  10. pytae-3.2.0/scripts/run_notebooks.py +50 -0
  11. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/cli.py +36 -2
  12. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/other_utilities.py +0 -1
  13. {pytae-3.1.2 → pytae-3.2.0}/tests/test_cli_order.py +66 -0
  14. {pytae-3.1.2 → pytae-3.2.0}/tests/test_import.py +31 -0
  15. pytae-3.1.2/notebooks/more_plots.ipynb +0 -494
  16. {pytae-3.1.2 → pytae-3.2.0}/.github/workflows/ci.yml +0 -0
  17. {pytae-3.1.2 → pytae-3.2.0}/.gitignore +0 -0
  18. {pytae-3.1.2 → pytae-3.2.0}/LICENSE +0 -0
  19. {pytae-3.1.2 → pytae-3.2.0}/docs/LIBRARY.md +0 -0
  20. {pytae-3.1.2 → pytae-3.2.0}/notebooks/plotter.ipynb +0 -0
  21. {pytae-3.1.2 → pytae-3.2.0}/notebooks/qry.ipynb +0 -0
  22. {pytae-3.1.2 → pytae-3.2.0}/notebooks/select.ipynb +0 -0
  23. {pytae-3.1.2 → pytae-3.2.0}/notebooks/shape.ipynb +0 -0
  24. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/__init__.py +0 -0
  25. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/agg_df.py +0 -0
  26. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/anagrams.parquet +0 -0
  27. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/anscombe.parquet +0 -0
  28. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/attention.parquet +0 -0
  29. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/brain_networks.parquet +0 -0
  30. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/car_crashes.parquet +0 -0
  31. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/diamonds.parquet +0 -0
  32. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/dots.parquet +0 -0
  33. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/dowjones.parquet +0 -0
  34. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/exercise.parquet +0 -0
  35. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/flights.parquet +0 -0
  36. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/fmri.parquet +0 -0
  37. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/geyser.parquet +0 -0
  38. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/glue.parquet +0 -0
  39. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/healthexp.parquet +0 -0
  40. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/iris.parquet +0 -0
  41. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/mpg.parquet +0 -0
  42. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/penguins.parquet +0 -0
  43. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/planets.parquet +0 -0
  44. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/seaice.parquet +0 -0
  45. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/taxis.parquet +0 -0
  46. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/tips.parquet +0 -0
  47. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/datasets/titanic.parquet +0 -0
  48. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/plotting.py +0 -0
  49. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/qry.py +0 -0
  50. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/readers.py +0 -0
  51. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/select.py +0 -0
  52. {pytae-3.1.2 → pytae-3.2.0}/src/pytae/shape.py +0 -0
  53. {pytae-3.1.2 → pytae-3.2.0}/tests/conftest.py +0 -0
  54. {pytae-3.1.2 → pytae-3.2.0}/tests/test_agg_df.py +0 -0
  55. {pytae-3.1.2 → pytae-3.2.0}/tests/test_cli_sample_datasets.py +0 -0
  56. {pytae-3.1.2 → pytae-3.2.0}/tests/test_plotter.py +0 -0
  57. {pytae-3.1.2 → pytae-3.2.0}/tests/test_qry.py +0 -0
  58. {pytae-3.1.2 → pytae-3.2.0}/tests/test_readers.py +0 -0
  59. {pytae-3.1.2 → pytae-3.2.0}/tests/test_select.py +0 -0
  60. {pytae-3.1.2 → pytae-3.2.0}/tests/test_shape.py +0 -0
  61. {pytae-3.1.2 → pytae-3.2.0}/tests/test_utilities.py +0 -0
@@ -0,0 +1,4 @@
1
+ #!/bin/sh
2
+ # Run notebooks/*.ipynb before allowing a commit. Enable with:
3
+ # git config core.hooksPath .githooks
4
+ python scripts/run_notebooks.py
@@ -2,6 +2,17 @@
2
2
 
3
3
  All notable changes to this project are documented in this file.
4
4
 
5
+ ## [3.2.0] - 2026-09-13
6
+
7
+ ### Added
8
+ - `-sql` flag: run a real SQL query against the current view at that point in the pipeline, via `duckdb` (optional dependency, install with `pip install pytae[sql]`). The view is queryable as table `df` only — no file-derived alias, since the file is already named on the command line. `table` is a reserved SQL keyword and is deliberately **not** registered as an alias.
9
+ - `pytae[sql]` optional extra (`duckdb>=0.9`), needed for `-sql`.
10
+ - `pytae[plot]` optional extra (`matplotlib`), needed for `Plotter`.
11
+ - `scripts/run_notebooks.py` executes every notebook under `notebooks/` end-to-end and is wired up as a local pre-commit hook (`.githooks/pre-commit`, enable with `git config core.hooksPath .githooks`); deliberately **not** part of the `pytest` suite. `pytae[notebooks]` optional extra (`nbclient`, `nbformat`, `ipykernel`, `scipy`) provides what it needs to run.
12
+
13
+ ### Changed
14
+ - Docs: `-rename` is now cross-linked from the `-sql` section as an alternative to escaping spaced column names, and surfaced in the Contents TOC (`Conversion — -convert / -rename`).
15
+
5
16
  ## [3.1.2]
6
17
 
7
18
  ### Added
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pytae
3
- Version: 3.1.2
4
- Summary: A package to enhance common day to day tasks in the life of a data scientist
3
+ Version: 3.2.0
4
+ Summary: A package to enhance common tasks in data and plotting
5
5
  Project-URL: Homepage, https://github.com/maddytae/pytae
6
6
  Project-URL: Bug Tracker, https://github.com/maddytae/pytae/issues
7
7
  Project-URL: CLI Docs, https://github.com/maddytae/pytae/blob/master/docs/CLI.md
@@ -20,10 +20,18 @@ Requires-Python: >=3.10
20
20
  Requires-Dist: pandas>=2.0
21
21
  Requires-Dist: pyarrow>=15.0.0
22
22
  Provides-Extra: dev
23
+ Requires-Dist: duckdb>=0.9; extra == 'dev'
23
24
  Requires-Dist: matplotlib; extra == 'dev'
24
25
  Requires-Dist: pytest>=8.0.0; extra == 'dev'
26
+ Provides-Extra: notebooks
27
+ Requires-Dist: ipykernel; extra == 'notebooks'
28
+ Requires-Dist: nbclient; extra == 'notebooks'
29
+ Requires-Dist: nbformat; extra == 'notebooks'
30
+ Requires-Dist: scipy; extra == 'notebooks'
25
31
  Provides-Extra: plot
26
32
  Requires-Dist: matplotlib; extra == 'plot'
33
+ Provides-Extra: sql
34
+ Requires-Dist: duckdb>=0.9; extra == 'sql'
27
35
  Description-Content-Type: text/markdown
28
36
 
29
37
  # pytae
@@ -59,10 +67,22 @@ See [docs/LIBRARY.md](https://github.com/maddytae/pytae/blob/master/docs/LIBRARY
59
67
  ```bash
60
68
  pytae data.parquet -head
61
69
  pytae data.parquet -qry "'species': 'Adelie'" -select species,body_mass_g -convert -o subset.csv
70
+ pytae data.parquet -sql "select species, avg(body_mass_g) from df group by species"
62
71
  ```
63
72
 
64
73
  See [docs/CLI.md](https://github.com/maddytae/pytae/blob/master/docs/CLI.md) for the full flag reference.
65
74
 
75
+ ## Development
76
+
77
+ ```bash
78
+ pip install -e ".[dev,notebooks]"
79
+ pytest # unit tests
80
+ git config core.hooksPath .githooks # run notebooks/*.ipynb before each commit
81
+ python scripts/run_notebooks.py # or run the notebook check manually
82
+ ```
83
+
84
+ Notebooks are intentionally not part of the `pytest` suite (they're slower and exercise plotting/IO end-to-end); the pre-commit hook is the enforcement point instead.
85
+
66
86
  ## License
67
87
 
68
88
  MIT — see [LICENSE](https://github.com/maddytae/pytae/blob/master/LICENSE).
@@ -31,10 +31,22 @@ See [docs/LIBRARY.md](https://github.com/maddytae/pytae/blob/master/docs/LIBRARY
31
31
  ```bash
32
32
  pytae data.parquet -head
33
33
  pytae data.parquet -qry "'species': 'Adelie'" -select species,body_mass_g -convert -o subset.csv
34
+ pytae data.parquet -sql "select species, avg(body_mass_g) from df group by species"
34
35
  ```
35
36
 
36
37
  See [docs/CLI.md](https://github.com/maddytae/pytae/blob/master/docs/CLI.md) for the full flag reference.
37
38
 
39
+ ## Development
40
+
41
+ ```bash
42
+ pip install -e ".[dev,notebooks]"
43
+ pytest # unit tests
44
+ git config core.hooksPath .githooks # run notebooks/*.ipynb before each commit
45
+ python scripts/run_notebooks.py # or run the notebook check manually
46
+ ```
47
+
48
+ Notebooks are intentionally not part of the `pytest` suite (they're slower and exercise plotting/IO end-to-end); the pre-commit hook is the enforcement point instead.
49
+
38
50
  ## License
39
51
 
40
52
  MIT — see [LICENSE](https://github.com/maddytae/pytae/blob/master/LICENSE).
@@ -8,6 +8,7 @@ Inspect and convert tabular files (`.parquet`, `.csv`, `.txt`, `.dat`, `.sas7bda
8
8
  - [Sample datasets](#sample-datasets)
9
9
  - [Column selection — `-select`](#select)
10
10
  - [Row filtering — `-qry` / `-query`](#filtering)
11
+ - [SQL — `-sql`](#sql)
11
12
  - [Aggregation (auto group columns) — `-agg_df`](#agg-df)
12
13
  - [Aggregation (explicit group columns) — `-group_by` + `-agg`](#group-by-agg)
13
14
  - [Broadcast — `-group_x`](#group-x)
@@ -18,7 +19,7 @@ Inspect and convert tabular files (`.parquet`, `.csv`, `.txt`, `.dat`, `.sas7bda
18
19
  - [Missing values — `-handle_missing`](#handle-missing)
19
20
  - [Reshape — `-long` / `-wide`](#reshape)
20
21
  - [Cross-tabulation — `-crosstab`](#crosstab)
21
- - [Conversion — `-convert`](#convert)
22
+ - [Conversion — `-convert` / `-rename`](#convert)
22
23
  - [Display extras](#display-extras)
23
24
  - [Pandas defaults vs pytae-specific](#pandas-vs-pytae)
24
25
  - [`-wide` vs `-crosstab`](#wide-vs-crosstab)
@@ -195,9 +196,44 @@ pytae penguins.parquet -qry "'species': 'Adelie'" -select species,body_mass_g -h
195
196
 
196
197
  ---
197
198
 
199
+ <a id="sql"></a>
200
+ ## SQL — `-sql`
201
+
202
+ `-sql` runs a real SQL query against the current view at this point in the pipeline, using [duckdb](https://duckdb.org/) (an optional dependency — install with `pip install pytae[sql]`). The view is queryable as table **`df`, and only `df`** — the file itself is already named on the command line (`pytae penguins.parquet ...`), so there's no separate file-derived alias to remember (and no ambiguity if you later pipe a differently-named file through the same command). `table` is also deliberately not registered: it's a reserved SQL keyword, so `select * from table` fails to parse unless quoted, which defeats the point of a short default name.
203
+
204
+ Unlike `-qry`, this is **standard SQL**, not pytae's dict syntax — column names with spaces need **double** quotes (`"bill length mm"`), not single quotes. Single quotes are string literals in SQL, e.g. `'Adelie'`; using them around a column name either errors or silently compares against a constant string instead of the column.
205
+
206
+ ```bash
207
+ pytae penguins.parquet -sql "select species, body_mass_g from df where body_mass_g > 3500"
208
+ pytae penguins.parquet -sql "select species, avg(body_mass_g) as avg_mass from df group by species"
209
+
210
+ # a column name with a space: double quotes, not single quotes
211
+ pytae data.parquet -sql 'select species from df where "bill length mm" > 40'
212
+
213
+ # chains like any other op — runs on the current view, replaces it
214
+ pytae penguins.parquet -select species,island,body_mass_g -sql "select * from df where island = 'Dream'" -shape
215
+
216
+ # a query that needs BOTH a double-quoted identifier (space in the column name)
217
+ # and a single-quoted string literal — escape the identifier's inner double quotes
218
+ pytae penguins.parquet -select species,island,body_mass_g -sql "select \"col a\" from df where island = 'Dream'" -shape
219
+ ```
220
+
221
+ Mixing a spaced identifier and a string literal in one `-sql` value means the shell has to see both `"` and `'` — one of them needs escaping. Two ways to handle it:
222
+
223
+ - **Escape in place** (above): wrap the whole `-sql` value in double quotes and escape the identifier's quotes (`\"col a\"`); the string literal's single quotes pass through untouched.
224
+ - **Rename the column first, then no quoting needed.** `-rename` only applies at `-convert`/write time (see [Convert / rename](#convert)), not mid-pipeline, so this is a two-step workflow — convert once to a space-free schema, then run `-sql` against that file with plain identifiers:
225
+
226
+ ```bash
227
+ pytae penguins.parquet -convert -rename "col a:col_a" -o clean.parquet
228
+ pytae clean.parquet -sql "select col_a from df where island = 'Dream'"
229
+ ```
230
+
231
+ ---
232
+
198
233
  <a id="agg-df"></a>
199
234
  ## Aggregation (auto group columns) — `-agg_df`
200
235
 
236
+
201
237
  Groups by all **non-numeric** columns and aggregates the rest. `n` is group count.
202
238
 
203
239
  ```python
@@ -428,7 +464,7 @@ pytae penguins.parquet -crosstab "index='species',columns='sex'" -dropna false
428
464
  ---
429
465
 
430
466
  <a id="convert"></a>
431
- ## Conversion — `-convert`
467
+ ## Conversion — `-convert` / `-rename`
432
468
 
433
469
  Output format is the `-o` extension. Omitting `-o` writes `.csv` next to the source. Cannot write `.sas7bdat`.
434
470
 
@@ -451,6 +487,7 @@ pytae data.txt -dlim "|" -convert -o data.csv
451
487
  pytae data.dat -convert -o data.csv # .dat defaults to '|' delimiter
452
488
  pytae 'data/*.parquet' -convert
453
489
  pytae penguins.parquet -convert -rename "old_name:new_name,another:clean"
490
+ pytae penguins.parquet -convert -rename "old name:new_name,another:clean" # spaces in a name are fine — only "," and ":" are delimiters
454
491
  pytae data.csv -encoding latin-1 -convert -o data.parquet
455
492
  ```
456
493
 
@@ -510,6 +547,7 @@ Some flags/keys are thin passthroughs to standard pandas methods and parameter n
510
547
  | Flag / key | pytae convention |
511
548
  |---|---|
512
549
  | `-qry` | dict-based filter syntax (`'col': ('>', 5)`) — pytae's own `qry()`, not a pandas method |
550
+ | `-sql` | real SQL via duckdb (not pandas) — the current view is registered as table `df` only (no file-derived alias) |
513
551
  | `-select`'s `contains=` / `startswith=` / `endswith=` / `regex=` / `dtype=` / `exclude_dtype=` | pytae's own column-picking vocabulary; no equivalent shorthand in plain pandas |
514
552
  | `-agg_df` | auto-detects group columns (every non-numeric column becomes a group key) — pandas' `groupby()` always requires you to name them |
515
553
  | `-group_x` | broadcasts a group aggregate to every row via `group=`/`v=`/`a=` keys — wraps pandas `transform()` as a ready-made verb |
@@ -664,6 +702,7 @@ pytae 'folder/*.parquet' -convert
664
702
  | `-select SPEC` | Restrict columns at this point in the pipeline (union in one spec; repeat to filter remaining) |
665
703
  | `-qry CONDITIONS` | Filter rows at this point (`df.qry()`); surrounding `{}` optional |
666
704
  | `-query EXPR` | Filter rows at this point (`df.query()`) |
705
+ | `-sql QUERY` | Run a SQL query at this point via duckdb; view is table `df` |
667
706
  | `-sort_by COLUMNS [asc\|desc]` | Sort rows (default: ascending) |
668
707
 
669
708
  **Aggregate & reshape**
@@ -23,7 +23,7 @@
23
23
  },
24
24
  {
25
25
  "cell_type": "code",
26
- "execution_count": 35,
26
+ "execution_count": 1,
27
27
  "id": "712c9de3",
28
28
  "metadata": {},
29
29
  "outputs": [],
@@ -49,7 +49,7 @@
49
49
  },
50
50
  {
51
51
  "cell_type": "code",
52
- "execution_count": 36,
52
+ "execution_count": 2,
53
53
  "id": "a96e3eaa",
54
54
  "metadata": {},
55
55
  "outputs": [
@@ -135,7 +135,7 @@
135
135
  "4 Gentoo Biscoe 124 47.504878 5076.016260"
136
136
  ]
137
137
  },
138
- "execution_count": 36,
138
+ "execution_count": 2,
139
139
  "metadata": {},
140
140
  "output_type": "execute_result"
141
141
  }
@@ -150,7 +150,7 @@
150
150
  },
151
151
  {
152
152
  "cell_type": "code",
153
- "execution_count": 37,
153
+ "execution_count": 3,
154
154
  "id": "e49c71f4",
155
155
  "metadata": {},
156
156
  "outputs": [
@@ -235,7 +235,7 @@
235
235
  "2 59.6 624350.0 5076.016260 6300.0 "
236
236
  ]
237
237
  },
238
- "execution_count": 37,
238
+ "execution_count": 3,
239
239
  "metadata": {},
240
240
  "output_type": "execute_result"
241
241
  }
@@ -259,7 +259,7 @@
259
259
  },
260
260
  {
261
261
  "cell_type": "code",
262
- "execution_count": 38,
262
+ "execution_count": 4,
263
263
  "id": "8cf7855a",
264
264
  "metadata": {},
265
265
  "outputs": [
@@ -358,7 +358,7 @@
358
358
  "4 124 "
359
359
  ]
360
360
  },
361
- "execution_count": 38,
361
+ "execution_count": 4,
362
362
  "metadata": {},
363
363
  "output_type": "execute_result"
364
364
  }
@@ -374,7 +374,7 @@
374
374
  },
375
375
  {
376
376
  "cell_type": "code",
377
- "execution_count": 39,
377
+ "execution_count": 5,
378
378
  "id": "e601735d",
379
379
  "metadata": {},
380
380
  "outputs": [
@@ -456,7 +456,7 @@
456
456
  "3 No Dinner 106 20.095660 3.126887 9.0"
457
457
  ]
458
458
  },
459
- "execution_count": 39,
459
+ "execution_count": 5,
460
460
  "metadata": {},
461
461
  "output_type": "execute_result"
462
462
  }
@@ -473,7 +473,7 @@
473
473
  },
474
474
  {
475
475
  "cell_type": "code",
476
- "execution_count": 40,
476
+ "execution_count": 6,
477
477
  "id": "72a605ef",
478
478
  "metadata": {},
479
479
  "outputs": [
@@ -553,7 +553,7 @@
553
553
  "4 Gentoo Biscoe 124 624350.0"
554
554
  ]
555
555
  },
556
- "execution_count": 40,
556
+ "execution_count": 6,
557
557
  "metadata": {},
558
558
  "output_type": "execute_result"
559
559
  }
@@ -569,7 +569,7 @@
569
569
  },
570
570
  {
571
571
  "cell_type": "code",
572
- "execution_count": 41,
572
+ "execution_count": 7,
573
573
  "id": "39967327",
574
574
  "metadata": {},
575
575
  "outputs": [
@@ -655,7 +655,7 @@
655
655
  "4 Gentoo Biscoe 124 124 5076.016260"
656
656
  ]
657
657
  },
658
- "execution_count": 41,
658
+ "execution_count": 7,
659
659
  "metadata": {},
660
660
  "output_type": "execute_result"
661
661
  }
@@ -670,7 +670,7 @@
670
670
  },
671
671
  {
672
672
  "cell_type": "code",
673
- "execution_count": 42,
673
+ "execution_count": 8,
674
674
  "id": "3e3c4f7f",
675
675
  "metadata": {},
676
676
  "outputs": [
@@ -775,7 +775,7 @@
775
775
  "4 5000.0 5076.016260 "
776
776
  ]
777
777
  },
778
- "execution_count": 42,
778
+ "execution_count": 8,
779
779
  "metadata": {},
780
780
  "output_type": "execute_result"
781
781
  }
@@ -798,7 +798,7 @@
798
798
  },
799
799
  {
800
800
  "cell_type": "code",
801
- "execution_count": 43,
801
+ "execution_count": 9,
802
802
  "id": "d4035d91",
803
803
  "metadata": {},
804
804
  "outputs": [
@@ -911,7 +911,7 @@
911
911
  "7 Gentoo NaN 5 45.625000 4587.500000"
912
912
  ]
913
913
  },
914
- "execution_count": 43,
914
+ "execution_count": 9,
915
915
  "metadata": {},
916
916
  "output_type": "execute_result"
917
917
  }
@@ -926,7 +926,7 @@
926
926
  },
927
927
  {
928
928
  "cell_type": "code",
929
- "execution_count": 44,
929
+ "execution_count": 10,
930
930
  "id": "f136b83f",
931
931
  "metadata": {},
932
932
  "outputs": [
@@ -1021,7 +1021,7 @@
1021
1021
  "5 Gentoo Male 61 49.473770 5484.836066"
1022
1022
  ]
1023
1023
  },
1024
- "execution_count": 44,
1024
+ "execution_count": 10,
1025
1025
  "metadata": {},
1026
1026
  "output_type": "execute_result"
1027
1027
  }
@@ -1044,7 +1044,7 @@
1044
1044
  },
1045
1045
  {
1046
1046
  "cell_type": "code",
1047
- "execution_count": 45,
1047
+ "execution_count": 11,
1048
1048
  "id": "1c35b544",
1049
1049
  "metadata": {},
1050
1050
  "outputs": [
@@ -1164,7 +1164,7 @@
1164
1164
  "9 Gentoo Biscoe Male 61"
1165
1165
  ]
1166
1166
  },
1167
- "execution_count": 45,
1167
+ "execution_count": 11,
1168
1168
  "metadata": {},
1169
1169
  "output_type": "execute_result"
1170
1170
  }
@@ -1180,7 +1180,7 @@
1180
1180
  ],
1181
1181
  "metadata": {
1182
1182
  "kernelspec": {
1183
- "display_name": "Python 3",
1183
+ "display_name": "py_env (3.14.0.final.0)",
1184
1184
  "language": "python",
1185
1185
  "name": "python3"
1186
1186
  },
@@ -1194,7 +1194,7 @@
1194
1194
  "name": "python",
1195
1195
  "nbconvert_exporter": "python",
1196
1196
  "pygments_lexer": "ipython3",
1197
- "version": "3.9.6"
1197
+ "version": "3.14.0"
1198
1198
  }
1199
1199
  },
1200
1200
  "nbformat": 4,