diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml
index 18b7d1889e585..aa644a848bcf0 100644
--- a/.github/workflows/unit-tests.yml
+++ b/.github/workflows/unit-tests.yml
@@ -243,7 +243,7 @@ jobs:
. ~/virtualenvs/pandas-dev/bin/activate
python -m pip install --no-cache-dir -U pip wheel setuptools meson[ninja]==1.2.1 meson-python==0.13.1
python -m pip install numpy -Csetup-args="-Dallow-noblas=true"
- python -m pip install --no-cache-dir versioneer[toml] cython==3.0.10 python-dateutil pytest>=7.3.2 pytest-xdist>=3.4.0 hypothesis>=6.84.0
+ python -m pip install --no-cache-dir versioneer[toml] cython==3.0.10 python-dateutil pytest>=7.3.2 pytest-xdist>=3.4.0 hypothesis>=6.116.0
python -m pip install --no-cache-dir --no-build-isolation -e . -Csetup-args="--werror"
python -m pip list --no-cache-dir
PANDAS_CI=1 python -m pytest -m 'not slow and not network and not clipboard and not single_cpu' pandas --junitxml=test-data.xml
@@ -280,7 +280,7 @@ jobs:
/opt/python/cp313-cp313/bin/python -m venv ~/virtualenvs/pandas-dev
. ~/virtualenvs/pandas-dev/bin/activate
python -m pip install --no-cache-dir -U pip wheel setuptools meson-python==0.13.1 meson[ninja]==1.2.1
- python -m pip install --no-cache-dir versioneer[toml] cython numpy python-dateutil pytest>=7.3.2 pytest-xdist>=3.4.0 hypothesis>=6.84.0
+ python -m pip install --no-cache-dir versioneer[toml] cython numpy python-dateutil pytest>=7.3.2 pytest-xdist>=3.4.0 hypothesis>=6.116.0
python -m pip install --no-cache-dir --no-build-isolation -e . -Csetup-args="--werror"
python -m pip list --no-cache-dir
@@ -352,7 +352,7 @@ jobs:
python --version
python -m pip install --upgrade pip setuptools wheel meson[ninja]==1.2.1 meson-python==0.13.1
python -m pip install --pre --extra-index-url https://pypi.anaconda.org/scientific-python-nightly-wheels/simple numpy
- python -m pip install versioneer[toml] python-dateutil tzdata cython hypothesis>=6.84.0 pytest>=7.3.2 pytest-xdist>=3.4.0 pytest-cov
+ python -m pip install versioneer[toml] python-dateutil tzdata cython hypothesis>=6.116.0 pytest>=7.3.2 pytest-xdist>=3.4.0 pytest-cov
python -m pip install -ve . --no-build-isolation --no-index --no-deps -Csetup-args="--werror"
python -m pip list
diff --git a/ci/deps/actions-311-minimum_versions.yaml b/ci/deps/actions-311-minimum_versions.yaml
index 3ff7601f0c6b3..da760bceb49ca 100644
--- a/ci/deps/actions-311-minimum_versions.yaml
+++ b/ci/deps/actions-311-minimum_versions.yaml
@@ -28,38 +28,38 @@ dependencies:
- adbc-driver-postgresql=1.2.0
- adbc-driver-sqlite=1.2.0
- beautifulsoup4=4.12.3
- - bottleneck=1.3.6
- - fastparquet=2024.2.0
- - fsspec=2023.12.2
+ - bottleneck=1.4.2
+ - fastparquet=2024.11.0
+ - fsspec=2024.10.0
- html5lib=1.1
- - hypothesis=6.84.0
- - gcsfs=2023.12.2
- - jinja2=3.1.3
- - lxml=4.9.2
- - matplotlib=3.8.3
- - numba=0.59.0
- - numexpr=2.9.0
+ - hypothesis=6.116.0
+ - gcsfs=2024.10.0
+ - jinja2=3.1.5
+ - lxml=5.3.0
+ - matplotlib=3.9.3
+ - numba=0.60.0
+ - numexpr=2.10.2
- odfpy=1.4.1
- - qtpy=2.3.0
- - openpyxl=3.1.2
- - psycopg2=2.9.9
- - pyarrow=12.0.1
- - pyiceberg=0.7.1
- - pymysql=1.1.0
+ - qtpy=2.4.2
+ - openpyxl=3.1.5
+ - psycopg2=2.9.10
+ - pyarrow=13.0.0
+ - pyiceberg=0.8.1
+ - pymysql=1.1.1
- pyqt=5.15.9
- - pyreadstat=1.2.6
- - pytables=3.8.0
- - python-calamine=0.1.7
- - pytz=2023.4
+ - pyreadstat=1.2.8
+ - pytables=3.10.1
+ - python-calamine=0.3.0
+ - pytz=2024.2
- pyxlsb=1.0.10
- - s3fs=2023.12.2
- - scipy=1.12.0
- - sqlalchemy=2.0.0
+ - s3fs=2024.10.0
+ - scipy=1.14.1
+ - sqlalchemy=2.0.36
- tabulate=0.9.0
- - xarray=2024.1.1
+ - xarray=2024.10.0
- xlrd=2.0.1
- xlsxwriter=3.2.0
- - zstandard=0.22.0
+ - zstandard=0.23.0
- pip:
- tzdata==2023.3
diff --git a/ci/deps/actions-311.yaml b/ci/deps/actions-311.yaml
index f1a16bfc97656..9e6601854a86b 100644
--- a/ci/deps/actions-311.yaml
+++ b/ci/deps/actions-311.yaml
@@ -26,38 +26,38 @@ dependencies:
- adbc-driver-postgresql>=1.2.0
- adbc-driver-sqlite>=1.2.0
- beautifulsoup4>=4.12.3
- - bottleneck>=1.3.6
- - fastparquet>=2024.2.0
- - fsspec>=2023.12.2
+ - bottleneck>=1.4.2
+ - fastparquet>=2024.11.0
+ - fsspec>=2024.10.0
- html5lib>=1.1
- - hypothesis>=6.84.0
- - gcsfs>=2023.12.2
- - jinja2>=3.1.3
- - lxml>=4.9.2
- - matplotlib>=3.8.3
- - numba>=0.59.0
- - numexpr>=2.9.0
+ - hypothesis>=6.116.0
+ - gcsfs>=2024.10.0
+ - jinja2>=3.1.5
+ - lxml>=5.3.0
+ - matplotlib>=3.9.3
+ - numba>=0.60.0
+ - numexpr>=2.10.2
- odfpy>=1.4.1
- - qtpy>=2.3.0
+ - qtpy>=2.4.2
- pyqt>=5.15.9
- - openpyxl>=3.1.2
- - psycopg2>=2.9.9
- - pyarrow>=12.0.1
- - pyiceberg>=0.7.1
- - pymysql>=1.1.0
- - pyreadstat>=1.2.6
- - pytables>=3.8.0
- - python-calamine>=0.1.7
- - pytz>=2023.4
+ - openpyxl>=3.1.5
+ - psycopg2>=2.9.10
+ - pyarrow>=13.0.0
+ - pyiceberg>=0.8.1
+ - pymysql>=1.1.1
+ - pyreadstat>=1.2.8
+ - pytables>=3.10.1
+ - python-calamine>=0.3.0
+ - pytz>=2024.2
- pyxlsb>=1.0.10
- - s3fs>=2023.12.2
- - scipy>=1.12.0
- - sqlalchemy>=2.0.0
+ - s3fs>=2024.10.0
+ - scipy>=1.14.1
+ - sqlalchemy>=2.0.36
- tabulate>=0.9.0
- - xarray>=2024.1.1
+ - xarray>=2024.10.0
- xlrd>=2.0.1
- xlsxwriter>=3.2.0
- - zstandard>=0.22.0
+ - zstandard>=0.23.0
- pip:
- tzdata>=2023.3
diff --git a/ci/deps/actions-312.yaml b/ci/deps/actions-312.yaml
index 3222f372182ac..03e3b5d451477 100644
--- a/ci/deps/actions-312.yaml
+++ b/ci/deps/actions-312.yaml
@@ -26,38 +26,38 @@ dependencies:
- adbc-driver-postgresql>=1.2.0
- adbc-driver-sqlite>=1.2.0
- beautifulsoup4>=4.12.3
- - bottleneck>=1.3.6
- - fastparquet>=2024.2.0
- - fsspec>=2023.12.2
+ - bottleneck>=1.4.2
+ - fastparquet>=2024.11.0
+ - fsspec>=2024.10.0
- html5lib>=1.1
- - hypothesis>=6.84.0
- - gcsfs>=2023.12.2
- - jinja2>=3.1.3
- - lxml>=4.9.2
- - matplotlib>=3.8.3
- - numba>=0.59.0
- - numexpr>=2.9.0
+ - hypothesis>=6.116.0
+ - gcsfs>=2024.10.0
+ - jinja2>=3.1.5
+ - lxml>=5.3.0
+ - matplotlib>=3.9.3
+ - numba>=0.60.0
+ - numexpr>=2.10.2
- odfpy>=1.4.1
- - qtpy>=2.3.0
+ - qtpy>=2.4.2
- pyqt>=5.15.9
- - openpyxl>=3.1.2
- - psycopg2>=2.9.9
- - pyarrow>=12.0.1
- - pyiceberg>=0.7.1
- - pymysql>=1.1.0
- - pyreadstat>=1.2.6
- - pytables>=3.8.0
- - python-calamine>=0.1.7
- - pytz>=2023.4
+ - openpyxl>=3.1.5
+ - psycopg2>=2.9.10
+ - pyarrow>=13.0.0
+ - pyiceberg>=0.8.1
+ - pymysql>=1.1.1
+ - pyreadstat>=1.2.8
+ - pytables>=3.10.1
+ - python-calamine>=0.3.0
+ - pytz>=2024.2
- pyxlsb>=1.0.10
- - s3fs>=2023.12.2
- - scipy>=1.12.0
- - sqlalchemy>=2.0.0
+ - s3fs>=2024.10.0
+ - scipy>=1.14.1
+ - sqlalchemy>=2.0.36
- tabulate>=0.9.0
- - xarray>=2024.1.1
+ - xarray>=2024.10.0
- xlrd>=2.0.1
- xlsxwriter>=3.2.0
- - zstandard>=0.22.0
+ - zstandard>=0.23.0
- pip:
- tzdata>=2023.3
diff --git a/ci/deps/actions-313-downstream_compat.yaml b/ci/deps/actions-313-downstream_compat.yaml
index 663d98020b942..335ae1b121174 100644
--- a/ci/deps/actions-313-downstream_compat.yaml
+++ b/ci/deps/actions-313-downstream_compat.yaml
@@ -26,38 +26,38 @@ dependencies:
# optional dependencies
- adbc-driver-postgresql>=1.2.0
- beautifulsoup4>=4.12.3
- - bottleneck>=1.3.6
- - fastparquet>=2024.2.0
- - fsspec>=2023.12.2
+ - bottleneck>=1.4.2
+ - fastparquet>=2024.11.0
+ - fsspec>=2024.10.0
- html5lib>=1.1
- - hypothesis>=6.84.0
- - gcsfs>=2023.12.2
- - jinja2>=3.1.3
- - lxml>=4.9.2
- - matplotlib>=3.8.3
- - numba>=0.59.0
- - numexpr>=2.9.0
+ - hypothesis>=6.116.0
+ - gcsfs>=2024.10.0
+ - jinja2>=3.1.5
+ - lxml>=5.3.0
+ - matplotlib>=3.9.3
+ - numba>=0.60.0
+ - numexpr>=2.10.2
- odfpy>=1.4.1
- - qtpy>=2.3.0
- - openpyxl>=3.1.2
- - psycopg2>=2.9.9
- - pyarrow>=12.0.1
- - pyiceberg>=0.7.1
- - pymysql>=1.1.0
+ - qtpy>=2.4.2
+ - openpyxl>=3.1.5
+ - psycopg2>=2.9.10
+ - pyarrow>=13.0.0
+ - pyiceberg>=0.8.1
+ - pymysql>=1.1.1
- pyqt>=5.15.9
- - pyreadstat>=1.2.6
- - pytables>=3.8.0
- - python-calamine>=0.1.7
- - pytz>=2023.4
+ - pyreadstat>=1.2.8
+ - pytables>=3.10.1
+ - python-calamine>=0.3.0
+ - pytz>=2024.2
- pyxlsb>=1.0.10
- - s3fs>=2023.12.2
- - scipy>=1.12.0
- - sqlalchemy>=2.0.0
+ - s3fs>=2024.10.0
+ - scipy>=1.14.1
+ - sqlalchemy>=2.0.36
- tabulate>=0.9.0
- - xarray>=2024.1.1
+ - xarray>=2024.10.0
- xlrd>=2.0.1
- xlsxwriter>=3.2.0
- - zstandard>=0.22.0
+ - zstandard>=0.23.0
# downstream packages
- botocore
diff --git a/ci/deps/actions-313-freethreading.yaml b/ci/deps/actions-313-freethreading.yaml
index e118080bc4c40..0f4c198061049 100644
--- a/ci/deps/actions-313-freethreading.yaml
+++ b/ci/deps/actions-313-freethreading.yaml
@@ -20,7 +20,7 @@ dependencies:
- numpy
# optional dependencies
- - hypothesis>=6.84.0
+ - hypothesis>=6.116.0
- pip:
# No free-threaded coveragepy (with the C-extension) on conda-forge yet
diff --git a/ci/deps/actions-313-numpydev.yaml b/ci/deps/actions-313-numpydev.yaml
index a1474d70c9487..d16cae7f50fcd 100644
--- a/ci/deps/actions-313-numpydev.yaml
+++ b/ci/deps/actions-313-numpydev.yaml
@@ -14,7 +14,7 @@ dependencies:
- pytest>=7.3.2
- pytest-cov
- pytest-xdist>=3.4.0
- - hypothesis>=6.84.0
+ - hypothesis>=6.116.0
# pandas dependencies
- python-dateutil
diff --git a/ci/deps/actions-313-pyarrownightly.yaml b/ci/deps/actions-313-pyarrownightly.yaml
index e56813cffb901..911146004d492 100644
--- a/ci/deps/actions-313-pyarrownightly.yaml
+++ b/ci/deps/actions-313-pyarrownightly.yaml
@@ -14,7 +14,7 @@ dependencies:
- pytest>=7.3.2
- pytest-cov
- pytest-xdist>=3.4.0
- - hypothesis>=6.84.0
+ - hypothesis>=6.116.0
# required dependencies
- python-dateutil
diff --git a/ci/deps/actions-313.yaml b/ci/deps/actions-313.yaml
index 050d71cbfe45e..12deb4ed9b783 100644
--- a/ci/deps/actions-313.yaml
+++ b/ci/deps/actions-313.yaml
@@ -27,37 +27,37 @@ dependencies:
- adbc-driver-sqlite>=1.2.0
- beautifulsoup4>=4.12.3
- blosc>=1.21.3
- - bottleneck>=1.3.6
- - fastparquet>=2024.2.0
- - fsspec>=2023.12.2
+ - bottleneck>=1.4.2
+ - fastparquet>=2024.11.0
+ - fsspec>=2024.10.0
- html5lib>=1.1
- - hypothesis>=6.84.0
- - gcsfs>=2023.12.2
- - jinja2>=3.1.3
- - lxml>=4.9.2
- - matplotlib>=3.8.3
- - numba>=0.59.0
- - numexpr>=2.9.0
+ - hypothesis>=6.116.0
+ - gcsfs>=2024.10.0
+ - jinja2>=3.1.5
+ - lxml>=5.3.0
+ - matplotlib>=3.9.3
+ - numba>=0.60.0
+ - numexpr>=2.10.2
- odfpy>=1.4.1
- - qtpy>=2.3.0
+ - qtpy>=2.4.2
- pyqt>=5.15.9
- - openpyxl>=3.1.2
- - psycopg2>=2.9.9
- - pyarrow>=12.0.1
- - pymysql>=1.1.0
- - pyreadstat>=1.2.6
- - pytables>=3.8.0
- - python-calamine>=0.1.7
- - pytz>=2023.4
+ - openpyxl>=3.1.5
+ - psycopg2>=2.9.10
+ - pyarrow>=13.0.0
+ - pymysql>=1.1.1
+ - pyreadstat>=1.2.8
+ - pytables>=3.10.1
+ - python-calamine>=0.3.0
+ - pytz>=2024.2
- pyxlsb>=1.0.10
- - s3fs>=2023.12.2
- - scipy>=1.12.0
- - sqlalchemy>=2.0.0
+ - s3fs>=2024.10.0
+ - scipy>=1.14.1
+ - sqlalchemy>=2.0.36
- tabulate>=0.9.0
- - xarray>=2024.1.1
+ - xarray>=2024.10.0
- xlrd>=2.0.1
- xlsxwriter>=3.2.0
- - zstandard>=0.22.0
+ - zstandard>=0.23.0
- pip:
- tzdata>=2023.3
diff --git a/ci/meta.yaml b/ci/meta.yaml
index da6b2b08e26ac..d7508a44f223d 100644
--- a/ci/meta.yaml
+++ b/ci/meta.yaml
@@ -64,7 +64,7 @@ test:
- pytest >=7.3.2
- pytest-xdist >=3.4.0
- pytest-cov
- - hypothesis >=6.84.0
+ - hypothesis >=6.116.0
about:
home: http://pandas.pydata.org
diff --git a/doc/source/getting_started/install.rst b/doc/source/getting_started/install.rst
index 0002ed869eb31..074d443dc235b 100644
--- a/doc/source/getting_started/install.rst
+++ b/doc/source/getting_started/install.rst
@@ -153,6 +153,8 @@ Package Minimum support
`tzdata `__ 2023.3
================================================================ ==========================
+Generally, the minimum supported version is ~2 years old from the release date of a major or minor pandas version.
+
.. _install.optional_dependencies:
Optional dependencies
@@ -168,6 +170,9 @@ With pip, optional pandas dependencies can be installed or managed in a file (e.
as optional extras (e.g. ``pandas[performance, aws]``). All optional dependencies can be installed with ``pandas[all]``,
and specific sets of dependencies are listed in the sections below.
+Generally, the minimum supported version is ~1 years old from the release date of a major or minor pandas version.
+Older versions of optional dependencies may still work, but they are not tested or considered supported.
+
.. _install.recommended_dependencies:
Performance dependencies (recommended)
@@ -183,9 +188,9 @@ Installable with ``pip install "pandas[performance]"``
===================================================== ================== ================== ===================================================================================================================================================================================
Dependency Minimum Version pip extra Notes
===================================================== ================== ================== ===================================================================================================================================================================================
-`numexpr `__ 2.9.0 performance Accelerates certain numerical operations by using multiple cores as well as smart chunking and caching to achieve large speedups
-`bottleneck `__ 1.3.6 performance Accelerates certain types of ``nan`` by using specialized cython routines to achieve large speedup.
-`numba `__ 0.59.0 performance Alternative execution engine for operations that accept ``engine="numba"`` using a JIT compiler that translates Python functions to optimized machine code using the LLVM compiler.
+`numexpr `__ 2.10.2 performance Accelerates certain numerical operations by using multiple cores as well as smart chunking and caching to achieve large speedups
+`bottleneck `__ 1.4.2 performance Accelerates certain types of ``nan`` by using specialized cython routines to achieve large speedup.
+`numba `__ 0.60.0 performance Alternative execution engine for operations that accept ``engine="numba"`` using a JIT compiler that translates Python functions to optimized machine code using the LLVM compiler.
===================================================== ================== ================== ===================================================================================================================================================================================
Visualization
@@ -209,8 +214,8 @@ Installable with ``pip install "pandas[computation]"``.
============================================== ================== =============== =======================================
Dependency Minimum Version pip extra Notes
============================================== ================== =============== =======================================
-`SciPy `__ 1.12.0 computation Miscellaneous statistical functions
-`xarray `__ 2024.1.1 computation pandas-like API for N-dimensional data
+`SciPy `__ 1.14.1 computation Miscellaneous statistical functions
+`xarray `__ 2024.10.0 computation pandas-like API for N-dimensional data
============================================== ================== =============== =======================================
.. _install.excel_dependencies:
@@ -225,9 +230,9 @@ Dependency Minimum Versi
================================================================== ================== =============== =============================================================
`xlrd `__ 2.0.1 excel Reading for xls files
`xlsxwriter `__ 3.2.0 excel Writing for xlsx files
-`openpyxl `__ 3.1.2 excel Reading / writing for Excel 2010 xlsx/xlsm/xltx/xltm files
+`openpyxl `__ 3.1.5 excel Reading / writing for Excel 2010 xlsx/xlsm/xltx/xltm files
`pyxlsb `__ 1.0.10 excel Reading for xlsb files
-`python-calamine `__ 0.1.7 excel Reading for xls/xlsx/xlsm/xlsb/xla/xlam/ods files
+`python-calamine `__ 0.3.0 excel Reading for xls/xlsx/xlsm/xlsb/xla/xlam/ods files
`odfpy `__ 1.4.1 excel Reading / writing for OpenDocument 1.2 files
================================================================== ================== =============== =============================================================
@@ -276,7 +281,7 @@ Installable with ``pip install "pandas[xml]"``.
======================================== ================== =============== ====================================================
Dependency Minimum Version pip extra Notes
======================================== ================== =============== ====================================================
-`lxml `__ 4.9.2 xml XML parser for read_xml and tree builder for to_xml
+`lxml `__ 5.3.0 xml XML parser for read_xml and tree builder for to_xml
======================================== ================== =============== ====================================================
SQL databases
@@ -287,11 +292,11 @@ Traditional drivers are installable with ``pip install "pandas[postgresql, mysql
================================================================== ================== =============== ============================================
Dependency Minimum Version pip extra Notes
================================================================== ================== =============== ============================================
-`SQLAlchemy `__ 2.0.0 postgresql, SQL support for databases other than sqlite
+`SQLAlchemy `__ 2.0.36 postgresql, SQL support for databases other than sqlite
mysql,
sql-other
-`psycopg2 `__ 2.9.9 postgresql PostgreSQL engine for sqlalchemy
-`pymysql `__ 1.1.0 mysql MySQL engine for sqlalchemy
+`psycopg2 `__ 2.9.10 postgresql PostgreSQL engine for sqlalchemy
+`pymysql `__ 1.1.1 mysql MySQL engine for sqlalchemy
`adbc-driver-postgresql `__ 1.2.0 postgresql ADBC Driver for PostgreSQL
`adbc-driver-sqlite `__ 1.2.0 sql-other ADBC Driver for SQLite
================================================================== ================== =============== ============================================
@@ -304,12 +309,12 @@ Installable with ``pip install "pandas[hdf5, parquet, iceberg, feather, spss, ex
====================================================== ================== ================ ==========================================================
Dependency Minimum Version pip extra Notes
====================================================== ================== ================ ==========================================================
-`PyTables `__ 3.8.0 hdf5 HDF5-based reading / writing
+`PyTables `__ 3.10.1 hdf5 HDF5-based reading / writing
`zlib `__ hdf5 Compression for HDF5
-`fastparquet `__ 2024.2.0 - Parquet reading / writing (pyarrow is default)
-`pyarrow `__ 12.0.1 parquet, feather Parquet, ORC, and feather reading / writing
-`PyIceberg `__ 0.7.1 iceberg Apache Iceberg reading / writing
-`pyreadstat `__ 1.2.6 spss SPSS files (.sav) reading
+`fastparquet `__ 2024.11.0 - Parquet reading / writing (pyarrow is default)
+`pyarrow `__ 13.0.0 parquet, feather Parquet, ORC, and feather reading / writing
+`PyIceberg `__ 0.8.1 iceberg Apache Iceberg reading / writing
+`pyreadstat `__ 1.2.8 spss SPSS files (.sav) reading
`odfpy `__ 1.4.1 excel Open document format (.odf, .ods, .odt) reading / writing
====================================================== ================== ================ ==========================================================
@@ -329,10 +334,10 @@ Installable with ``pip install "pandas[fss, aws, gcp]"``
============================================ ================== =============== ==========================================================
Dependency Minimum Version pip extra Notes
============================================ ================== =============== ==========================================================
-`fsspec `__ 2023.12.2 fss, gcp, aws Handling files aside from simple local and HTTP (required
+`fsspec `__ 2024.10.0 fss, gcp, aws Handling files aside from simple local and HTTP (required
dependency of s3fs, gcsfs).
-`gcsfs `__ 2023.12.2 gcp Google Cloud Storage access
-`s3fs `__ 2023.12.2 aws Amazon S3 access
+`gcsfs `__ 2024.10.0 gcp Google Cloud Storage access
+`s3fs `__ 2024.10.0 aws Amazon S3 access
============================================ ================== =============== ==========================================================
Clipboard
@@ -344,7 +349,7 @@ Installable with ``pip install "pandas[clipboard]"``.
Dependency Minimum Version pip extra Notes
======================================================================================== ================== =============== ==============
`PyQt4 `__/`PyQt5 `__ 5.15.9 clipboard Clipboard I/O
-`qtpy `__ 2.3.0 clipboard Clipboard I/O
+`qtpy `__ 2.4.2 clipboard Clipboard I/O
======================================================================================== ================== =============== ==============
.. note::
@@ -372,5 +377,5 @@ Installable with ``pip install "pandas[timezone]"``
========================================== ================== =================== ==============================================
Dependency Minimum Version pip extra Notes
========================================== ================== =================== ==============================================
-`pytz `__ 2023.4 timezone Alternative timezone library to ``zoneinfo``.
+`pytz `__ 2024.2 timezone Alternative timezone library to ``zoneinfo``.
========================================== ================== =================== ==============================================
diff --git a/doc/source/user_guide/io.rst b/doc/source/user_guide/io.rst
index 52038ad4b66c1..019bd9cff3ab6 100644
--- a/doc/source/user_guide/io.rst
+++ b/doc/source/user_guide/io.rst
@@ -5526,7 +5526,6 @@ ORC format, :func:`~pandas.read_orc` and :func:`~pandas.DataFrame.to_orc`. This
.. warning::
* It is *highly recommended* to install pyarrow using conda due to some issues occurred by pyarrow.
- * :func:`~pandas.DataFrame.to_orc` requires pyarrow>=7.0.0.
* :func:`~pandas.read_orc` and :func:`~pandas.DataFrame.to_orc` are not supported on Windows yet, you can find valid environments on :ref:`install optional dependencies `.
* For supported dtypes please refer to `supported ORC features in Arrow `__.
* Currently timezones in datetime columns are not preserved when a dataframe is converted into ORC files.
diff --git a/doc/source/whatsnew/v3.0.0.rst b/doc/source/whatsnew/v3.0.0.rst
index 7ec50137c3039..35c01bb29f8f9 100644
--- a/doc/source/whatsnew/v3.0.0.rst
+++ b/doc/source/whatsnew/v3.0.0.rst
@@ -490,12 +490,6 @@ Optional libraries below the lowest tested version may still work, but are not c
+------------------------+---------------------+
| Package | New Minimum Version |
+========================+=====================+
-| pyarrow | 12.0.1 |
-+------------------------+---------------------+
-| pytz | 2023.4 |
-+------------------------+---------------------+
-| fastparquet | 2024.2.0 |
-+------------------------+---------------------+
| adbc-driver-postgresql | 1.2.0 |
+------------------------+---------------------+
| adbc-driver-sqlite | 1.2.0 |
@@ -504,33 +498,57 @@ Optional libraries below the lowest tested version may still work, but are not c
+------------------------+---------------------+
| beautifulsoup4 | 4.12.3 |
+------------------------+---------------------+
-| fsspec | 2024.2.0 |
+| bottleneck | 1.4.2 |
++------------------------+---------------------+
+| fastparquet | 2024.11.0 |
+------------------------+---------------------+
-| gcsfs | 2024.2.0 |
+| fsspec | 2024.10.0 |
+------------------------+---------------------+
-| s3fs | 2024.2.0 |
+| hypothesis | 6.116.0 |
++------------------------+---------------------+
+| gcsfs | 2024.10.0 |
++------------------------+---------------------+
+| Jinja2 | 3.1.5 |
++------------------------+---------------------+
+| lxml | 5.3.0 |
+------------------------+---------------------+
| Jinja2 | 3.1.3 |
+------------------------+---------------------+
-| matplotlib | 3.8.3 |
+| matplotlib | 3.9.3 |
++------------------------+---------------------+
+| numba | 0.60.0 |
++------------------------+---------------------+
+| numexpr | 2.10.2 |
++------------------------+---------------------+
+| qtpy | 2.4.2 |
++------------------------+---------------------+
+| openpyxl | 3.1.5 |
++------------------------+---------------------+
+| psycopg2 | 2.9.10 |
++------------------------+---------------------+
+| pyarrow | 13.0.0 |
++------------------------+---------------------+
+| pymysql | 1.1.1 |
++------------------------+---------------------+
+| pyreadstat | 1.2.8 |
+------------------------+---------------------+
-| numba | 0.59.0 |
+| pytables | 3.10.1 |
+------------------------+---------------------+
-| numexpr | 2.9.0 |
+| python-calamine | 0.3.0 |
+------------------------+---------------------+
-| psycopg2 | 2.9.9 |
+| pytz | 2024.2 |
+------------------------+---------------------+
-| pymysql | 1.1.0 |
+| s3fs | 2024.10.0 |
+------------------------+---------------------+
-| pyreadstat | 1.2.6 |
+| SciPy | 1.14.1 |
+------------------------+---------------------+
-| SciPy | 1.12.0 |
+| sqlalchemy | 2.0.36 |
+------------------------+---------------------+
-| xarray | 2024.1.0 |
+| xarray | 2024.10.0 |
+------------------------+---------------------+
| xlsxwriter | 3.2.0 |
+------------------------+---------------------+
-| zstandard | 0.22.0 |
+| zstandard | 0.23.0 |
+------------------------+---------------------+
See :ref:`install.dependencies` and :ref:`install.optional_dependencies` for more.
diff --git a/environment.yml b/environment.yml
index 5f73e4ccf6463..a22229b812d23 100644
--- a/environment.yml
+++ b/environment.yml
@@ -29,41 +29,41 @@ dependencies:
- adbc-driver-postgresql>=1.2.0
- adbc-driver-sqlite>=1.2.0
- beautifulsoup4>=4.12.3
- - bottleneck>=1.3.6
- - fastparquet>=2024.2.0
- - fsspec>=2023.12.2
+ - bottleneck>=1.4.2
+ - fastparquet>=2024.11.0
+ - fsspec>=2024.10.0
- html5lib>=1.1
- - hypothesis>=6.84.0
- - gcsfs>=2023.12.2
- - ipython
- - jinja2>=3.1.3
- - lxml>=4.9.2
- - matplotlib>=3.8.3
- - numba>=0.59.0
- - numexpr>=2.9.0
- - openpyxl>=3.1.2
+ - hypothesis>=6.116.0
+ - gcsfs>=2024.10.0
+ - jinja2>=3.1.5
+ - lxml>=5.3.0
+ - matplotlib>=3.9.3
+ - numba>=0.60.0
+ - numexpr>=2.10.2
+ - openpyxl>=3.1.5
- odfpy>=1.4.1
- - psycopg2>=2.9.9
- - pyarrow>=12.0.1
- - pyiceberg>=0.7.1
- - pymysql>=1.1.0
- - pyreadstat>=1.2.6
- - pytables>=3.8.0
- - python-calamine>=0.1.7
- - pytz>=2023.4
+ - psycopg2>=2.9.10
+ - pyarrow>=13.0.0
+ - pyiceberg>=0.8.1
+ - pymysql>=1.1.1
+ - pyreadstat>=1.2.8
+ - pytables>=3.10.1
+ - python-calamine>=0.3.0
+ - pytz>=2024.2
- pyxlsb>=1.0.10
- - s3fs>=2023.12.2
- - scipy>=1.12.0
- - sqlalchemy>=2.0.0
+ - s3fs>=2024.10.0
+ - scipy>=1.14.1
+ - sqlalchemy>=2.0.36
- tabulate>=0.9.0
- - xarray>=2024.1.1
+ - xarray>=2024.10.0
- xlrd>=2.0.1
- xlsxwriter>=3.2.0
- - zstandard>=0.22.0
+ - zstandard>=0.23.0
# downstream packages
- dask-core
- seaborn-base
+ - ipython
# Mocking s3 tests
- moto
diff --git a/pandas/compat/__init__.py b/pandas/compat/__init__.py
index 7e91ed8863f55..7d86349f773a7 100644
--- a/pandas/compat/__init__.py
+++ b/pandas/compat/__init__.py
@@ -25,8 +25,7 @@
from pandas.compat.numpy import is_numpy_dev
from pandas.compat.pyarrow import (
HAS_PYARROW,
- pa_version_under12p1,
- pa_version_under13p0,
+ PYARROW_MIN_VERSION,
pa_version_under14p0,
pa_version_under14p1,
pa_version_under16p0,
@@ -155,11 +154,10 @@ def is_ci_environment() -> bool:
"IS64",
"ISMUSL",
"PY312",
+ "PYARROW_MIN_VERSION",
"PYPY",
"WASM",
"is_numpy_dev",
- "pa_version_under12p1",
- "pa_version_under13p0",
"pa_version_under14p0",
"pa_version_under14p1",
"pa_version_under16p0",
diff --git a/pandas/compat/_optional.py b/pandas/compat/_optional.py
index d15d9c47efe74..6b04b4dd3a141 100644
--- a/pandas/compat/_optional.py
+++ b/pandas/compat/_optional.py
@@ -23,38 +23,38 @@
"adbc-driver-postgresql": "1.2.0",
"adbc-driver-sqlite": "1.2.0",
"bs4": "4.12.3",
- "bottleneck": "1.3.6",
- "fastparquet": "2024.2.0",
- "fsspec": "2023.12.2",
+ "bottleneck": "1.4.2",
+ "fastparquet": "2024.11.0",
+ "fsspec": "2024.10.0",
"html5lib": "1.1",
- "hypothesis": "6.84.0",
- "gcsfs": "2023.12.2",
- "jinja2": "3.1.3",
- "lxml.etree": "4.9.2",
- "matplotlib": "3.8.3",
- "numba": "0.59.0",
- "numexpr": "2.9.0",
+ "hypothesis": "6.116.0",
+ "gcsfs": "2024.10.0",
+ "jinja2": "3.1.5",
+ "lxml.etree": "5.3.0",
+ "matplotlib": "3.9.3",
+ "numba": "0.60.0",
+ "numexpr": "2.10.2",
"odfpy": "1.4.1",
- "openpyxl": "3.1.2",
- "psycopg2": "2.9.9", # (dt dec pq3 ext lo64)
- "pymysql": "1.1.0",
- "pyarrow": "12.0.1",
- "pyiceberg": "0.7.1",
- "pyreadstat": "1.2.6",
+ "openpyxl": "3.1.5",
+ "psycopg2": "2.9.10", # (dt dec pq3 ext lo64)
+ "pymysql": "1.1.1",
+ "pyarrow": "13.0.0",
+ "pyiceberg": "0.8.1",
+ "pyreadstat": "1.2.8",
"pytest": "7.3.2",
- "python-calamine": "0.1.7",
- "pytz": "2023.4",
+ "python-calamine": "0.3.0",
+ "pytz": "2024.2",
"pyxlsb": "1.0.10",
- "s3fs": "2023.12.2",
- "scipy": "1.12.0",
- "sqlalchemy": "2.0.0",
- "tables": "3.8.0",
+ "s3fs": "2024.10.0",
+ "scipy": "1.14.1",
+ "sqlalchemy": "2.0.36",
+ "tables": "3.10.1",
"tabulate": "0.9.0",
- "xarray": "2024.1.1",
+ "xarray": "2024.10.0",
"xlrd": "2.0.1",
"xlsxwriter": "3.2.0",
- "zstandard": "0.22.0",
- "qtpy": "2.3.0",
+ "zstandard": "0.23.0",
+ "qtpy": "2.4.2",
"pyqt5": "5.15.9",
}
diff --git a/pandas/compat/pyarrow.py b/pandas/compat/pyarrow.py
index 1e1989b276eb6..d1c40d66a52c7 100644
--- a/pandas/compat/pyarrow.py
+++ b/pandas/compat/pyarrow.py
@@ -4,12 +4,11 @@
from pandas.util.version import Version
+PYARROW_MIN_VERSION = "13.0.0"
try:
import pyarrow as pa
_palv = Version(Version(pa.__version__).base_version)
- pa_version_under12p1 = _palv < Version("12.0.1")
- pa_version_under13p0 = _palv < Version("13.0.0")
pa_version_under14p0 = _palv < Version("14.0.0")
pa_version_under14p1 = _palv < Version("14.0.1")
pa_version_under15p0 = _palv < Version("15.0.0")
@@ -19,10 +18,8 @@
pa_version_under19p0 = _palv < Version("19.0.0")
pa_version_under20p0 = _palv < Version("20.0.0")
pa_version_under21p0 = _palv < Version("21.0.0")
- HAS_PYARROW = _palv >= Version("12.0.1")
+ HAS_PYARROW = _palv >= Version(PYARROW_MIN_VERSION)
except ImportError:
- pa_version_under12p1 = True
- pa_version_under13p0 = True
pa_version_under14p0 = True
pa_version_under14p1 = True
pa_version_under15p0 = True
diff --git a/pandas/core/arrays/_arrow_string_mixins.py b/pandas/core/arrays/_arrow_string_mixins.py
index ad118d6be6b18..84a1c358eb4f6 100644
--- a/pandas/core/arrays/_arrow_string_mixins.py
+++ b/pandas/core/arrays/_arrow_string_mixins.py
@@ -14,7 +14,6 @@
from pandas._libs import lib
from pandas.compat import (
HAS_PYARROW,
- pa_version_under13p0,
pa_version_under17p0,
)
@@ -134,12 +133,6 @@ def _str_get(self, i: int) -> Self:
def _str_slice(
self, start: int | None = None, stop: int | None = None, step: int | None = None
) -> Self:
- if pa_version_under13p0:
- # GH#59724
- result = self._apply_elementwise(lambda val: val[start:stop:step])
- return self._from_pyarrow_array(
- pa.chunked_array(result, type=self._pa_array.type)
- )
if start is None:
if step is not None and step < 0:
# GH#59710
@@ -202,14 +195,10 @@ def _str_swapcase(self) -> Self:
return self._from_pyarrow_array(pc.utf8_swapcase(self._pa_array))
def _str_removeprefix(self, prefix: str):
- if not pa_version_under13p0:
- starts_with = pc.starts_with(self._pa_array, pattern=prefix)
- removed = pc.utf8_slice_codeunits(self._pa_array, len(prefix))
- result = pc.if_else(starts_with, removed, self._pa_array)
- return self._from_pyarrow_array(result)
- predicate = lambda val: val.removeprefix(prefix)
- result = self._apply_elementwise(predicate)
- return self._from_pyarrow_array(pa.chunked_array(result))
+ starts_with = pc.starts_with(self._pa_array, pattern=prefix)
+ removed = pc.utf8_slice_codeunits(self._pa_array, len(prefix))
+ result = pc.if_else(starts_with, removed, self._pa_array)
+ return self._from_pyarrow_array(result)
def _str_removesuffix(self, suffix: str):
ends_with = pc.ends_with(self._pa_array, pattern=suffix)
@@ -332,15 +321,6 @@ def _str_fullmatch(
return self._str_match(pat, case, flags, na)
def _str_find(self, sub: str, start: int = 0, end: int | None = None):
- if (
- pa_version_under13p0
- and not (start != 0 and end is not None)
- and not (start == 0 and end is None)
- ):
- # GH#59562
- res_list = self._apply_elementwise(lambda val: val.find(sub, start, end))
- return self._convert_int_result(pa.chunked_array(res_list))
-
if (start == 0 or start is None) and end is None:
result = pc.find_substring(self._pa_array, sub)
else:
diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py
index 6fabfd1a9c230..0087a8da49857 100644
--- a/pandas/core/arrays/arrow/array.py
+++ b/pandas/core/arrays/arrow/array.py
@@ -26,8 +26,7 @@
)
from pandas.compat import (
HAS_PYARROW,
- pa_version_under12p1,
- pa_version_under13p0,
+ PYARROW_MIN_VERSION,
)
from pandas.errors import Pandas4Warning
from pandas.util._decorators import doc
@@ -293,8 +292,11 @@ class ArrowExtensionArray(
_dtype: ArrowDtype
def __init__(self, values: pa.Array | pa.ChunkedArray) -> None:
- if pa_version_under12p1:
- msg = "pyarrow>=10.0.1 is required for PyArrow backed ArrowExtensionArray."
+ if not HAS_PYARROW:
+ msg = (
+ f"pyarrow>={PYARROW_MIN_VERSION} is required for PyArrow "
+ "backed ArrowExtensionArray."
+ )
raise ImportError(msg)
if isinstance(values, pa.Array):
self._pa_array = pa.chunked_array([values])
@@ -1858,8 +1860,6 @@ def _reduce_pyarrow(self, name: str, *, skipna: bool = True, **kwargs) -> pa.Sca
data_to_reduce = self._pa_array
- cast_kwargs = {} if pa_version_under13p0 else {"safe": False}
-
if name in ["any", "all"] and (
pa.types.is_integer(pa_type)
or pa.types.is_floating(pa_type)
@@ -1964,15 +1964,14 @@ def pyarrow_meth(data, skip_nulls, min_count=0): # type: ignore[misc]
if name in ["min", "max", "sum"] and pa.types.is_duration(pa_type):
result = result.cast(pa_type)
if name in ["median", "mean"] and pa.types.is_temporal(pa_type):
- if not pa_version_under13p0:
- nbits = pa_type.bit_width
- if nbits == 32:
- result = result.cast(pa.int32(), **cast_kwargs)
- else:
- result = result.cast(pa.int64(), **cast_kwargs)
+ nbits = pa_type.bit_width
+ if nbits == 32:
+ result = result.cast(pa.int32(), safe=False)
+ else:
+ result = result.cast(pa.int64(), safe=False)
result = result.cast(pa_type)
if name in ["std", "sem"] and pa.types.is_temporal(pa_type):
- result = result.cast(pa.int64(), **cast_kwargs)
+ result = result.cast(pa.int64(), safe=False)
if pa.types.is_duration(pa_type):
result = result.cast(pa_type)
elif pa.types.is_time(pa_type):
@@ -2343,8 +2342,7 @@ def interpolate(
raise TypeError(f"Cannot interpolate with {self.dtype} dtype")
if (
- not pa_version_under13p0
- and method == "linear"
+ method == "linear"
and limit_area is None
and limit is None
and limit_direction == "forward"
diff --git a/pandas/core/arrays/string_.py b/pandas/core/arrays/string_.py
index f58d0b1c0b948..71f0be2aa4000 100644
--- a/pandas/core/arrays/string_.py
+++ b/pandas/core/arrays/string_.py
@@ -27,7 +27,7 @@
from pandas._libs.lib import ensure_string_array
from pandas.compat import (
HAS_PYARROW,
- pa_version_under12p1,
+ PYARROW_MIN_VERSION,
)
from pandas.compat.numpy import function as nv
from pandas.errors import Pandas4Warning
@@ -188,9 +188,10 @@ def __init__(
raise ValueError(
f"Storage must be 'python' or 'pyarrow'. Got {storage} instead."
)
- if storage == "pyarrow" and pa_version_under12p1:
+ if storage == "pyarrow" and not HAS_PYARROW:
raise ImportError(
- "pyarrow>=12.0.1 is required for PyArrow backed StringArray."
+ f"pyarrow>={PYARROW_MIN_VERSION} is required for PyArrow "
+ "backed StringArray."
)
if isinstance(na_value, float) and np.isnan(na_value):
diff --git a/pandas/core/arrays/string_arrow.py b/pandas/core/arrays/string_arrow.py
index e396ce91a293a..ae8ef3232a0f7 100644
--- a/pandas/core/arrays/string_arrow.py
+++ b/pandas/core/arrays/string_arrow.py
@@ -16,8 +16,7 @@
)
from pandas.compat import (
HAS_PYARROW,
- pa_version_under12p1,
- pa_version_under13p0,
+ PYARROW_MIN_VERSION,
pa_version_under16p0,
)
from pandas.util._exceptions import find_stack_level
@@ -64,9 +63,12 @@
from pandas import Series
-def _chk_pyarrow_available() -> None:
- if pa_version_under12p1:
- msg = "pyarrow>=12.0.1 is required for PyArrow backed ArrowExtensionArray."
+def _check_pyarrow_available() -> None:
+ if not HAS_PYARROW:
+ msg = (
+ f"pyarrow>={PYARROW_MIN_VERSION} is required for PyArrow "
+ "backed ArrowExtensionArray."
+ )
raise ImportError(msg)
@@ -128,7 +130,7 @@ class ArrowStringArray(ObjectStringArrayMixin, ArrowExtensionArray, BaseStringAr
_dtype: StringDtype # type: ignore[assignment]
def __init__(self, values, *, dtype: StringDtype | None = None) -> None:
- _chk_pyarrow_available()
+ _check_pyarrow_available()
if isinstance(values, (pa.Array, pa.ChunkedArray)) and (
pa.types.is_string(values.type)
or _is_string_view(values.type)
@@ -194,7 +196,7 @@ def _from_sequence(
) -> Self:
from pandas.core.arrays.masked import BaseMaskedArray
- _chk_pyarrow_available()
+ _check_pyarrow_available()
if dtype and not (isinstance(dtype, str) and dtype == "string"):
dtype = pandas_dtype(dtype)
@@ -340,6 +342,8 @@ def astype(self, dtype, copy: bool = True):
_str_lstrip = ArrowStringArrayMixin._str_lstrip
_str_rstrip = ArrowStringArrayMixin._str_rstrip
_str_removesuffix = ArrowStringArrayMixin._str_removesuffix
+ _str_removeprefix = ArrowStringArrayMixin._str_removeprefix
+ _str_find = ArrowStringArrayMixin._str_find
_str_get = ArrowStringArrayMixin._str_get
_str_capitalize = ArrowStringArrayMixin._str_capitalize
_str_title = ArrowStringArrayMixin._str_title
@@ -436,27 +440,12 @@ def _str_repeat(self, repeats: int | Sequence[int]):
else:
return ArrowExtensionArray._str_repeat(self, repeats=repeats)
- def _str_removeprefix(self, prefix: str):
- if not pa_version_under13p0:
- return ArrowStringArrayMixin._str_removeprefix(self, prefix)
- return super()._str_removeprefix(prefix)
-
def _str_count(self, pat: str, flags: int = 0):
if flags:
return super()._str_count(pat, flags)
result = pc.count_substring_regex(self._pa_array, pat)
return self._convert_int_result(result)
- def _str_find(self, sub: str, start: int = 0, end: int | None = None):
- if (
- pa_version_under13p0
- and not (start != 0 and end is not None)
- and not (start == 0 and end is None)
- ):
- # GH#59562
- return super()._str_find(sub, start, end)
- return ArrowStringArrayMixin._str_find(self, sub, start, end)
-
def _str_get_dummies(self, sep: str = "|", dtype: NpDtype | None = None):
if dtype is None:
dtype = np.int64
diff --git a/pandas/core/dtypes/dtypes.py b/pandas/core/dtypes/dtypes.py
index 74f95cc7f52b4..b39e6d6041727 100644
--- a/pandas/core/dtypes/dtypes.py
+++ b/pandas/core/dtypes/dtypes.py
@@ -49,7 +49,7 @@
from pandas._libs.tslibs.offsets import BDay
from pandas.compat import (
HAS_PYARROW,
- pa_version_under12p1,
+ PYARROW_MIN_VERSION,
)
from pandas.errors import PerformanceWarning
from pandas.util._decorators import set_module
@@ -2189,8 +2189,10 @@ class ArrowDtype(StorageExtensionDtype):
def __init__(self, pyarrow_dtype: pa.DataType) -> None:
super().__init__("pyarrow")
- if pa_version_under12p1:
- raise ImportError("pyarrow>=12.0.1 is required for ArrowDtype")
+ if not HAS_PYARROW:
+ raise ImportError(
+ f"pyarrow>={PYARROW_MIN_VERSION} is required for ArrowDtype"
+ )
if not isinstance(pyarrow_dtype, pa.DataType):
raise ValueError(
f"pyarrow_dtype ({pyarrow_dtype}) must be an instance "
@@ -2341,8 +2343,10 @@ def construct_from_string(cls, string: str) -> ArrowDtype:
if string in ("string[pyarrow]", "str[pyarrow]"):
# Ensure Registry.find skips ArrowDtype to use StringDtype instead
raise TypeError("string[pyarrow] should be constructed by StringDtype")
- if pa_version_under12p1:
- raise ImportError("pyarrow>=10.0.1 is required for ArrowDtype")
+ if not HAS_PYARROW:
+ raise ImportError(
+ f"pyarrow>={PYARROW_MIN_VERSION} is required for ArrowDtype"
+ )
base_type = string[:-9] # get rid of "[pyarrow]"
try:
diff --git a/pandas/tests/arrays/string_/test_string.py b/pandas/tests/arrays/string_/test_string.py
index 7139322482216..f10ebda94dc6a 100644
--- a/pandas/tests/arrays/string_/test_string.py
+++ b/pandas/tests/arrays/string_/test_string.py
@@ -11,10 +11,7 @@
from pandas._config import using_string_dtype
from pandas.compat import HAS_PYARROW
-from pandas.compat.pyarrow import (
- pa_version_under12p1,
- pa_version_under19p0,
-)
+from pandas.compat.pyarrow import pa_version_under19p0
import pandas.util._test_decorators as td
from pandas.core.dtypes.common import is_dtype_equal
@@ -601,8 +598,6 @@ def test_arrow_array(dtype):
data = pd.array(["a", "b", "c"], dtype=dtype)
arr = pa.array(data)
expected = pa.array(list(data), type=pa.large_string(), from_pandas=True)
- if dtype.storage == "pyarrow" and pa_version_under12p1:
- expected = pa.chunked_array(expected)
if dtype.storage == "python":
expected = pc.cast(expected, pa.string())
assert arr.equals(expected)
diff --git a/pandas/tests/arrays/string_/test_string_arrow.py b/pandas/tests/arrays/string_/test_string_arrow.py
index 626e03a900316..90d33efeae689 100644
--- a/pandas/tests/arrays/string_/test_string_arrow.py
+++ b/pandas/tests/arrays/string_/test_string_arrow.py
@@ -177,7 +177,7 @@ def test_from_sequence_wrong_dtype_raises(using_infer_string):
@td.skip_if_installed("pyarrow")
def test_pyarrow_not_installed_raises():
- msg = re.escape("pyarrow>=12.0.1 is required for PyArrow backed")
+ msg = re.escape("pyarrow>=13.0.0 is required for PyArrow backed")
with pytest.raises(ImportError, match=msg):
StringDtype(storage="pyarrow")
diff --git a/pandas/tests/copy_view/test_astype.py b/pandas/tests/copy_view/test_astype.py
index 90f662eeec5ca..d165adb7d4562 100644
--- a/pandas/tests/copy_view/test_astype.py
+++ b/pandas/tests/copy_view/test_astype.py
@@ -4,7 +4,6 @@
import pytest
from pandas.compat import HAS_PYARROW
-from pandas.compat.pyarrow import pa_version_under12p1
from pandas import (
DataFrame,
@@ -196,12 +195,7 @@ def test_astype_arrow_timestamp():
)
result = df.astype("timestamp[ns][pyarrow]")
assert not result._mgr._has_no_reference(0)
- if pa_version_under12p1:
- assert not np.shares_memory(
- get_array(df, "a"), get_array(result, "a")._pa_array
- )
- else:
- assert np.shares_memory(get_array(df, "a"), get_array(result, "a")._pa_array)
+ assert np.shares_memory(get_array(df, "a"), get_array(result, "a")._pa_array)
def test_convert_dtypes_infer_objects():
diff --git a/pandas/tests/dtypes/test_common.py b/pandas/tests/dtypes/test_common.py
index d16729b088f1d..dd14eaa4d4a8d 100644
--- a/pandas/tests/dtypes/test_common.py
+++ b/pandas/tests/dtypes/test_common.py
@@ -868,5 +868,5 @@ def test_pandas_dtype_string_dtype_alias_with_storage():
@td.skip_if_installed("pyarrow")
def test_construct_from_string_without_pyarrow_installed():
# GH 57928
- with pytest.raises(ImportError, match="pyarrow>=10.0.1 is required"):
+ with pytest.raises(ImportError, match="pyarrow>=.* is required"):
pd.Series([-1.5, 0.2, None], dtype="float32[pyarrow]")
diff --git a/pandas/tests/extension/test_arrow.py b/pandas/tests/extension/test_arrow.py
index fe1291809cbf3..1e91ef734da8a 100644
--- a/pandas/tests/extension/test_arrow.py
+++ b/pandas/tests/extension/test_arrow.py
@@ -38,7 +38,6 @@
PY312,
is_ci_environment,
is_platform_windows,
- pa_version_under13p0,
pa_version_under14p0,
pa_version_under19p0,
pa_version_under20p0,
@@ -432,20 +431,7 @@ def test_accumulate_series(self, data, all_numeric_accumulations, skipna, reques
data, all_numeric_accumulations, skipna
)
- if pa_version_under13p0 and all_numeric_accumulations != "cumsum":
- # xfailing takes a long time to run because pytest
- # renders the exception messages even when not showing them
- opt = request.config.option
- if opt.markexpr and "not slow" in opt.markexpr:
- pytest.skip(
- f"{all_numeric_accumulations} not implemented for pyarrow < 9"
- )
- mark = pytest.mark.xfail(
- reason=f"{all_numeric_accumulations} not implemented for pyarrow < 9"
- )
- request.applymarker(mark)
-
- elif all_numeric_accumulations == "cumsum" and (
+ if all_numeric_accumulations == "cumsum" and (
pa.types.is_boolean(pa_type) or pa.types.is_decimal(pa_type)
):
request.applymarker(
@@ -1943,9 +1929,6 @@ def test_str_find_large_start():
tm.assert_series_equal(result, expected)
-@pytest.mark.skipif(
- pa_version_under13p0, reason="https://github.com/apache/arrow/issues/36311"
-)
@pytest.mark.parametrize("start", [-15, -3, 0, 1, 15, None])
@pytest.mark.parametrize("end", [-15, -1, 0, 3, 15, None])
@pytest.mark.parametrize("sub", ["", "az", "abce", "a", "caa"])
@@ -3472,9 +3455,6 @@ def test_string_to_datetime_parsing_cast():
tm.assert_series_equal(result, expected)
-@pytest.mark.skipif(
- pa_version_under13p0, reason="pairwise_diff_checked not implemented in pyarrow"
-)
def test_interpolate_not_numeric(data):
if not data.dtype._is_numeric:
ser = pd.Series(data)
@@ -3483,9 +3463,6 @@ def test_interpolate_not_numeric(data):
pd.Series(data).interpolate()
-@pytest.mark.skipif(
- pa_version_under13p0, reason="pairwise_diff_checked not implemented in pyarrow"
-)
@pytest.mark.parametrize("dtype", ["int64[pyarrow]", "float64[pyarrow]"])
def test_interpolate_linear(dtype):
ser = pd.Series([None, 1, 2, None, 4, None], dtype=dtype)
diff --git a/pandas/tests/frame/methods/test_nlargest.py b/pandas/tests/frame/methods/test_nlargest.py
index 08b7128e6ec11..4a89f3c752040 100644
--- a/pandas/tests/frame/methods/test_nlargest.py
+++ b/pandas/tests/frame/methods/test_nlargest.py
@@ -10,7 +10,6 @@
import pandas as pd
import pandas._testing as tm
-from pandas.util.version import Version
@pytest.fixture
@@ -158,9 +157,7 @@ def test_nlargest_n_duplicate_index(self, n, order, request):
result = df.nlargest(n, order)
expected = df.sort_values(order, ascending=False, kind="stable").head(n)
- if Version(np.__version__) >= Version("1.25") and (
- (order == ["a"] and n in (1, 2, 3, 4)) or ((order == ["a", "b"]) and n == 5)
- ):
+ if (order == ["a"] and n in (1, 2, 3, 4)) or ((order == ["a", "b"]) and n == 5):
request.applymarker(
pytest.mark.xfail(
reason=(
diff --git a/pandas/tests/frame/methods/test_sort_values.py b/pandas/tests/frame/methods/test_sort_values.py
index 9abe0c97c3260..a54ff65b1bb45 100644
--- a/pandas/tests/frame/methods/test_sort_values.py
+++ b/pandas/tests/frame/methods/test_sort_values.py
@@ -10,7 +10,6 @@
date_range,
)
import pandas._testing as tm
-from pandas.util.version import Version
class TestDataFrameSortValues:
@@ -834,10 +833,7 @@ def test_sort_index_level_and_column_label(
self, df_none, df_idx, sort_names, ascending, request
):
# GH#14353
- if (
- Version(np.__version__) >= Version("1.25")
- and request.node.callspec.id == "df_idx0-inner-True"
- ):
+ if request.node.callspec.id == "df_idx0-inner-True":
request.applymarker(
pytest.mark.xfail(
reason=(
@@ -881,16 +877,15 @@ def test_sort_column_level_and_index_label(
# Compute result by transposing and sorting on axis=1.
result = df_idx.T.sort_values(by=sort_names, ascending=ascending, axis=1)
- if Version(np.__version__) >= Version("1.25"):
- request.applymarker(
- pytest.mark.xfail(
- reason=(
- "pandas default unstable sorting of duplicates"
- "issue with numpy>=1.25 with AVX instructions"
- ),
- strict=False,
- )
+ request.applymarker(
+ pytest.mark.xfail(
+ reason=(
+ "pandas default unstable sorting of duplicates"
+ "issue with numpy>=1.25 with AVX instructions"
+ ),
+ strict=False,
)
+ )
tm.assert_frame_equal(result, expected)
diff --git a/pandas/tests/generic/test_to_xarray.py b/pandas/tests/generic/test_to_xarray.py
index 5f805ab37c396..ea1cc2e1e0e2a 100644
--- a/pandas/tests/generic/test_to_xarray.py
+++ b/pandas/tests/generic/test_to_xarray.py
@@ -6,7 +6,6 @@
DataFrame,
MultiIndex,
Series,
- StringDtype,
date_range,
)
import pandas._testing as tm
@@ -36,12 +35,8 @@ def test_to_xarray_index_types(self, index_flat, df, request):
# MultiIndex is tested in test_to_xarray_with_multiindex
if len(index) == 0:
pytest.skip("Test doesn't make sense for empty index")
- elif Version(xarray.__version__) <= Version("2024.9.0"):
- request.applymarker(
- pytest.mark.xfail(
- reason="Categorical column not preserved.",
- )
- )
+ if Version(xarray.__version__) < Version("2025.9.0"):
+ pytest.skip("Xarray bug https://github.com/pydata/xarray/issues/9661")
df.index = index[:4]
df.index.name = "foo"
@@ -88,20 +83,8 @@ def test_to_xarray_with_multiindex(self, df, using_infer_string):
class TestSeriesToXArray:
def test_to_xarray_index_types(self, index_flat, request):
- index = index_flat
- if (
- isinstance(index.dtype, StringDtype)
- and index.dtype.storage == "pyarrow"
- and Version(xarray.__version__) > Version("2024.9.0")
- and Version(xarray.__version__) < Version("2025.6.0")
- ):
- request.applymarker(
- pytest.mark.xfail(
- reason="xarray calling reshape of ArrowExtensionArray",
- raises=NotImplementedError,
- )
- )
# MultiIndex is tested in test_to_xarray_with_multiindex
+ index = index_flat
ser = Series(range(len(index)), index=index, dtype="int64")
ser.index.name = "foo"
diff --git a/pandas/tests/groupby/methods/test_value_counts.py b/pandas/tests/groupby/methods/test_value_counts.py
index 1050f8154572a..536e94483c36f 100644
--- a/pandas/tests/groupby/methods/test_value_counts.py
+++ b/pandas/tests/groupby/methods/test_value_counts.py
@@ -19,7 +19,6 @@
to_datetime,
)
import pandas._testing as tm
-from pandas.util.version import Version
def tests_value_counts_index_names_category_column():
@@ -237,16 +236,15 @@ def test_bad_subset(education_df):
def test_basic(education_df, request):
# gh43564
- if Version(np.__version__) >= Version("1.25"):
- request.applymarker(
- pytest.mark.xfail(
- reason=(
- "pandas default unstable sorting of duplicates"
- "issue with numpy>=1.25 with AVX instructions"
- ),
- strict=False,
- )
+ request.applymarker(
+ pytest.mark.xfail(
+ reason=(
+ "pandas default unstable sorting of duplicates"
+ "issue with numpy>=1.25 with AVX instructions"
+ ),
+ strict=False,
)
+ )
result = education_df.groupby("country")[["gender", "education"]].value_counts(
normalize=True
)
@@ -302,7 +300,7 @@ def test_against_frame_and_seriesgroupby(
# - 3-way compare against:
# - apply with :meth:`~DataFrame.value_counts`
# - `~SeriesGroupBy.value_counts`
- if Version(np.__version__) >= Version("1.25") and frame and sort and normalize:
+ if frame and sort and normalize:
request.applymarker(
pytest.mark.xfail(
reason=(
@@ -480,7 +478,7 @@ def test_data_frame_value_counts(
def test_dropna_combinations(
group_dropna, count_dropna, expected_rows, expected_values, request
):
- if Version(np.__version__) >= Version("1.25") and not group_dropna:
+ if not group_dropna:
request.applymarker(
pytest.mark.xfail(
reason=(
@@ -587,16 +585,15 @@ def test_categorical_single_grouper_with_only_observed_categories(
):
# Test single categorical grouper with only observed grouping categories
# when non-groupers are also categorical
- if Version(np.__version__) >= Version("1.25"):
- request.applymarker(
- pytest.mark.xfail(
- reason=(
- "pandas default unstable sorting of duplicates"
- "issue with numpy>=1.25 with AVX instructions"
- ),
- strict=False,
- )
+ request.applymarker(
+ pytest.mark.xfail(
+ reason=(
+ "pandas default unstable sorting of duplicates"
+ "issue with numpy>=1.25 with AVX instructions"
+ ),
+ strict=False,
)
+ )
gp = education_df.astype("category").groupby(
"country", as_index=as_index, observed=observed
@@ -695,16 +692,15 @@ def test_categorical_single_grouper_observed_true(
):
# GH#46357
- if Version(np.__version__) >= Version("1.25"):
- request.applymarker(
- pytest.mark.xfail(
- reason=(
- "pandas default unstable sorting of duplicates"
- "issue with numpy>=1.25 with AVX instructions"
- ),
- strict=False,
- )
+ request.applymarker(
+ pytest.mark.xfail(
+ reason=(
+ "pandas default unstable sorting of duplicates"
+ "issue with numpy>=1.25 with AVX instructions"
+ ),
+ strict=False,
)
+ )
expected_index = [
("FR", "male", "low"),
@@ -775,16 +771,15 @@ def test_categorical_single_grouper_observed_false(
):
# GH#46357
- if Version(np.__version__) >= Version("1.25"):
- request.applymarker(
- pytest.mark.xfail(
- reason=(
- "pandas default unstable sorting of duplicates"
- "issue with numpy>=1.25 with AVX instructions"
- ),
- strict=False,
- )
+ request.applymarker(
+ pytest.mark.xfail(
+ reason=(
+ "pandas default unstable sorting of duplicates"
+ "issue with numpy>=1.25 with AVX instructions"
+ ),
+ strict=False,
)
+ )
expected_index = [
("FR", "male", "low"),
@@ -926,16 +921,15 @@ def test_categorical_non_groupers(
# GH#46357 Test non-observed categories are included in the result,
# regardless of `observed`
- if Version(np.__version__) >= Version("1.25"):
- request.applymarker(
- pytest.mark.xfail(
- reason=(
- "pandas default unstable sorting of duplicates"
- "issue with numpy>=1.25 with AVX instructions"
- ),
- strict=False,
- )
+ request.applymarker(
+ pytest.mark.xfail(
+ reason=(
+ "pandas default unstable sorting of duplicates"
+ "issue with numpy>=1.25 with AVX instructions"
+ ),
+ strict=False,
)
+ )
education_df = education_df.copy()
education_df["gender"] = education_df["gender"].astype("category")
diff --git a/pandas/tests/io/test_fsspec.py b/pandas/tests/io/test_fsspec.py
index 87d5ea9376cc5..a452d9136eed7 100644
--- a/pandas/tests/io/test_fsspec.py
+++ b/pandas/tests/io/test_fsspec.py
@@ -6,6 +6,7 @@
from pandas._config import using_string_dtype
from pandas.compat import HAS_PYARROW
+from pandas.compat.pyarrow import pa_version_under14p0
from pandas import (
DataFrame,
@@ -179,7 +180,8 @@ def test_excel_options(fsspectest):
@pytest.mark.xfail(
- using_string_dtype() and HAS_PYARROW, reason="TODO(infer_string) fastparquet"
+ using_string_dtype() and HAS_PYARROW and not pa_version_under14p0,
+ reason="TODO(infer_string) fastparquet",
)
def test_to_parquet_new_file(cleared_fs, df1):
"""Regression test for writing to a not-yet-existent GCS Parquet file."""
diff --git a/pandas/tests/io/test_parquet.py b/pandas/tests/io/test_parquet.py
index 4fe3a97cb2386..bb680e3067696 100644
--- a/pandas/tests/io/test_parquet.py
+++ b/pandas/tests/io/test_parquet.py
@@ -13,7 +13,6 @@
from pandas.compat import is_platform_windows
from pandas.compat.pyarrow import (
- pa_version_under13p0,
pa_version_under15p0,
pa_version_under17p0,
pa_version_under19p0,
@@ -728,14 +727,7 @@ def test_to_bytes_without_path_or_buf_provided(self, pa, df_full):
expected = df_full.copy()
expected.loc[1, "string_with_nan"] = None
- if pa_version_under13p0:
- expected["datetime_with_nat"] = expected["datetime_with_nat"].astype(
- "M8[ns]"
- )
- else:
- expected["datetime_with_nat"] = expected["datetime_with_nat"].astype(
- "M8[ms]"
- )
+ expected["datetime_with_nat"] = expected["datetime_with_nat"].astype("M8[ms]")
tm.assert_frame_equal(res, expected)
def test_duplicate_columns(self, pa):
@@ -999,8 +991,6 @@ def test_timezone_aware_index(self, pa, timezone_aware_date_list):
# this use-case sets the resolution to 1 minute
expected = df[:]
- if pa_version_under13p0:
- expected.index = expected.index.as_unit("ns")
if timezone_aware_date_list.tzinfo != datetime.UTC:
# pyarrow returns pytz.FixedOffset while pandas constructs datetime.timezone
# https://github.com/pandas-dev/pandas/issues/37286
@@ -1038,13 +1028,6 @@ def test_read_dtype_backend_pyarrow_config(self, pa, df_full):
pa_table = pyarrow.Table.from_pandas(df)
expected = pa_table.to_pandas(types_mapper=pd.ArrowDtype)
- if pa_version_under13p0:
- # pyarrow infers datetimes as us instead of ns
- expected["datetime"] = expected["datetime"].astype("timestamp[us][pyarrow]")
- expected["datetime_tz"] = expected["datetime_tz"].astype(
- pd.ArrowDtype(pyarrow.timestamp(unit="us", tz="Europe/Brussels"))
- )
-
expected["datetime_with_nat"] = expected["datetime_with_nat"].astype(
"timestamp[ms][pyarrow]"
)
@@ -1061,10 +1044,8 @@ def test_read_dtype_backend_pyarrow_config_index(self, pa):
{"a": [1, 2]}, index=pd.Index([3, 4], name="test"), dtype="int64[pyarrow]"
)
expected = df.copy()
- import pyarrow
- if Version(pyarrow.__version__) > Version("11.0.0"):
- expected.index = expected.index.astype("int64[pyarrow]")
+ expected.index = expected.index.astype("int64[pyarrow]")
check_round_trip(
df,
engine=pa,
@@ -1215,14 +1196,6 @@ def test_maps_as_pydicts(self, pa):
class TestParquetFastParquet(Base):
def test_basic(self, fp, df_full, request):
pytz = pytest.importorskip("pytz")
- import fastparquet
-
- if Version(fastparquet.__version__) < Version("2024.11.0"):
- request.applymarker(
- pytest.mark.xfail(
- reason=("datetime_with_nat gets incorrect values"),
- )
- )
tz = pytz.timezone("US/Eastern")
df = df_full
@@ -1261,16 +1234,6 @@ def test_duplicate_columns(self, fp):
self.check_error_on_write(df, fp, ValueError, msg)
def test_bool_with_none(self, fp, request):
- import fastparquet
-
- if Version(fastparquet.__version__) < Version("2024.11.0") and Version(
- np.__version__
- ) >= Version("2.0.0"):
- request.applymarker(
- pytest.mark.xfail(
- reason=("fastparquet uses np.float_ in numpy2"),
- )
- )
df = pd.DataFrame({"a": [True, None, False]})
expected = pd.DataFrame({"a": [1.0, np.nan, 0.0]}, dtype="float16")
# Fastparquet bug in 0.7.1 makes it so that this dtype becomes
@@ -1385,18 +1348,6 @@ def test_empty_dataframe(self, fp):
check_round_trip(df, fp, expected=expected)
def test_timezone_aware_index(self, fp, timezone_aware_date_list, request):
- import fastparquet
-
- if Version(fastparquet.__version__) < Version("2024.11.0"):
- request.applymarker(
- pytest.mark.xfail(
- reason=(
- "fastparquet bug, see "
- "https://github.com/dask/fastparquet/issues/929"
- ),
- )
- )
-
idx = 5 * [timezone_aware_date_list]
df = pd.DataFrame(index=idx, data={"index_as_col": idx})
diff --git a/pandas/tests/io/test_spss.py b/pandas/tests/io/test_spss.py
index 973cb21ac3041..61d7225cab02e 100644
--- a/pandas/tests/io/test_spss.py
+++ b/pandas/tests/io/test_spss.py
@@ -6,7 +6,6 @@
import pandas as pd
import pandas._testing as tm
-from pandas.util.version import Version
pyreadstat = pytest.importorskip("pyreadstat")
@@ -171,7 +170,6 @@ def test_spss_metadata(datapath):
"file_format": "sav/zsav",
"creation_time": datetime.datetime(2015, 2, 6, 14, 33, 36),
"modification_time": datetime.datetime(2015, 2, 6, 14, 33, 36),
+ "mr_sets": {},
}
- if Version(pyreadstat.__version__) >= Version("1.2.8"):
- metadata["mr_sets"] = {}
tm.assert_dict_equal(df.attrs, metadata)
diff --git a/pandas/tests/series/accessors/test_struct_accessor.py b/pandas/tests/series/accessors/test_struct_accessor.py
index c1ef1b14ec3d0..f0bf81621610a 100644
--- a/pandas/tests/series/accessors/test_struct_accessor.py
+++ b/pandas/tests/series/accessors/test_struct_accessor.py
@@ -2,8 +2,6 @@
import pytest
-from pandas.compat.pyarrow import pa_version_under13p0
-
from pandas import (
ArrowDtype,
DataFrame,
@@ -56,7 +54,6 @@ def test_struct_accessor_dtypes():
tm.assert_series_equal(actual, expected)
-@pytest.mark.skipif(pa_version_under13p0, reason="pyarrow>=13.0.0 required")
def test_struct_accessor_field():
index = Index([-100, 42, 123])
ser = Series(
@@ -165,7 +162,6 @@ def test_struct_accessor_api_for_invalid(invalid):
([b"string_col"], "string_col"),
],
)
-@pytest.mark.skipif(pa_version_under13p0, reason="pyarrow>=13.0.0 required")
def test_struct_accessor_field_expanded(indices, name):
arrow_type = pa.struct(
[
diff --git a/pyproject.toml b/pyproject.toml
index 450fd06232d8c..60a13d073f289 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -56,66 +56,66 @@ repository = 'https://github.com/pandas-dev/pandas'
matplotlib = "pandas:plotting._matplotlib"
[project.optional-dependencies]
-test = ['hypothesis>=6.84.0', 'pytest>=7.3.2', 'pytest-xdist>=3.4.0']
-pyarrow = ['pyarrow>=12.0.1']
-performance = ['bottleneck>=1.3.6', 'numba>=0.59.0', 'numexpr>=2.9.0']
-computation = ['scipy>=1.12.0', 'xarray>=2024.1.1']
-fss = ['fsspec>=2023.12.2']
-aws = ['s3fs>=2023.12.2']
-gcp = ['gcsfs>=2023.12.2']
-excel = ['odfpy>=1.4.1', 'openpyxl>=3.1.2', 'python-calamine>=0.1.7', 'pyxlsb>=1.0.10', 'xlrd>=2.0.1', 'xlsxwriter>=3.2.0']
-parquet = ['pyarrow>=12.0.1']
-feather = ['pyarrow>=12.0.1']
-iceberg = ['pyiceberg>=0.7.1']
-hdf5 = ['tables>=3.8.0']
-spss = ['pyreadstat>=1.2.6']
-postgresql = ['SQLAlchemy>=2.0.0', 'psycopg2>=2.9.9', 'adbc-driver-postgresql>=1.2.0']
-mysql = ['SQLAlchemy>=2.0.0', 'pymysql>=1.1.0']
-sql-other = ['SQLAlchemy>=2.0.0', 'adbc-driver-postgresql>=1.2.0', 'adbc-driver-sqlite>=1.2.0']
-html = ['beautifulsoup4>=4.12.3', 'html5lib>=1.1', 'lxml>=4.9.2']
-xml = ['lxml>=4.9.2']
-plot = ['matplotlib>=3.8.3']
-output-formatting = ['jinja2>=3.1.3', 'tabulate>=0.9.0']
-clipboard = ['PyQt5>=5.15.9', 'qtpy>=2.3.0']
-compression = ['zstandard>=0.22.0']
-timezone = ['pytz>=2023.4']
+test = ['hypothesis>=6.116.0', 'pytest>=7.3.2', 'pytest-xdist>=3.4.0']
+pyarrow = ['pyarrow>=13.0.0']
+performance = ['bottleneck>=1.4.2', 'numba>=0.60.0', 'numexpr>=2.10.2']
+computation = ['scipy>=1.14.1', 'xarray>=2024.10.0']
+fss = ['fsspec>=2024.10.0']
+aws = ['s3fs>=2024.10.0']
+gcp = ['gcsfs>=2024.10.0']
+excel = ['odfpy>=1.4.1', 'openpyxl>=3.1.5', 'python-calamine>=0.3.0', 'pyxlsb>=1.0.10', 'xlrd>=2.0.1', 'xlsxwriter>=3.2.0']
+parquet = ['pyarrow>=13.0.0']
+feather = ['pyarrow>=13.0.0']
+iceberg = ['pyiceberg>=0.8.1']
+hdf5 = ['tables>=3.10.1']
+spss = ['pyreadstat>=1.2.8']
+postgresql = ['SQLAlchemy>=2.0.36', 'psycopg2>=2.9.10', 'adbc-driver-postgresql>=1.2.0']
+mysql = ['SQLAlchemy>=2.0.36', 'pymysql>=1.1.1']
+sql-other = ['SQLAlchemy>=2.0.36', 'adbc-driver-postgresql>=1.2.0', 'adbc-driver-sqlite>=1.2.0']
+html = ['beautifulsoup4>=4.12.3', 'html5lib>=1.1', 'lxml>=5.3.0']
+xml = ['lxml>=5.3.0']
+plot = ['matplotlib>=3.9.3']
+output-formatting = ['jinja2>=3.1.5', 'tabulate>=0.9.0']
+clipboard = ['PyQt5>=5.15.9', 'qtpy>=2.4.2']
+compression = ['zstandard>=0.23.0']
+timezone = ['pytz>=2024.2']
all = ['adbc-driver-postgresql>=1.2.0',
'adbc-driver-sqlite>=1.2.0',
'beautifulsoup4>=4.12.3',
- 'bottleneck>=1.3.6',
- 'fastparquet>=2024.2.0',
- 'fsspec>=2023.12.2',
- 'gcsfs>=2023.12.2',
+ 'bottleneck>=1.4.2',
+ 'fastparquet>=2024.11.0',
+ 'fsspec>=2024.10.0',
+ 'gcsfs>=2024.10.0',
'html5lib>=1.1',
- 'hypothesis>=6.84.0',
- 'jinja2>=3.1.3',
- 'lxml>=4.9.2',
- 'matplotlib>=3.8.3',
- 'numba>=0.59.0',
- 'numexpr>=2.9.0',
+ 'hypothesis>=6.116.0',
+ 'jinja2>=3.1.5',
+ 'lxml>=5.3.0',
+ 'matplotlib>=3.9.3',
+ 'numba>=0.60.0',
+ 'numexpr>=2.10.2',
'odfpy>=1.4.1',
- 'openpyxl>=3.1.2',
- 'psycopg2>=2.9.9',
- 'pyarrow>=12.0.1',
- 'pyiceberg>=0.7.1',
- 'pymysql>=1.1.0',
+ 'openpyxl>=3.1.5',
+ 'psycopg2>=2.9.10',
+ 'pyarrow>=13.0.0',
+ 'pyiceberg>=0.8.1',
+ 'pymysql>=1.1.1',
'PyQt5>=5.15.9',
- 'pyreadstat>=1.2.6',
+ 'pyreadstat>=1.2.8',
'pytest>=7.3.2',
'pytest-xdist>=3.4.0',
- 'python-calamine>=0.1.7',
- 'pytz>=2023.4',
+ 'python-calamine>=0.3.0',
+ 'pytz>=2024.2',
'pyxlsb>=1.0.10',
- 'qtpy>=2.3.0',
- 'scipy>=1.12.0',
- 's3fs>=2023.12.2',
- 'SQLAlchemy>=2.0.0',
- 'tables>=3.8.0',
+ 'qtpy>=2.4.2',
+ 'scipy>=1.14.1',
+ 's3fs>=2024.10.0',
+ 'SQLAlchemy>=2.0.36',
+ 'tables>=3.10.1',
'tabulate>=0.9.0',
- 'xarray>=2024.1.1',
+ 'xarray>=2024.10.0',
'xlrd>=2.0.1',
'xlsxwriter>=3.2.0',
- 'zstandard>=0.22.0']
+ 'zstandard>=0.23.0']
# TODO: Remove after setuptools support is dropped.
[tool.setuptools]
@@ -186,7 +186,7 @@ environment = {CFLAGS="-g0"}
[[tool.cibuildwheel.overrides]]
select = "*pyodide*"
-test-requires = "pytest>=7.3.2 hypothesis>=6.84.0"
+test-requires = "pytest>=7.3.2 hypothesis>=6.116.0"
# Pyodide repairs wheels on its own, using auditwheel-emscripten
repair-wheel-command = ""
# https://github.com/pyodide/pyodide/issues/5805
diff --git a/requirements-dev.txt b/requirements-dev.txt
index e4e485ad31333..721f094c052e3 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -18,39 +18,39 @@ numpy<3
adbc-driver-postgresql>=1.2.0
adbc-driver-sqlite>=1.2.0
beautifulsoup4>=4.12.3
-bottleneck>=1.3.6
-fastparquet>=2024.2.0
-fsspec>=2023.12.2
+bottleneck>=1.4.2
+fastparquet>=2024.11.0
+fsspec>=2024.10.0
html5lib>=1.1
-hypothesis>=6.84.0
-gcsfs>=2023.12.2
-ipython
-jinja2>=3.1.3
-lxml>=4.9.2
-matplotlib>=3.8.3
-numba>=0.59.0
-numexpr>=2.9.0
-openpyxl>=3.1.2
+hypothesis>=6.116.0
+gcsfs>=2024.10.0
+jinja2>=3.1.5
+lxml>=5.3.0
+matplotlib>=3.9.3
+numba>=0.60.0
+numexpr>=2.10.2
+openpyxl>=3.1.5
odfpy>=1.4.1
-psycopg2-binary>=2.9.9
-pyarrow>=12.0.1
-pyiceberg>=0.7.1
-pymysql>=1.1.0
-pyreadstat>=1.2.6
-tables>=3.8.0
-python-calamine>=0.1.7
-pytz>=2023.4
+psycopg2-binary>=2.9.10
+pyarrow>=13.0.0
+pyiceberg>=0.8.1
+pymysql>=1.1.1
+pyreadstat>=1.2.8
+tables>=3.10.1
+python-calamine>=0.3.0
+pytz>=2024.2
pyxlsb>=1.0.10
-s3fs>=2023.12.2
-scipy>=1.12.0
-SQLAlchemy>=2.0.0
+s3fs>=2024.10.0
+scipy>=1.14.1
+SQLAlchemy>=2.0.36
tabulate>=0.9.0
-xarray>=2024.1.1
+xarray>=2024.10.0
xlrd>=2.0.1
xlsxwriter>=3.2.0
-zstandard>=0.22.0
+zstandard>=0.23.0
dask
seaborn
+ipython
moto
asv>=0.6.1
flake8==7.1.0