Skip to content

Commit 9b6cbfd

Browse files
authored
TYP: generic, series, frame (#36989)
1 parent 126f3cc commit 9b6cbfd

File tree

5 files changed

+31
-13
lines changed

5 files changed

+31
-13
lines changed

pandas/core/frame.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -9311,8 +9311,8 @@ def _AXIS_NAMES(self) -> Dict[int, str]:
93119311
ops.add_special_arithmetic_methods(DataFrame)
93129312

93139313

9314-
def _from_nested_dict(data):
9315-
new_data = collections.defaultdict(dict)
9314+
def _from_nested_dict(data) -> collections.defaultdict:
9315+
new_data: collections.defaultdict = collections.defaultdict(dict)
93169316
for index, s in data.items():
93179317
for col, v in s.items():
93189318
new_data[col][index] = v

pandas/core/generic.py

+13-5
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@
112112
if TYPE_CHECKING:
113113
from pandas._libs.tslibs import BaseOffset
114114

115+
from pandas.core.frame import DataFrame
115116
from pandas.core.resample import Resampler
116117
from pandas.core.series import Series
117118
from pandas.core.window.indexers import BaseIndexer
@@ -130,7 +131,7 @@
130131
)
131132

132133

133-
def _single_replace(self, to_replace, method, inplace, limit):
134+
def _single_replace(self: "Series", to_replace, method, inplace, limit):
134135
"""
135136
Replaces values in a Series using the fill method specified when no
136137
replacement value is given in the replace method
@@ -541,6 +542,7 @@ def _get_cleaned_column_resolvers(self) -> Dict[str, ABCSeries]:
541542
from pandas.core.computation.parsing import clean_column_name
542543

543544
if isinstance(self, ABCSeries):
545+
self = cast("Series", self)
544546
return {clean_column_name(self.name): self}
545547

546548
return {
@@ -1995,9 +1997,10 @@ def _repr_data_resource_(self):
19951997
"""
19961998
if config.get_option("display.html.table_schema"):
19971999
data = self.head(config.get_option("display.max_rows"))
1998-
payload = json.loads(
1999-
data.to_json(orient="table"), object_pairs_hook=collections.OrderedDict
2000-
)
2000+
2001+
as_json = data.to_json(orient="table")
2002+
as_json = cast(str, as_json)
2003+
payload = json.loads(as_json, object_pairs_hook=collections.OrderedDict)
20012004
return payload
20022005

20032006
# ----------------------------------------------------------------------
@@ -3113,6 +3116,7 @@ def to_latex(
31133116
if multirow is None:
31143117
multirow = config.get_option("display.latex.multirow")
31153118

3119+
self = cast("DataFrame", self)
31163120
formatter = DataFrameFormatter(
31173121
self,
31183122
columns=columns,
@@ -3830,7 +3834,7 @@ def _check_setitem_copy(self, stacklevel=4, t="setting", force=False):
38303834
# the copy weakref
38313835
if self._is_copy is not None and not isinstance(self._is_copy, str):
38323836
r = self._is_copy()
3833-
if not gc.get_referents(r) or r.shape == self.shape:
3837+
if not gc.get_referents(r) or (r is not None and r.shape == self.shape):
38343838
self._is_copy = None
38353839
return
38363840

@@ -6684,6 +6688,7 @@ def replace(
66846688
return self.apply(
66856689
_single_replace, args=(to_replace, method, inplace, limit)
66866690
)
6691+
self = cast("Series", self)
66876692
return _single_replace(self, to_replace, method, inplace, limit)
66886693

66896694
if not is_dict_like(to_replace):
@@ -7265,10 +7270,13 @@ def asof(self, where, subset=None):
72657270
nulls = self.isna() if is_series else self[subset].isna().any(1)
72667271
if nulls.all():
72677272
if is_series:
7273+
self = cast("Series", self)
72687274
return self._constructor(np.nan, index=where, name=self.name)
72697275
elif is_list:
7276+
self = cast("DataFrame", self)
72707277
return self._constructor(np.nan, index=where, columns=self.columns)
72717278
else:
7279+
self = cast("DataFrame", self)
72727280
return self._constructor_sliced(
72737281
np.nan, index=self.columns, name=where[0]
72747282
)

pandas/core/series.py

+8-3
Original file line numberDiff line numberDiff line change
@@ -1789,12 +1789,17 @@ def count(self, level=None):
17891789
"""
17901790
if level is None:
17911791
return notna(self.array).sum()
1792+
elif not isinstance(self.index, MultiIndex):
1793+
raise ValueError("Series.count level is only valid with a MultiIndex")
1794+
1795+
index = self.index
1796+
assert isinstance(index, MultiIndex) # for mypy
17921797

17931798
if isinstance(level, str):
1794-
level = self.index._get_level_number(level)
1799+
level = index._get_level_number(level)
17951800

1796-
lev = self.index.levels[level]
1797-
level_codes = np.array(self.index.codes[level], subok=False, copy=True)
1801+
lev = index.levels[level]
1802+
level_codes = np.array(index.codes[level], subok=False, copy=True)
17981803

17991804
mask = level_codes == -1
18001805
if mask.any():

pandas/tests/series/methods/test_count.py

+8
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
import numpy as np
2+
import pytest
23

34
import pandas as pd
45
from pandas import Categorical, MultiIndex, Series
56
import pandas._testing as tm
67

78

89
class TestSeriesCount:
10+
def test_count_level_without_multiindex(self):
11+
ser = pd.Series(range(3))
12+
13+
msg = "Series.count level is only valid with a MultiIndex"
14+
with pytest.raises(ValueError, match=msg):
15+
ser.count(level=1)
16+
917
def test_count(self, datetime_series):
1018
assert datetime_series.count() == len(datetime_series)
1119

setup.cfg

-3
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,6 @@ check_untyped_defs=False
205205
[mypy-pandas.core.reshape.merge]
206206
check_untyped_defs=False
207207

208-
[mypy-pandas.core.series]
209-
check_untyped_defs=False
210-
211208
[mypy-pandas.core.window.common]
212209
check_untyped_defs=False
213210

0 commit comments

Comments
 (0)