pythoncharmers-meta 0.7.16__tar.gz → 0.8.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.
@@ -0,0 +1,320 @@
1
+ Metadata-Version: 2.5
2
+ Name: pythoncharmers-meta
3
+ Version: 0.8.0
4
+ Summary: Meta package with dependencies for Python Charmers training courses
5
+ License-File: LICENSE
6
+ Requires-Python: >=3.10
7
+ Requires-Dist: black>=26.5.1
8
+ Requires-Dist: diskcache>=5.6.3
9
+ Requires-Dist: humanize>=4.16.0
10
+ Requires-Dist: hvplot>=0.12.2
11
+ Requires-Dist: ipython>=8.39.0
12
+ Requires-Dist: ipywidgets>=8.1.9
13
+ Requires-Dist: isort>=9.0.1
14
+ Requires-Dist: keyring>=25.7.0
15
+ Requires-Dist: keyrings-cryptfile>=1.3.9
16
+ Requires-Dist: llm>=0.32.1
17
+ Requires-Dist: loguru>=0.7.2
18
+ Requires-Dist: logzero>=1.7.0
19
+ Requires-Dist: lxml>=6.1.3
20
+ Requires-Dist: matplotlib>=3.10.9
21
+ Requires-Dist: more-itertools>=11.1.0
22
+ Requires-Dist: mypy>=2.3.1
23
+ Requires-Dist: natural>=0.2.0
24
+ Requires-Dist: nbformat>=5.11.1
25
+ Requires-Dist: numba>=0.62.1
26
+ Requires-Dist: numexpr>=2.14.1
27
+ Requires-Dist: numpy>=2.2.0
28
+ Requires-Dist: openpyxl>=3.1.5
29
+ Requires-Dist: pandas[aws,compression,computation,excel,feather,fss,hdf5,html,output-formatting,parquet,performance,plot,xml]>=2.3.3
30
+ Requires-Dist: parse>=1.22.2
31
+ Requires-Dist: plotly!=6.0.*,>=7.1.0
32
+ Requires-Dist: polars[excel,graph,numpy,plot,pyarrow,pydantic,style,timezone]>=1.44.2
33
+ Requires-Dist: psutil>=7.2.2
34
+ Requires-Dist: pydantic>=2.13.5
35
+ Requires-Dist: pytest>=9.1.1
36
+ Requires-Dist: requests>=2.34.2
37
+ Requires-Dist: rich>=15.0.0
38
+ Requires-Dist: ruff>=0.16.9
39
+ Requires-Dist: schedule>=1.2.2
40
+ Requires-Dist: streamlit>=1.56.0
41
+ Requires-Dist: toolz>=1.1.0
42
+ Requires-Dist: tqdm>=4.70.1
43
+ Requires-Dist: ty>=0.0.84
44
+ Requires-Dist: typer>=0.27.2
45
+ Requires-Dist: zstandard>=0.25.0
46
+ Provides-Extra: analytics
47
+ Requires-Dist: altair>=6.2.2; extra == 'analytics'
48
+ Requires-Dist: bokeh>=3.9.2; extra == 'analytics'
49
+ Requires-Dist: bottleneck>=1.6.0; extra == 'analytics'
50
+ Requires-Dist: connectorx>=0.4.6; extra == 'analytics'
51
+ Requires-Dist: darts[notorch]>=0.46.0; extra == 'analytics'
52
+ Requires-Dist: dask>=2026.8.0; extra == 'analytics'
53
+ Requires-Dist: distributed>=2026.8.0; extra == 'analytics'
54
+ Requires-Dist: duckdb>=1.5.5; extra == 'analytics'
55
+ Requires-Dist: fastexcel>=0.21.0; extra == 'analytics'
56
+ Requires-Dist: formulaic>=1.2.2; extra == 'analytics'
57
+ Requires-Dist: glum>=3.4.1; extra == 'analytics'
58
+ Requires-Dist: graphviz>=0.21; extra == 'analytics'
59
+ Requires-Dist: holoviews>=1.23.2; extra == 'analytics'
60
+ Requires-Dist: hvplot>=0.12.2; extra == 'analytics'
61
+ Requires-Dist: ibis-framework[duckdb,polars,sqlite]>=12.0.0; extra == 'analytics'
62
+ Requires-Dist: matplotlib>=3.10.9; extra == 'analytics'
63
+ Requires-Dist: networkx>=3.3; extra == 'analytics'
64
+ Requires-Dist: numba>=0.62.1; extra == 'analytics'
65
+ Requires-Dist: pandas[aws,compression,computation,excel,feather,fss,hdf5,html,output-formatting,parquet,performance,plot,spss,xml]>=2.3.3; extra == 'analytics'
66
+ Requires-Dist: pandera[mypy,pandas,polars]>=0.33.1; extra == 'analytics'
67
+ Requires-Dist: pyod>=3.6.6; extra == 'analytics'
68
+ Requires-Dist: scikit-learn>=1.7.2; extra == 'analytics'
69
+ Requires-Dist: scipy>=1.15.3; extra == 'analytics'
70
+ Requires-Dist: seaborn>=0.13.2; extra == 'analytics'
71
+ Requires-Dist: statsmodels>=0.15.0; extra == 'analytics'
72
+ Requires-Dist: streamlit>=1.56.0; extra == 'analytics'
73
+ Requires-Dist: tables>=3.10.1; extra == 'analytics'
74
+ Requires-Dist: textblob>=0.20.1; extra == 'analytics'
75
+ Requires-Dist: textdistance[levenshtein]>=4.6.3; extra == 'analytics'
76
+ Provides-Extra: bio
77
+ Requires-Dist: anndata>=0.11.4; extra == 'bio'
78
+ Requires-Dist: biopython>=1.88; extra == 'bio'
79
+ Requires-Dist: igraph>=1.0.0; extra == 'bio'
80
+ Requires-Dist: leidenalg>=0.12.0; extra == 'bio'
81
+ Requires-Dist: paramiko>=5.0.0; extra == 'bio'
82
+ Requires-Dist: pooch>=1.9.0; extra == 'bio'
83
+ Requires-Dist: scanpy>=1.11.5; extra == 'bio'
84
+ Requires-Dist: scikit-image>=0.25.2; extra == 'bio'
85
+ Requires-Dist: scikit-misc>=0.5.2; extra == 'bio'
86
+ Requires-Dist: tqdm>=4.70.1; extra == 'bio'
87
+ Provides-Extra: db
88
+ Requires-Dist: duckdb>=1.5.5; extra == 'db'
89
+ Requires-Dist: ibis-framework[duckdb,polars,sqlite]>=12.0.0; extra == 'db'
90
+ Requires-Dist: pandas[sql-other]>=2.3.3; extra == 'db'
91
+ Requires-Dist: polars[database]>=1.44.2; extra == 'db'
92
+ Requires-Dist: pyodbc>=5.3.0; extra == 'db'
93
+ Requires-Dist: redis>=8.1.0; extra == 'db'
94
+ Requires-Dist: sqlalchemy>=2.0.54; extra == 'db'
95
+ Provides-Extra: dl
96
+ Requires-Dist: albumentations>=2.0.8; extra == 'dl'
97
+ Requires-Dist: darts[torch]>=0.46.0; extra == 'dl'
98
+ Requires-Dist: dataset>=2.0.0; extra == 'dl'
99
+ Requires-Dist: datasets>=5.0.1; extra == 'dl'
100
+ Requires-Dist: diskcache>=5.6.3; extra == 'dl'
101
+ Requires-Dist: eli5>=0.15.0; extra == 'dl'
102
+ Requires-Dist: evaluate>=0.4.6; extra == 'dl'
103
+ Requires-Dist: joblib>=1.6.0; extra == 'dl'
104
+ Requires-Dist: lightning>=2.6.6; extra == 'dl'
105
+ Requires-Dist: prophet>=1.4.0; extra == 'dl'
106
+ Requires-Dist: pyod>=3.6.6; extra == 'dl'
107
+ Requires-Dist: scikit-learn>=1.7.2; extra == 'dl'
108
+ Requires-Dist: skorch>=1.4.0; extra == 'dl'
109
+ Requires-Dist: skrub>=0.10.1; extra == 'dl'
110
+ Requires-Dist: tensorboard>=2.21.0; extra == 'dl'
111
+ Requires-Dist: textdistance[levenshtein]>=4.6.3; extra == 'dl'
112
+ Requires-Dist: torch>=2.2.2; extra == 'dl'
113
+ Requires-Dist: torchaudio>=2.2.2; extra == 'dl'
114
+ Requires-Dist: torchvision>=0.17.2; extra == 'dl'
115
+ Requires-Dist: transformers[torch]>=5.0.0; extra == 'dl'
116
+ Requires-Dist: xgboost>=3.2.0; extra == 'dl'
117
+ Requires-Dist: yellowbrick2>=2.0.2; extra == 'dl'
118
+ Provides-Extra: docs
119
+ Requires-Dist: black>=26.5.1; extra == 'docs'
120
+ Requires-Dist: jupyter; extra == 'docs'
121
+ Requires-Dist: jupyter-cache; extra == 'docs'
122
+ Requires-Dist: kaleido>=1.4.0; extra == 'docs'
123
+ Requires-Dist: nbclient>=0.11.0; extra == 'docs'
124
+ Provides-Extra: gis
125
+ Requires-Dist: cartopy>=0.25.0; extra == 'gis'
126
+ Requires-Dist: cftime>=1.6.5; extra == 'gis'
127
+ Requires-Dist: contextily>=1.7.1; extra == 'gis'
128
+ Requires-Dist: dask-image>=2026.5.0; extra == 'gis'
129
+ Requires-Dist: datashader>=0.19.1; extra == 'gis'
130
+ Requires-Dist: descartes>=1.1.0; extra == 'gis'
131
+ Requires-Dist: fiona>=1.10.0; extra == 'gis'
132
+ Requires-Dist: folium>=0.20.0; extra == 'gis'
133
+ Requires-Dist: geoalchemy>=0.7.2; extra == 'gis'
134
+ Requires-Dist: geopandas>=1.1.4; extra == 'gis'
135
+ Requires-Dist: geopy>=2.5.0; extra == 'gis'
136
+ Requires-Dist: graphviz>=0.21; extra == 'gis'
137
+ Requires-Dist: h5netcdf>=1.8.1; extra == 'gis'
138
+ Requires-Dist: iris>=1.0.7; extra == 'gis'
139
+ Requires-Dist: netcdf4>=1.7.3; extra == 'gis'
140
+ Requires-Dist: networkx>=3.3; extra == 'gis'
141
+ Requires-Dist: pint>=0.24.3; extra == 'gis'
142
+ Requires-Dist: psycopg2-binary>=2.9.13; extra == 'gis'
143
+ Requires-Dist: pydantic-geojson>=0.3.2; extra == 'gis'
144
+ Requires-Dist: pydap>=3.5.9; extra == 'gis'
145
+ Requires-Dist: pyproj>=3.7.1; extra == 'gis'
146
+ Requires-Dist: pysal>=25.1; extra == 'gis'
147
+ Requires-Dist: rasterio>=1.4.4; extra == 'gis'
148
+ Requires-Dist: rioxarray>=0.19.0; extra == 'gis'
149
+ Requires-Dist: scikit-image>=0.25.2; extra == 'gis'
150
+ Requires-Dist: scipy>=1.15.3; extra == 'gis'
151
+ Requires-Dist: shapely>=2.1.2; extra == 'gis'
152
+ Requires-Dist: xarray>=2025.6.1; extra == 'gis'
153
+ Requires-Dist: zarr>=2.18.3; extra == 'gis'
154
+ Provides-Extra: ml
155
+ Requires-Dist: eli5>=0.15.0; extra == 'ml'
156
+ Requires-Dist: formulaic>=1.2.2; extra == 'ml'
157
+ Requires-Dist: glum>=3.4.1; extra == 'ml'
158
+ Requires-Dist: joblib>=1.6.0; extra == 'ml'
159
+ Requires-Dist: pyod>=3.6.6; extra == 'ml'
160
+ Requires-Dist: readability>=0.3.2; extra == 'ml'
161
+ Requires-Dist: scikit-learn>=1.7.2; extra == 'ml'
162
+ Requires-Dist: seaborn>=0.13.2; extra == 'ml'
163
+ Requires-Dist: skorch>=1.4.0; extra == 'ml'
164
+ Requires-Dist: skrub>=0.10.1; extra == 'ml'
165
+ Requires-Dist: textdistance[levenshtein]>=4.6.3; extra == 'ml'
166
+ Requires-Dist: xgboost>=3.2.0; extra == 'ml'
167
+ Requires-Dist: yellowbrick2>=2.0.2; extra == 'ml'
168
+ Provides-Extra: net
169
+ Requires-Dist: aiobotocore>=3.9.1; extra == 'net'
170
+ Requires-Dist: aiofile>=3.9.0; extra == 'net'
171
+ Requires-Dist: aiofiles>=25.1.0; extra == 'net'
172
+ Requires-Dist: aiometer>=1.0.0; extra == 'net'
173
+ Requires-Dist: aiopath>=0.6.11; extra == 'net'
174
+ Requires-Dist: anyio>=3.7.1; extra == 'net'
175
+ Requires-Dist: boto3>=1.43.75; extra == 'net'
176
+ Requires-Dist: botocore>=1.43.75; extra == 'net'
177
+ Requires-Dist: celery>=5.6.3; extra == 'net'
178
+ Requires-Dist: cryptography>=50.0.1; extra == 'net'
179
+ Requires-Dist: dask>=2026.8.0; extra == 'net'
180
+ Requires-Dist: distributed>=2026.8.0; extra == 'net'
181
+ Requires-Dist: fastapi>=0.141.1; extra == 'net'
182
+ Requires-Dist: ftputil>=5.2.0; extra == 'net'
183
+ Requires-Dist: httpx>=0.27.2; extra == 'net'
184
+ Requires-Dist: locust>=2.46.0; extra == 'net'
185
+ Requires-Dist: networkx>=3.3; extra == 'net'
186
+ Requires-Dist: pandas[aws,fss]>=2.3.3; extra == 'net'
187
+ Requires-Dist: passlib>=1.7.4; extra == 'net'
188
+ Requires-Dist: pathos>=0.3.5; extra == 'net'
189
+ Requires-Dist: polars[async,fsspec]>=1.44.2; extra == 'net'
190
+ Requires-Dist: psutil>=7.2.2; extra == 'net'
191
+ Requires-Dist: pyshark>=0.6; extra == 'net'
192
+ Requires-Dist: pytest-repeat>=0.9.4; extra == 'net'
193
+ Requires-Dist: pyzmq>=27.2.0; extra == 'net'
194
+ Requires-Dist: redis>=8.1.0; extra == 'net'
195
+ Requires-Dist: s3fs>=2026.6.0; extra == 'net'
196
+ Requires-Dist: textfsm>=2.1.0; extra == 'net'
197
+ Requires-Dist: unsync>=1.4.0; extra == 'net'
198
+ Requires-Dist: uvicorn>=0.54.0; extra == 'net'
199
+ Provides-Extra: scieng
200
+ Requires-Dist: altair>=6.2.2; extra == 'scieng'
201
+ Requires-Dist: bokeh>=3.9.2; extra == 'scieng'
202
+ Requires-Dist: bottleneck>=1.6.0; extra == 'scieng'
203
+ Requires-Dist: connectorx>=0.4.6; extra == 'scieng'
204
+ Requires-Dist: dask-image>=2026.5.0; extra == 'scieng'
205
+ Requires-Dist: dask>=2026.8.0; extra == 'scieng'
206
+ Requires-Dist: distributed>=2026.8.0; extra == 'scieng'
207
+ Requires-Dist: duckdb>=1.5.5; extra == 'scieng'
208
+ Requires-Dist: fastexcel>=0.21.0; extra == 'scieng'
209
+ Requires-Dist: formulaic>=1.2.2; extra == 'scieng'
210
+ Requires-Dist: glum>=3.4.1; extra == 'scieng'
211
+ Requires-Dist: graphviz>=0.21; extra == 'scieng'
212
+ Requires-Dist: h5py>=3.16.0; extra == 'scieng'
213
+ Requires-Dist: holoviews>=1.23.2; extra == 'scieng'
214
+ Requires-Dist: hvplot>=0.12.2; extra == 'scieng'
215
+ Requires-Dist: matplotlib>=3.10.9; extra == 'scieng'
216
+ Requires-Dist: networkx>=3.3; extra == 'scieng'
217
+ Requires-Dist: numba>=0.62.1; extra == 'scieng'
218
+ Requires-Dist: pandas[aws,compression,computation,excel,feather,fss,hdf5,html,output-formatting,parquet,performance,plot,spss,xml]>=2.3.3; extra == 'scieng'
219
+ Requires-Dist: pint>=0.24.3; extra == 'scieng'
220
+ Requires-Dist: pooch>=1.9.0; extra == 'scieng'
221
+ Requires-Dist: pyod>=3.6.6; extra == 'scieng'
222
+ Requires-Dist: scikit-image>=0.25.2; extra == 'scieng'
223
+ Requires-Dist: scipy>=1.15.3; extra == 'scieng'
224
+ Requires-Dist: seaborn>=0.13.2; extra == 'scieng'
225
+ Requires-Dist: statsmodels>=0.15.0; extra == 'scieng'
226
+ Requires-Dist: streamlit>=1.56.0; extra == 'scieng'
227
+ Requires-Dist: sympy>=1.14.0; extra == 'scieng'
228
+ Requires-Dist: tables>=3.10.1; extra == 'scieng'
229
+ Requires-Dist: zarr>=2.18.3; extra == 'scieng'
230
+ Provides-Extra: testing
231
+ Requires-Dist: bandit>=1.9.4; extra == 'testing'
232
+ Requires-Dist: black>=26.5.1; extra == 'testing'
233
+ Requires-Dist: dodgy>=0.2.1; extra == 'testing'
234
+ Requires-Dist: flake8-async>=26.8.1; extra == 'testing'
235
+ Requires-Dist: flake8-import-order>=0.19.2; extra == 'testing'
236
+ Requires-Dist: flake8>=7.4.1; extra == 'testing'
237
+ Requires-Dist: gprof2dot>=2025.4.14; extra == 'testing'
238
+ Requires-Dist: hypothesis>=6.168.1; extra == 'testing'
239
+ Requires-Dist: isort>=9.0.1; extra == 'testing'
240
+ Requires-Dist: line-profiler>=5.0.2; extra == 'testing'
241
+ Requires-Dist: memory-profiler>=0.61.0; extra == 'testing'
242
+ Requires-Dist: mkdocs>=1.6.1; extra == 'testing'
243
+ Requires-Dist: py-spy>=0.4.2; extra == 'testing'
244
+ Requires-Dist: pycodestyle>=2.15.0; extra == 'testing'
245
+ Requires-Dist: pyinstrument>=5.1.3; extra == 'testing'
246
+ Requires-Dist: pylint>=4.0.9; extra == 'testing'
247
+ Requires-Dist: pyt>=1.4.0; extra == 'testing'
248
+ Requires-Dist: pytest-cov>=7.1.0; extra == 'testing'
249
+ Requires-Dist: pytest-repeat>=0.9.4; extra == 'testing'
250
+ Requires-Dist: pytest-xdist>=3.8.0; extra == 'testing'
251
+ Requires-Dist: pytest>=9.1.1; extra == 'testing'
252
+ Requires-Dist: scalene>=2.3.0; extra == 'testing'
253
+ Requires-Dist: snakeviz>=2.2.2; extra == 'testing'
254
+ Requires-Dist: sphinx>=8.1.3; extra == 'testing'
255
+ Provides-Extra: web
256
+ Requires-Dist: alembic>=1.20.0; extra == 'web'
257
+ Requires-Dist: beautifulsoup4>=4.15.0; extra == 'web'
258
+ Requires-Dist: cryptography>=50.0.1; extra == 'web'
259
+ Requires-Dist: django>=5.2.17; extra == 'web'
260
+ Requires-Dist: fastapi>=0.141.1; extra == 'web'
261
+ Requires-Dist: flask>=3.1.3; extra == 'web'
262
+ Requires-Dist: httpx>=0.27.2; extra == 'web'
263
+ Requires-Dist: jinja2>=3.1.6; extra == 'web'
264
+ Requires-Dist: passlib>=1.7.4; extra == 'web'
265
+ Requires-Dist: scrapy>=2.19.0; extra == 'web'
266
+ Description-Content-Type: text/markdown
267
+
268
+ # Python Charmers meta-package
269
+
270
+ This is a meta-package for [Python Charmers](https://pythoncharmers.com)
271
+ training participants. This depends on many packages used in Python Charmers
272
+ training courses.
273
+
274
+ This package is intended to be used from a Python Charmers Hub in the cloud
275
+ like https://cpuhub.pythoncharmers.com.
276
+
277
+ ## Installation
278
+
279
+ Install it like this:
280
+
281
+ ```
282
+ pip install pythoncharmers-meta
283
+ ```
284
+
285
+ or, if you have [uv](https://docs.astral.sh/uv/), this will be much faster:
286
+
287
+ ```
288
+ uv pip install pythoncharmers-meta
289
+ ```
290
+
291
+ ## Optional packages (extras)
292
+
293
+ The following sets of optional packages ("extras") are available:
294
+
295
+ - `analytics`: data analytics
296
+ - `db`: packages for interfacing with various databases
297
+ - `gis`: geospatial analysis
298
+ - `ml`: "classical" machine learning
299
+ - `dl`: deep learning (a strict superset of [ml])
300
+ - `net`: network engineering, concurrency
301
+ - `scieng`: scientific and engineering computing
302
+ - `testing`: testing, linting, doc generation
303
+ - `web`: web dev
304
+
305
+ This extra helps with building course notes:
306
+
307
+ - `docs`
308
+
309
+ You can add them like this:
310
+
311
+ ```
312
+ uv pip install "pythoncharmers-meta[gis, ml]" --reinstall
313
+ ```
314
+
315
+ ## Cutting a new release
316
+
317
+ ```
318
+ uv build
319
+ uvx twine upload dist/*
320
+ ```
@@ -0,0 +1,299 @@
1
+ [project]
2
+ name = "pythoncharmers-meta"
3
+ version = "0.8.0"
4
+ description = "Meta package with dependencies for Python Charmers training courses"
5
+ readme = "README.md"
6
+ requires-python = ">=3.10"
7
+ dependencies = [
8
+ "black>=26.5.1",
9
+ "diskcache>=5.6.3",
10
+ "humanize>=4.16.0",
11
+ "hvplot>=0.12.2",
12
+ "ipython>=8.39.0",
13
+ "ipywidgets>=8.1.9",
14
+ "isort>=9.0.1",
15
+ "keyring>=25.7.0",
16
+ "keyrings-cryptfile>=1.3.9",
17
+ "llm>=0.32.1",
18
+ "loguru>=0.7.2",
19
+ "logzero>=1.7.0",
20
+ "lxml>=6.1.3",
21
+ "matplotlib>=3.10.9",
22
+ "more-itertools>=11.1.0",
23
+ "mypy>=2.3.1",
24
+ "natural>=0.2.0",
25
+ "nbformat>=5.11.1",
26
+ "numba>=0.62.1",
27
+ "numexpr>=2.14.1",
28
+ # "numpy<2.3.0",
29
+ "numpy>=2.2.0",
30
+ "openpyxl>=3.1.5",
31
+ "pandas[aws,compression,computation,excel,feather,fss,hdf5,html,output-formatting,parquet,performance,plot,xml]>=2.3.3",
32
+ "parse>=1.22.2",
33
+ "plotly>=7.1.0,!=6.0.*",
34
+ "polars[excel,graph,numpy,plot,pyarrow,pydantic,style,timezone]>=1.44.2",
35
+ "psutil>=7.2.2",
36
+ "pydantic>=2.13.5",
37
+ "pytest>=9.1.1",
38
+ "requests>=2.34.2",
39
+ "rich>=15.0.0",
40
+ "ruff>=0.16.9",
41
+ "schedule>=1.2.2",
42
+ # "sqlalchemy>=2.0.35",
43
+ "streamlit>=1.56.0",
44
+ "toolz>=1.1.0",
45
+ "tqdm>=4.70.1",
46
+ "ty>=0.0.84",
47
+ "typer>=0.27.2",
48
+ "zstandard>=0.25.0"
49
+ ]
50
+
51
+ [project.optional-dependencies]
52
+ gis = [
53
+ "cartopy>=0.25.0",
54
+ "cftime>=1.6.5",
55
+ "contextily>=1.7.1",
56
+ "dask-image>=2026.5.0",
57
+ "datashader>=0.19.1",
58
+ "descartes>=1.1.0",
59
+ "fiona>=1.10.0",
60
+ "folium>=0.20.0",
61
+ "geoalchemy>=0.7.2",
62
+ "geopandas>=1.1.4",
63
+ "geopy>=2.5.0",
64
+ "graphviz>=0.21",
65
+ "h5netcdf>=1.8.1",
66
+ "iris>=1.0.7",
67
+ "netcdf4>=1.7.3",
68
+ "networkx>=3.3",
69
+ "pint>=0.24.3",
70
+ "psycopg2-binary>=2.9.13",
71
+ "pydantic-geojson>=0.3.2",
72
+ "pydap>=3.5.9",
73
+ "pyproj>=3.7.1",
74
+ "pysal>=25.1",
75
+ "rasterio>=1.4.4",
76
+ "rioxarray>=0.19.0",
77
+ "scikit-image>=0.25.2",
78
+ "scipy>=1.15.3",
79
+ "shapely>=2.1.2",
80
+ "xarray>=2025.6.1",
81
+ "zarr>=2.18.3",
82
+ ]
83
+ ml = [
84
+ "eli5>=0.15.0",
85
+ "formulaic>=1.2.2",
86
+ "glum>=3.4.1",
87
+ "joblib>=1.6.0",
88
+ "pyod>=3.6.6",
89
+ "readability>=0.3.2",
90
+ "scikit-learn>=1.7.2",
91
+ "seaborn>=0.13.2",
92
+ "skorch>=1.4.0",
93
+ "skrub>=0.10.1",
94
+ "textdistance[Levenshtein]>=4.6.3",
95
+ "xgboost>=3.2.0",
96
+ "yellowbrick2 >=2.0.2"
97
+ ]
98
+ web = [
99
+ "alembic>=1.20.0",
100
+ "beautifulsoup4>=4.15.0",
101
+ "cryptography>=50.0.1",
102
+ "django>=5.2.17",
103
+ "fastapi>=0.141.1",
104
+ "flask>=3.1.3",
105
+ "httpx>=0.27.2",
106
+ "jinja2>=3.1.6",
107
+ "passlib>=1.7.4",
108
+ "scrapy>=2.19.0",
109
+ # "sqlalchemy>=2.0.35",
110
+ ]
111
+ analytics = [
112
+ "altair>=6.2.2",
113
+ "bokeh>=3.9.2",
114
+ "bottleneck>=1.6.0",
115
+ "connectorx>=0.4.6",
116
+ "darts[notorch]>=0.46.0",
117
+ "dask>=2026.8.0",
118
+ "distributed>=2026.8.0",
119
+ "duckdb>=1.5.5",
120
+ "fastexcel>=0.21.0",
121
+ "formulaic>=1.2.2",
122
+ "glum>=3.4.1",
123
+ "graphviz>=0.21",
124
+ "holoviews>=1.23.2",
125
+ "hvplot>=0.12.2",
126
+ "ibis-framework[duckdb,polars,sqlite]>=12.0.0",
127
+ "matplotlib>=3.10.9",
128
+ "networkx>=3.3",
129
+ "numba>=0.62.1",
130
+ "pandas[aws,compression,computation,excel,feather,fss,hdf5,html,output-formatting,parquet,performance,plot,spss,xml]>=2.3.3",
131
+ "pandera[mypy,pandas,polars]>=0.33.1",
132
+ "pyod>=3.6.6",
133
+ "scikit-learn>=1.7.2",
134
+ "scipy>=1.15.3",
135
+ "seaborn>=0.13.2",
136
+ "statsmodels>=0.15.0",
137
+ "streamlit>=1.56.0",
138
+ "tables>=3.10.1",
139
+ "textblob>=0.20.1",
140
+ "textdistance[Levenshtein]>=4.6.3",
141
+ # "sqlalchemy[asyncio]>=2.0.35",
142
+ ]
143
+ scieng = [
144
+ "altair>=6.2.2",
145
+ "bokeh>=3.9.2",
146
+ "bottleneck>=1.6.0",
147
+ "connectorx>=0.4.6",
148
+ "dask-image>=2026.5.0",
149
+ "dask>=2026.8.0",
150
+ "distributed>=2026.8.0",
151
+ "duckdb>=1.5.5",
152
+ "fastexcel>=0.21.0",
153
+ "formulaic>=1.2.2",
154
+ "glum>=3.4.1",
155
+ "graphviz>=0.21",
156
+ "h5py>=3.16.0",
157
+ "holoviews>=1.23.2",
158
+ "hvplot>=0.12.2",
159
+ "matplotlib>=3.10.9",
160
+ "networkx>=3.3",
161
+ "numba>=0.62.1",
162
+ "pandas[aws,compression,computation,excel,feather,fss,hdf5,html,output-formatting,parquet,performance,plot,spss,xml]>=2.3.3",
163
+ "pint>=0.24.3",
164
+ "pooch>=1.9.0",
165
+ "pyod>=3.6.6",
166
+ "scikit-image>=0.25.2",
167
+ "scipy>=1.15.3",
168
+ "seaborn>=0.13.2",
169
+ "statsmodels>=0.15.0",
170
+ "streamlit>=1.56.0",
171
+ "sympy>=1.14.0",
172
+ "tables>=3.10.1",
173
+ "zarr>=2.18.3",
174
+ ]
175
+ net = [
176
+ "aiobotocore>=3.9.1",
177
+ "aiofile>=3.9.0",
178
+ "aiofiles>=25.1.0",
179
+ "aiometer>=1.0.0",
180
+ "aiopath>=0.6.11",
181
+ "anyio>=3.7.1",
182
+ "boto3>=1.43.75",
183
+ "botocore>=1.43.75",
184
+ "celery>=5.6.3",
185
+ "cryptography>=50.0.1",
186
+ "dask>=2026.8.0",
187
+ "distributed>=2026.8.0",
188
+ "fastapi>=0.141.1",
189
+ "ftputil>=5.2.0",
190
+ "httpx>=0.27.2",
191
+ "locust>=2.46.0",
192
+ "networkx>=3.3",
193
+ "pandas[aws,fss]>=2.3.3",
194
+ "passlib>=1.7.4",
195
+ "pathos>=0.3.5",
196
+ "polars[async,fsspec]>=1.44.2",
197
+ "psutil>=7.2.2",
198
+ "pyshark>=0.6",
199
+ "pytest-repeat>=0.9.4",
200
+ "pyzmq>=27.2.0",
201
+ "redis>=8.1.0",
202
+ "s3fs>=2026.6.0",
203
+ "textfsm>=2.1.0",
204
+ "unsync>=1.4.0",
205
+ "uvicorn>=0.54.0",
206
+ ]
207
+ dl = [
208
+ "albumentations>=2.0.8",
209
+ "darts[torch]>=0.46.0",
210
+ "dataset>=2.0.0",
211
+ "datasets>=5.0.1",
212
+ "diskcache>=5.6.3",
213
+ "eli5>=0.15.0",
214
+ "evaluate>=0.4.6",
215
+ "joblib>=1.6.0",
216
+ "lightning>=2.6.6",
217
+ "prophet>=1.4.0",
218
+ "pyod>=3.6.6",
219
+ "scikit-learn>=1.7.2",
220
+ "skorch>=1.4.0",
221
+ "skrub>=0.10.1",
222
+ "tensorboard>=2.21.0",
223
+ "textdistance[Levenshtein]>=4.6.3",
224
+ "torch>=2.2.2",
225
+ "torchaudio>=2.2.2",
226
+ "torchvision>=0.17.2",
227
+ "transformers[torch]>=5.0.0",
228
+ "xgboost>=3.2.0",
229
+ "yellowbrick2 >=2.0.2"
230
+ ]
231
+ testing = [
232
+ "bandit>=1.9.4",
233
+ "black>=26.5.1",
234
+ "dodgy>=0.2.1",
235
+ "flake8-async>=26.8.1",
236
+ "flake8-import-order>=0.19.2",
237
+ "flake8>=7.4.1",
238
+ "gprof2dot>=2025.4.14",
239
+ "hypothesis>=6.168.1",
240
+ "isort>=9.0.1",
241
+ "line-profiler>=5.0.2",
242
+ "memory-profiler>=0.61.0",
243
+ "mkdocs>=1.6.1",
244
+ "py-spy>=0.4.2",
245
+ "pycodestyle>=2.15.0",
246
+ "pyinstrument>=5.1.3",
247
+ "pylint>=4.0.9",
248
+ "pyt>=1.4.0",
249
+ "pytest-cov>=7.1.0",
250
+ "pytest-repeat>=0.9.4",
251
+ "pytest-xdist>=3.8.0",
252
+ "pytest>=9.1.1",
253
+ "scalene>=2.3.0",
254
+ "snakeviz>=2.2.2",
255
+ "sphinx>=8.1.3",
256
+ ]
257
+ db = [
258
+ "duckdb>=1.5.5",
259
+ "ibis-framework[duckdb,polars,sqlite]>=12.0.0",
260
+ "pandas[sql-other]>=2.3.3",
261
+ "polars[database]>=1.44.2",
262
+ "pyodbc>=5.3.0",
263
+ "redis>=8.1.0",
264
+ "sqlalchemy>=2.0.54",
265
+ ]
266
+ bio = [
267
+ "anndata>=0.11.4",
268
+ "biopython>=1.88",
269
+ "igraph>=1.0.0",
270
+ "leidenalg>=0.12.0",
271
+ "paramiko>=5.0.0",
272
+ "pooch>=1.9.0",
273
+ "scanpy>=1.11.5",
274
+ "scikit-image>=0.25.2",
275
+ "scikit-misc>=0.5.2",
276
+ "tqdm>=4.70.1",
277
+ ]
278
+ # The 'docs' extra includes support for building course notes using Quarto:
279
+ docs = [
280
+ "nbclient>=0.11.0",
281
+ "jupyter",
282
+ "jupyter-cache",
283
+ "black>=26.5.1",
284
+ "kaleido>=1.4.0"
285
+ ]
286
+
287
+ [build-system]
288
+ requires = ["hatchling"]
289
+ build-backend = "hatchling.build"
290
+
291
+ [tool.uv]
292
+ # Require Intel Mac wheels for Python 3.10–3.12; PyTorch has no Intel Mac
293
+ # wheels for newer Python versions.
294
+ required-environments = [
295
+ "sys_platform == 'darwin' and platform_machine == 'x86_64' and python_version < '3.13'"
296
+ ]
297
+ constraint-dependencies = [
298
+ "configargparse>=1.7.1",
299
+ ]