Skip to content

Commit 17fa54b

Browse files
committed
Merge branch 'master' of https://github.com/pandas-dev/pandas into cln-pytables-sigs
2 parents 009c893 + 021fa9e commit 17fa54b

File tree

11 files changed

+105
-49
lines changed

11 files changed

+105
-49
lines changed

ci/azure/posix.yml

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,13 @@ jobs:
4444
PATTERN: "not slow and not network"
4545
LOCALE_OVERRIDE: "zh_CN.UTF-8"
4646

47-
# Disabled for NumPy object-dtype warning.
48-
# https://github.com/pandas-dev/pandas/issues/30043
49-
# py37_np_dev:
50-
# ENV_FILE: ci/deps/azure-37-numpydev.yaml
51-
# CONDA_PY: "37"
52-
# PATTERN: "not slow and not network"
53-
# TEST_ARGS: "-W error"
54-
# PANDAS_TESTING_MODE: "deprecate"
55-
# EXTRA_APT: "xsel"
47+
py37_np_dev:
48+
ENV_FILE: ci/deps/azure-37-numpydev.yaml
49+
CONDA_PY: "37"
50+
PATTERN: "not slow and not network"
51+
TEST_ARGS: "-W error"
52+
PANDAS_TESTING_MODE: "deprecate"
53+
EXTRA_APT: "xsel"
5654

5755
steps:
5856
- script: |

pandas/io/pytables.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1995,9 +1995,8 @@ def convert(self, values: np.ndarray, nan_rep, encoding: str, errors: str):
19951995
self.values = new_pd_index
19961996

19971997
def take_data(self):
1998-
""" return the values & release the memory """
1999-
self.values, values = None, self.values
2000-
return values
1998+
""" return the values"""
1999+
return self.values
20012000

20022001
@property
20032002
def attrs(self):
@@ -2250,9 +2249,8 @@ def set_data(self, data: Union[np.ndarray, ABCExtensionArray]):
22502249
self.kind = _dtype_to_kind(dtype_name)
22512250

22522251
def take_data(self):
2253-
""" return the data & release the memory """
2254-
self.data, data = None, self.data
2255-
return data
2252+
""" return the data """
2253+
return self.data
22562254

22572255
@classmethod
22582256
def _get_atom(cls, values: Union[np.ndarray, ABCExtensionArray]) -> "Col":

pandas/tests/frame/test_axis_select_reindex.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -929,6 +929,14 @@ def test_filter_corner(self):
929929
result = empty.filter(like="foo")
930930
tm.assert_frame_equal(result, empty)
931931

932+
def test_filter_regex_non_string(self):
933+
# GH#5798 trying to filter on non-string columns should drop,
934+
# not raise
935+
df = pd.DataFrame(np.random.random((3, 2)), columns=["STRING", 123])
936+
result = df.filter(regex="STRING")
937+
expected = df[["STRING"]]
938+
tm.assert_frame_equal(result, expected)
939+
932940
def test_take(self, float_frame):
933941
# homogeneous
934942
order = [3, 1, 2, 0]

pandas/tests/frame/test_constructors.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1726,10 +1726,16 @@ def test_constructor_with_datetimes(self):
17261726
tm.assert_frame_equal(df, expected)
17271727

17281728
def test_constructor_datetimes_with_nulls(self):
1729-
# gh-15869
1729+
# gh-15869, GH#11220
17301730
for arr in [
17311731
np.array([None, None, None, None, datetime.now(), None]),
17321732
np.array([None, None, datetime.now(), None]),
1733+
[[np.datetime64("NaT")], [None]],
1734+
[[np.datetime64("NaT")], [pd.NaT]],
1735+
[[None], [np.datetime64("NaT")]],
1736+
[[None], [pd.NaT]],
1737+
[[pd.NaT], [np.datetime64("NaT")]],
1738+
[[pd.NaT], [None]],
17331739
]:
17341740
result = DataFrame(arr).dtypes
17351741
expected = Series([np.dtype("datetime64[ns]")])

pandas/tests/frame/test_quantile.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@
77

88

99
class TestDataFrameQuantile:
10+
def test_quantile_sparse(self):
11+
# GH#17198
12+
s = pd.Series(pd.SparseArray([1, 2]))
13+
s1 = pd.Series(pd.SparseArray([3, 4]))
14+
df = pd.DataFrame({0: s, 1: s1})
15+
result = df.quantile()
16+
17+
expected = pd.Series([1.5, 3.5], name=0.5)
18+
tm.assert_series_equal(result, expected)
19+
1020
def test_quantile(self, datetime_frame):
1121
from numpy import percentile
1222

pandas/tests/frame/test_timeseries.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,14 @@ def test_first_last_valid(
609609
assert expected_first == df.first_valid_index()
610610
assert expected_last == df.last_valid_index()
611611

612+
@pytest.mark.parametrize("klass", [Series, DataFrame])
613+
def test_first_valid_index_all_nan(self, klass):
614+
# GH#9752 Series/DataFrame should both return None, not raise
615+
obj = klass([np.nan])
616+
617+
assert obj.first_valid_index() is None
618+
assert obj.iloc[:0].first_valid_index() is None
619+
612620
def test_first_subset(self):
613621
ts = tm.makeTimeDataFrame(freq="12h")
614622
result = ts.first("10d")

pandas/tests/indexes/multi/test_constructor.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,17 @@ def test_from_product_respects_none_names():
577577
tm.assert_index_equal(result, expected)
578578

579579

580+
def test_from_product_readonly():
581+
# GH#15286 passing read-only array to from_product
582+
a = np.array(range(3))
583+
b = ["a", "b"]
584+
expected = MultiIndex.from_product([a, b])
585+
586+
a.setflags(write=False)
587+
result = MultiIndex.from_product([a, b])
588+
tm.assert_index_equal(result, expected)
589+
590+
580591
def test_create_index_existing_name(idx):
581592

582593
# GH11193, when an existing index is passed, and a new name is not

pandas/tests/io/formats/test_format.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,6 +1106,15 @@ def test_truncate_with_different_dtypes(self):
11061106
assert "None" in result
11071107
assert "NaN" not in result
11081108

1109+
def test_truncate_with_different_dtypes_multiindex(self):
1110+
# GH#13000
1111+
df = DataFrame({"Vals": range(100)})
1112+
frame = pd.concat([df], keys=["Sweep"], names=["Sweep", "Index"])
1113+
result = repr(frame)
1114+
1115+
result2 = repr(frame.iloc[:5])
1116+
assert result.startswith(result2)
1117+
11091118
def test_datetimelike_frame(self):
11101119

11111120
# GH 12211

pandas/tests/series/test_missing.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,13 @@ def test_fillna_consistency(self):
473473
s2[1] = "foo"
474474
tm.assert_series_equal(s2, expected)
475475

476+
def test_where_sparse(self):
477+
# GH#17198 make sure we dont get an AttributeError for sp_index
478+
ser = pd.Series(pd.SparseArray([1, 2]))
479+
result = ser.where(ser >= 2, 0)
480+
expected = pd.Series(pd.SparseArray([0, 2]))
481+
tm.assert_series_equal(result, expected)
482+
476483
def test_datetime64tz_fillna_round_issue(self):
477484
# GH 14872
478485

pandas/tests/window/test_rolling.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,3 +418,11 @@ def test_rolling_window_as_string():
418418

419419
expected = Series(expData, index=Index(days, name="DateCol"), name="metric")
420420
tm.assert_series_equal(result, expected)
421+
422+
423+
def test_min_periods1():
424+
# GH#6795
425+
df = pd.DataFrame([0, 1, 2, 1, 0], columns=["a"])
426+
result = df["a"].rolling(3, center=True, min_periods=1).max()
427+
expected = pd.Series([1.0, 2.0, 2.0, 2.0, 1.0], name="a")
428+
tm.assert_series_equal(result, expected)

setup.py

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -545,12 +545,10 @@ def srcpath(name=None, suffix=".pyx", subdir="src"):
545545
return pjoin("pandas", subdir, name + suffix)
546546

547547

548-
common_include = ["pandas/_libs/src/klib", "pandas/_libs/src"]
549-
ts_include = ["pandas/_libs/tslibs/src", "pandas/_libs/tslibs"]
550-
551-
552548
lib_depends = ["pandas/_libs/src/parse_helper.h"]
553549

550+
klib_include = ["pandas/_libs/src/klib"]
551+
554552
np_datetime_headers = [
555553
"pandas/_libs/tslibs/src/datetime/np_datetime.h",
556554
"pandas/_libs/tslibs/src/datetime/np_datetime_strings.h",
@@ -564,36 +562,42 @@ def srcpath(name=None, suffix=".pyx", subdir="src"):
564562

565563

566564
ext_data = {
567-
"_libs.algos": {"pyxfile": "_libs/algos", "depends": _pxi_dep["algos"]},
565+
"_libs.algos": {
566+
"pyxfile": "_libs/algos",
567+
"include": klib_include,
568+
"depends": _pxi_dep["algos"],
569+
},
568570
"_libs.groupby": {"pyxfile": "_libs/groupby"},
569-
"_libs.hashing": {"pyxfile": "_libs/hashing", "include": [], "depends": []},
571+
"_libs.hashing": {"pyxfile": "_libs/hashing", "depends": []},
570572
"_libs.hashtable": {
571573
"pyxfile": "_libs/hashtable",
574+
"include": klib_include,
572575
"depends": (["pandas/_libs/src/klib/khash_python.h"] + _pxi_dep["hashtable"]),
573576
},
574577
"_libs.index": {
575578
"pyxfile": "_libs/index",
576-
"include": common_include + ts_include,
579+
"include": klib_include,
577580
"depends": _pxi_dep["index"],
578581
"sources": np_datetime_sources,
579582
},
580583
"_libs.indexing": {"pyxfile": "_libs/indexing"},
581584
"_libs.internals": {"pyxfile": "_libs/internals"},
582-
"_libs.interval": {"pyxfile": "_libs/interval", "depends": _pxi_dep["interval"]},
583-
"_libs.join": {"pyxfile": "_libs/join"},
585+
"_libs.interval": {
586+
"pyxfile": "_libs/interval",
587+
"include": klib_include,
588+
"depends": _pxi_dep["interval"],
589+
},
590+
"_libs.join": {"pyxfile": "_libs/join", "include": klib_include},
584591
"_libs.lib": {
585592
"pyxfile": "_libs/lib",
586-
"include": common_include + ts_include,
587593
"depends": lib_depends + tseries_depends,
594+
"include": klib_include, # due to tokenizer import
588595
"sources": ["pandas/_libs/src/parser/tokenizer.c"],
589596
},
590-
"_libs.missing": {
591-
"pyxfile": "_libs/missing",
592-
"include": common_include + ts_include,
593-
"depends": tseries_depends,
594-
},
597+
"_libs.missing": {"pyxfile": "_libs/missing", "depends": tseries_depends},
595598
"_libs.parsers": {
596599
"pyxfile": "_libs/parsers",
600+
"include": klib_include + ["pandas/_libs/src"],
597601
"depends": [
598602
"pandas/_libs/src/parser/tokenizer.h",
599603
"pandas/_libs/src/parser/io.h",
@@ -605,87 +609,76 @@ def srcpath(name=None, suffix=".pyx", subdir="src"):
605609
},
606610
"_libs.reduction": {"pyxfile": "_libs/reduction"},
607611
"_libs.ops": {"pyxfile": "_libs/ops"},
608-
"_libs.properties": {"pyxfile": "_libs/properties", "include": []},
612+
"_libs.properties": {"pyxfile": "_libs/properties"},
609613
"_libs.reshape": {"pyxfile": "_libs/reshape", "depends": []},
610614
"_libs.sparse": {"pyxfile": "_libs/sparse", "depends": _pxi_dep["sparse"]},
611615
"_libs.tslib": {
612616
"pyxfile": "_libs/tslib",
613-
"include": ts_include,
614617
"depends": tseries_depends,
615618
"sources": np_datetime_sources,
616619
},
617620
"_libs.tslibs.c_timestamp": {
618621
"pyxfile": "_libs/tslibs/c_timestamp",
619-
"include": ts_include,
620622
"depends": tseries_depends,
621623
"sources": np_datetime_sources,
622624
},
623-
"_libs.tslibs.ccalendar": {"pyxfile": "_libs/tslibs/ccalendar", "include": []},
625+
"_libs.tslibs.ccalendar": {"pyxfile": "_libs/tslibs/ccalendar"},
624626
"_libs.tslibs.conversion": {
625627
"pyxfile": "_libs/tslibs/conversion",
626-
"include": ts_include,
627628
"depends": tseries_depends,
628629
"sources": np_datetime_sources,
629630
},
630631
"_libs.tslibs.fields": {
631632
"pyxfile": "_libs/tslibs/fields",
632-
"include": ts_include,
633633
"depends": tseries_depends,
634634
"sources": np_datetime_sources,
635635
},
636-
"_libs.tslibs.frequencies": {"pyxfile": "_libs/tslibs/frequencies", "include": []},
637-
"_libs.tslibs.nattype": {"pyxfile": "_libs/tslibs/nattype", "include": []},
636+
"_libs.tslibs.frequencies": {"pyxfile": "_libs/tslibs/frequencies"},
637+
"_libs.tslibs.nattype": {"pyxfile": "_libs/tslibs/nattype"},
638638
"_libs.tslibs.np_datetime": {
639639
"pyxfile": "_libs/tslibs/np_datetime",
640-
"include": ts_include,
641640
"depends": np_datetime_headers,
642641
"sources": np_datetime_sources,
643642
},
644643
"_libs.tslibs.offsets": {
645644
"pyxfile": "_libs/tslibs/offsets",
646-
"include": ts_include,
647645
"depends": tseries_depends,
648646
"sources": np_datetime_sources,
649647
},
650648
"_libs.tslibs.parsing": {
651649
"pyxfile": "_libs/tslibs/parsing",
650+
"include": klib_include,
652651
"depends": ["pandas/_libs/src/parser/tokenizer.h"],
653652
"sources": ["pandas/_libs/src/parser/tokenizer.c"],
654653
},
655654
"_libs.tslibs.period": {
656655
"pyxfile": "_libs/tslibs/period",
657-
"include": ts_include,
658656
"depends": tseries_depends,
659657
"sources": np_datetime_sources,
660658
},
661659
"_libs.tslibs.resolution": {
662660
"pyxfile": "_libs/tslibs/resolution",
663-
"include": ts_include,
664661
"depends": tseries_depends,
665662
"sources": np_datetime_sources,
666663
},
667664
"_libs.tslibs.strptime": {
668665
"pyxfile": "_libs/tslibs/strptime",
669-
"include": ts_include,
670666
"depends": tseries_depends,
671667
"sources": np_datetime_sources,
672668
},
673669
"_libs.tslibs.timedeltas": {
674670
"pyxfile": "_libs/tslibs/timedeltas",
675-
"include": ts_include,
676671
"depends": np_datetime_headers,
677672
"sources": np_datetime_sources,
678673
},
679674
"_libs.tslibs.timestamps": {
680675
"pyxfile": "_libs/tslibs/timestamps",
681-
"include": ts_include,
682676
"depends": tseries_depends,
683677
"sources": np_datetime_sources,
684678
},
685-
"_libs.tslibs.timezones": {"pyxfile": "_libs/tslibs/timezones", "include": []},
679+
"_libs.tslibs.timezones": {"pyxfile": "_libs/tslibs/timezones"},
686680
"_libs.tslibs.tzconversion": {
687681
"pyxfile": "_libs/tslibs/tzconversion",
688-
"include": ts_include,
689682
"depends": tseries_depends,
690683
"sources": np_datetime_sources,
691684
},
@@ -709,7 +702,7 @@ def srcpath(name=None, suffix=".pyx", subdir="src"):
709702

710703
sources.extend(data.get("sources", []))
711704

712-
include = data.get("include", common_include)
705+
include = data.get("include")
713706

714707
obj = Extension(
715708
"pandas.{name}".format(name=name),

0 commit comments

Comments
 (0)