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