From f46bdbdd305b4a72f58e63bc43babe669ea79b04 Mon Sep 17 00:00:00 2001 From: cmp0xff Date: Fri, 1 Aug 2025 13:19:45 +0200 Subject: [PATCH 1/3] feat: https://github.com/pandas-dev/pandas-stubs/issues/1300#issuecomment-3141883971 --- pandas-stubs/core/reshape/concat.pyi | 17 ++++++++++- tests/test_frame.py | 4 +-- tests/test_pandas.py | 44 +++++++++++++++++++++++++--- 3 files changed, 58 insertions(+), 7 deletions(-) diff --git a/pandas-stubs/core/reshape/concat.pyi b/pandas-stubs/core/reshape/concat.pyi index 9b8624f56..dbcbb6ee8 100644 --- a/pandas-stubs/core/reshape/concat.pyi +++ b/pandas-stubs/core/reshape/concat.pyi @@ -15,6 +15,7 @@ from pandas import ( from typing_extensions import Never from pandas._typing import ( + S2, Axis, AxisIndex, HashableT1, @@ -38,7 +39,21 @@ def concat( # type: ignore[overload-overlap] copy: bool = ..., ) -> DataFrame: ... @overload -def concat( # type: ignore[overload-overlap] # pyright: ignore[reportOverlappingOverload] +def concat( # pyright: ignore[reportOverlappingOverload] + objs: Iterable[Series[S2]], + *, + axis: Literal[0, "index"] = ..., + join: Literal["inner", "outer"] = ..., + ignore_index: bool = ..., + keys: Iterable[HashableT2] = ..., + levels: Sequence[list[HashableT3] | tuple[HashableT3, ...]] = ..., + names: list[HashableT4] | None = ..., + verify_integrity: bool = ..., + sort: bool = ..., + copy: bool = ..., +) -> Series[S2]: ... +@overload +def concat( # type: ignore[overload-overlap] objs: Iterable[Series] | Mapping[HashableT1, Series], *, axis: AxisIndex = ..., diff --git a/tests/test_frame.py b/tests/test_frame.py index b2348fc30..70474c393 100644 --- a/tests/test_frame.py +++ b/tests/test_frame.py @@ -2523,8 +2523,8 @@ def test_types_regressions() -> None: ts1 = pd.concat([s1, s2], axis=0) ts2 = pd.concat([s1, s2]) - check(assert_type(ts1, pd.Series), pd.Series) - check(assert_type(ts2, pd.Series), pd.Series) + check(assert_type(ts1, "pd.Series[int]"), pd.Series, np.int64) + check(assert_type(ts2, "pd.Series[int]"), pd.Series, np.int64) # https://github.com/microsoft/python-type-stubs/issues/110 check(assert_type(pd.Timestamp("2021-01-01"), pd.Timestamp), datetime.date) diff --git a/tests/test_pandas.py b/tests/test_pandas.py index 068254c3a..9ae0f865a 100644 --- a/tests/test_pandas.py +++ b/tests/test_pandas.py @@ -132,25 +132,30 @@ def test_types_concat() -> None: s = pd.Series([0, 1, -10]) s2 = pd.Series([7, -5, 10]) - check(assert_type(pd.concat([s, s2]), pd.Series), pd.Series) + check(assert_type(pd.concat([s, s2]), "pd.Series[int]"), pd.Series, np.int64) check(assert_type(pd.concat([s, s2], axis=1), pd.DataFrame), pd.DataFrame) check( - assert_type(pd.concat([s, s2], keys=["first", "second"], sort=True), pd.Series), + assert_type( + pd.concat([s, s2], keys=["first", "second"], sort=True), "pd.Series[int]" + ), pd.Series, + np.int64, ) check( assert_type( pd.concat([s, s2], keys=["first", "second"], names=["source", "row"]), - pd.Series, + "pd.Series[int]", ), pd.Series, + np.int64, ) check( assert_type( pd.concat([s, s2], keys=["first", "second"], names=None), - pd.Series, + "pd.Series[int]", ), pd.Series, + np.int64, ) # Depends on the axis @@ -236,6 +241,37 @@ def test_types_concat() -> None: check(assert_type(pd.concat([pd.DataFrame(), data]), pd.DataFrame), pd.DataFrame) +def test_concat_series_mixed_numeric() -> None: + """Test concatenation of Series with mixed numeric types. + + Derived from test_types_concat.""" + s = pd.Series([0, 1, -10]) + s2 = pd.Series([7.0, -5, 10]) + + check(assert_type(pd.concat([s, s2]), pd.Series), pd.Series, np.float64) + check( + assert_type(pd.concat([s, s2], keys=["first", "second"], sort=True), pd.Series), + pd.Series, + np.float64, + ) + check( + assert_type( + pd.concat([s, s2], keys=["first", "second"], names=["source", "row"]), + pd.Series, + ), + pd.Series, + np.float64, + ) + check( + assert_type( + pd.concat([s, s2], keys=["first", "second"], names=None), + pd.Series, + ), + pd.Series, + np.float64, + ) + + def test_concat_args() -> None: df = pd.DataFrame(data={"col1": [1, 2], "col2": [3, 4]}) df2 = pd.DataFrame(data={"col1": [10, 20], "col2": [30, 40]}, index=[2, 3]) From 1d565b43ae325b42ec9b13567fb4bcd8d3130f7b Mon Sep 17 00:00:00 2001 From: cmp0xff Date: Fri, 1 Aug 2025 16:09:47 +0200 Subject: [PATCH 2/3] fix(comment): https://github.com/pandas-dev/pandas-stubs/pull/1302/files#r2247860692 --- tests/test_frame.py | 4 ++-- tests/test_pandas.py | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/test_frame.py b/tests/test_frame.py index 70474c393..cc25d57c6 100644 --- a/tests/test_frame.py +++ b/tests/test_frame.py @@ -2523,8 +2523,8 @@ def test_types_regressions() -> None: ts1 = pd.concat([s1, s2], axis=0) ts2 = pd.concat([s1, s2]) - check(assert_type(ts1, "pd.Series[int]"), pd.Series, np.int64) - check(assert_type(ts2, "pd.Series[int]"), pd.Series, np.int64) + check(assert_type(ts1, "pd.Series[int]"), pd.Series, np.integer) + check(assert_type(ts2, "pd.Series[int]"), pd.Series, np.integer) # https://github.com/microsoft/python-type-stubs/issues/110 check(assert_type(pd.Timestamp("2021-01-01"), pd.Timestamp), datetime.date) diff --git a/tests/test_pandas.py b/tests/test_pandas.py index 9ae0f865a..d3331757f 100644 --- a/tests/test_pandas.py +++ b/tests/test_pandas.py @@ -132,14 +132,14 @@ def test_types_concat() -> None: s = pd.Series([0, 1, -10]) s2 = pd.Series([7, -5, 10]) - check(assert_type(pd.concat([s, s2]), "pd.Series[int]"), pd.Series, np.int64) + check(assert_type(pd.concat([s, s2]), "pd.Series[int]"), pd.Series, np.integer) check(assert_type(pd.concat([s, s2], axis=1), pd.DataFrame), pd.DataFrame) check( assert_type( pd.concat([s, s2], keys=["first", "second"], sort=True), "pd.Series[int]" ), pd.Series, - np.int64, + np.integer, ) check( assert_type( @@ -147,7 +147,7 @@ def test_types_concat() -> None: "pd.Series[int]", ), pd.Series, - np.int64, + np.integer, ) check( assert_type( @@ -155,7 +155,7 @@ def test_types_concat() -> None: "pd.Series[int]", ), pd.Series, - np.int64, + np.integer, ) # Depends on the axis @@ -248,11 +248,11 @@ def test_concat_series_mixed_numeric() -> None: s = pd.Series([0, 1, -10]) s2 = pd.Series([7.0, -5, 10]) - check(assert_type(pd.concat([s, s2]), pd.Series), pd.Series, np.float64) + check(assert_type(pd.concat([s, s2]), pd.Series), pd.Series, np.floating) check( assert_type(pd.concat([s, s2], keys=["first", "second"], sort=True), pd.Series), pd.Series, - np.float64, + np.floating, ) check( assert_type( @@ -260,7 +260,7 @@ def test_concat_series_mixed_numeric() -> None: pd.Series, ), pd.Series, - np.float64, + np.floating, ) check( assert_type( @@ -268,7 +268,7 @@ def test_concat_series_mixed_numeric() -> None: pd.Series, ), pd.Series, - np.float64, + np.floating, ) From 39b6bb29899d3b32faf0ff85a6d84aa44db3c2dc Mon Sep 17 00:00:00 2001 From: cmp0xff Date: Fri, 1 Aug 2025 17:02:37 +0200 Subject: [PATCH 3/3] Apply suggestion from @Dr-Irv https://github.com/pandas-dev/pandas-stubs/pull/1302/files#r2248094383 Co-authored-by: Irv Lustig --- pandas-stubs/core/reshape/concat.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas-stubs/core/reshape/concat.pyi b/pandas-stubs/core/reshape/concat.pyi index dbcbb6ee8..b37dc4b75 100644 --- a/pandas-stubs/core/reshape/concat.pyi +++ b/pandas-stubs/core/reshape/concat.pyi @@ -42,7 +42,7 @@ def concat( # type: ignore[overload-overlap] def concat( # pyright: ignore[reportOverlappingOverload] objs: Iterable[Series[S2]], *, - axis: Literal[0, "index"] = ..., + axis: AxisIndex = ..., join: Literal["inner", "outer"] = ..., ignore_index: bool = ..., keys: Iterable[HashableT2] = ...,