Skip to content

Commit 7388996

Browse files
committed
Type: .index/.columns
1 parent 774498b commit 7388996

File tree

5 files changed

+47
-18
lines changed

5 files changed

+47
-18
lines changed

pandas/core/frame.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
from pandas._config import get_option
4040

41-
from pandas._libs import algos as libalgos, lib
41+
from pandas._libs import algos as libalgos, lib, properties
4242
from pandas._typing import Axes, Axis, Dtype, FilePathOrBuffer, Level, Renamer
4343
from pandas.compat import PY37
4444
from pandas.compat._optional import import_optional_dependency
@@ -91,8 +91,10 @@
9191
)
9292
from pandas.core.dtypes.generic import (
9393
ABCDataFrame,
94+
ABCDatetimeIndex,
9495
ABCIndexClass,
9596
ABCMultiIndex,
97+
ABCPeriodIndex,
9698
ABCSeries,
9799
)
98100
from pandas.core.dtypes.missing import isna, notna
@@ -5291,8 +5293,10 @@ def swaplevel(self, i=-2, j=-1, axis=0) -> "DataFrame":
52915293

52925294
axis = self._get_axis_number(axis)
52935295
if axis == 0:
5296+
assert isinstance(result.index, ABCMultiIndex)
52945297
result.index = result.index.swaplevel(i, j)
52955298
else:
5299+
assert isinstance(result.columns, ABCMultiIndex)
52965300
result.columns = result.columns.swaplevel(i, j)
52975301
return result
52985302

@@ -5319,8 +5323,10 @@ def reorder_levels(self, order, axis=0) -> "DataFrame":
53195323
result = self.copy()
53205324

53215325
if axis == 0:
5326+
assert isinstance(result.index, ABCMultiIndex)
53225327
result.index = result.index.reorder_levels(order)
53235328
else:
5329+
assert isinstance(result.columns, ABCMultiIndex)
53245330
result.columns = result.columns.reorder_levels(order)
53255331
return result
53265332

@@ -8344,8 +8350,10 @@ def to_timestamp(self, freq=None, how="start", axis=0, copy=True) -> "DataFrame"
83448350

83458351
axis = self._get_axis_number(axis)
83468352
if axis == 0:
8353+
assert isinstance(self.index, (ABCDatetimeIndex, ABCPeriodIndex))
83478354
new_data.set_axis(1, self.index.to_timestamp(freq=freq, how=how))
83488355
elif axis == 1:
8356+
assert isinstance(self.columns, (ABCDatetimeIndex, ABCPeriodIndex))
83498357
new_data.set_axis(0, self.columns.to_timestamp(freq=freq, how=how))
83508358
else: # pragma: no cover
83518359
raise AssertionError(f"Axis must be 0 or 1. Got {axis}")
@@ -8378,8 +8386,10 @@ def to_period(self, freq=None, axis=0, copy=True) -> "DataFrame":
83788386

83798387
axis = self._get_axis_number(axis)
83808388
if axis == 0:
8389+
assert isinstance(self.index, ABCDatetimeIndex)
83818390
new_data.set_axis(1, self.index.to_period(freq=freq))
83828391
elif axis == 1:
8392+
assert isinstance(self.columns, ABCDatetimeIndex)
83838393
new_data.set_axis(0, self.columns.to_period(freq=freq))
83848394
else: # pragma: no cover
83858395
raise AssertionError(f"Axis must be 0 or 1. Got {axis}")
@@ -8482,6 +8492,17 @@ def isin(self, values) -> "DataFrame":
84828492
self.columns,
84838493
)
84848494

8495+
# ----------------------------------------------------------------------
8496+
# Add index and columns
8497+
index: "Index" = properties.AxisProperty(
8498+
axis=1, doc="The index (row labels) of the DataFrame."
8499+
)
8500+
NDFrame._internal_names_set.add("index")
8501+
columns: "Index" = properties.AxisProperty(
8502+
axis=0, doc="The column labels of the DataFrame."
8503+
)
8504+
NDFrame._internal_names_set.add("columns")
8505+
84858506
# ----------------------------------------------------------------------
84868507
# Add plotting methods to DataFrame
84878508
plot = CachedAccessor("plot", pandas.plotting.PlotAccessor)

pandas/core/generic.py

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
from pandas._config import config
3232

33-
from pandas._libs import Timestamp, iNaT, lib, properties
33+
from pandas._libs import Timestamp, iNaT, lib
3434
from pandas._typing import (
3535
Axis,
3636
Dtype,
@@ -333,18 +333,6 @@ def _setup_axes(cls, axes: List[str], docs: Dict[str, str]) -> None:
333333
cls._info_axis_number = info_axis
334334
cls._info_axis_name = axes[info_axis]
335335

336-
# setup the actual axis
337-
def set_axis(a, i):
338-
setattr(cls, a, properties.AxisProperty(i, docs.get(a, a)))
339-
cls._internal_names_set.add(a)
340-
341-
if axes_are_reversed:
342-
for i, a in cls._AXIS_NAMES.items():
343-
set_axis(a, 1 - i)
344-
else:
345-
for i, a in cls._AXIS_NAMES.items():
346-
set_axis(a, i)
347-
348336
def _construct_axes_dict(self, axes=None, **kwargs):
349337
"""Return an axes dictionary for myself."""
350338
d = {a: self._get_axis(a) for a in (axes or self._AXIS_ORDERS)}
@@ -5083,6 +5071,7 @@ def __finalize__(
50835071
self.attrs[name] = other.attrs[name]
50845072
# For subclasses using _metadata.
50855073
for name in self._metadata:
5074+
assert isinstance(name, str)
50865075
object.__setattr__(self, name, getattr(other, name, None))
50875076
return self
50885077

pandas/core/reshape/pivot.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,13 +134,13 @@ def pivot_table(
134134
table = agged.unstack(to_unstack)
135135

136136
if not dropna:
137-
if table.index.nlevels > 1:
137+
if isinstance(table.index, MultiIndex):
138138
m = MultiIndex.from_arrays(
139139
cartesian_product(table.index.levels), names=table.index.names
140140
)
141141
table = table.reindex(m, axis=0)
142142

143-
if table.columns.nlevels > 1:
143+
if isinstance(table.columns, MultiIndex):
144144
m = MultiIndex.from_arrays(
145145
cartesian_product(table.columns.levels), names=table.columns.names
146146
)
@@ -373,7 +373,7 @@ def _generate_marginal_results_without_values(
373373
):
374374
if len(cols) > 0:
375375
# need to "interleave" the margins
376-
margin_keys = []
376+
margin_keys: Union[List, Index] = []
377377

378378
def _all_key():
379379
if len(cols) == 1:

pandas/core/series.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
from pandas._config import get_option
2424

25-
from pandas._libs import index as libindex, lib, reshape, tslibs
25+
from pandas._libs import index as libindex, lib, properties, reshape, tslibs
2626
from pandas._typing import Label
2727
from pandas.compat.numpy import function as nv
2828
from pandas.util._decorators import Appender, Substitution
@@ -46,6 +46,8 @@
4646
from pandas.core.dtypes.generic import (
4747
ABCDataFrame,
4848
ABCDatetimeIndex,
49+
ABCMultiIndex,
50+
ABCPeriodIndex,
4951
ABCSeries,
5052
ABCSparseArray,
5153
)
@@ -3347,6 +3349,7 @@ def swaplevel(self, i=-2, j=-1, copy=True) -> "Series":
33473349
Series
33483350
Series with levels swapped in MultiIndex.
33493351
"""
3352+
assert isinstance(self.index, ABCMultiIndex)
33503353
new_index = self.index.swaplevel(i, j)
33513354
return self._constructor(self._values, index=new_index, copy=copy).__finalize__(
33523355
self
@@ -3371,6 +3374,7 @@ def reorder_levels(self, order) -> "Series":
33713374
raise Exception("Can only reorder levels on a hierarchical axis.")
33723375

33733376
result = self.copy()
3377+
assert isinstance(result.index, ABCMultiIndex)
33743378
result.index = result.index.reorder_levels(order)
33753379
return result
33763380

@@ -4448,6 +4452,7 @@ def to_timestamp(self, freq=None, how="start", copy=True) -> "Series":
44484452
if copy:
44494453
new_values = new_values.copy()
44504454

4455+
assert isinstance(self.index, (ABCDatetimeIndex, ABCPeriodIndex))
44514456
new_index = self.index.to_timestamp(freq=freq, how=how)
44524457
return self._constructor(new_values, index=new_index).__finalize__(self)
44534458

@@ -4472,9 +4477,17 @@ def to_period(self, freq=None, copy=True) -> "Series":
44724477
if copy:
44734478
new_values = new_values.copy()
44744479

4480+
assert isinstance(self.index, ABCDatetimeIndex)
44754481
new_index = self.index.to_period(freq=freq)
44764482
return self._constructor(new_values, index=new_index).__finalize__(self)
44774483

4484+
# ----------------------------------------------------------------------
4485+
# Add index and columns
4486+
index: "Index" = properties.AxisProperty(
4487+
axis=0, doc="The index (axis labels) of the Series."
4488+
)
4489+
generic.NDFrame._internal_names_set.add("index")
4490+
44784491
# ----------------------------------------------------------------------
44794492
# Accessor Methods
44804493
# ----------------------------------------------------------------------

pandas/io/formats/format.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,13 @@
5757
is_timedelta64_dtype,
5858
)
5959
from pandas.core.dtypes.generic import (
60+
ABCDatetimeIndex,
6061
ABCIndexClass,
6162
ABCMultiIndex,
63+
ABCPeriodIndex,
6264
ABCSeries,
6365
ABCSparseArray,
66+
ABCTimedeltaIndex,
6467
)
6568
from pandas.core.dtypes.missing import isna, notna
6669

@@ -295,6 +298,9 @@ def _get_footer(self) -> str:
295298
footer = ""
296299

297300
if getattr(self.series.index, "freq", None) is not None:
301+
assert isinstance(
302+
self.series.index, (ABCDatetimeIndex, ABCPeriodIndex, ABCTimedeltaIndex)
303+
)
298304
footer += "Freq: {freq}".format(freq=self.series.index.freqstr)
299305

300306
if self.name is not False and name is not None:

0 commit comments

Comments
 (0)