Skip to content

Commit 0447667

Browse files
committed
Type: .index/.columns
1 parent 22fe19c commit 0447667

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
@@ -37,7 +37,7 @@
3737

3838
from pandas._config import get_option
3939

40-
from pandas._libs import algos as libalgos, lib
40+
from pandas._libs import algos as libalgos, lib, properties
4141
from pandas._typing import Axes, Axis, Dtype, FilePathOrBuffer, Level, Renamer
4242
from pandas.compat import PY37
4343
from pandas.compat._optional import import_optional_dependency
@@ -90,8 +90,10 @@
9090
)
9191
from pandas.core.dtypes.generic import (
9292
ABCDataFrame,
93+
ABCDatetimeIndex,
9394
ABCIndexClass,
9495
ABCMultiIndex,
96+
ABCPeriodIndex,
9597
ABCSeries,
9698
)
9799
from pandas.core.dtypes.missing import isna, notna
@@ -5272,8 +5274,10 @@ def swaplevel(self, i=-2, j=-1, axis=0) -> "DataFrame":
52725274

52735275
axis = self._get_axis_number(axis)
52745276
if axis == 0:
5277+
assert isinstance(result.index, ABCMultiIndex)
52755278
result.index = result.index.swaplevel(i, j)
52765279
else:
5280+
assert isinstance(result.columns, ABCMultiIndex)
52775281
result.columns = result.columns.swaplevel(i, j)
52785282
return result
52795283

@@ -5300,8 +5304,10 @@ def reorder_levels(self, order, axis=0) -> "DataFrame":
53005304
result = self.copy()
53015305

53025306
if axis == 0:
5307+
assert isinstance(result.index, ABCMultiIndex)
53035308
result.index = result.index.reorder_levels(order)
53045309
else:
5310+
assert isinstance(result.columns, ABCMultiIndex)
53055311
result.columns = result.columns.reorder_levels(order)
53065312
return result
53075313

@@ -8327,8 +8333,10 @@ def to_timestamp(self, freq=None, how="start", axis=0, copy=True) -> "DataFrame"
83278333

83288334
axis = self._get_axis_number(axis)
83298335
if axis == 0:
8336+
assert isinstance(self.index, (ABCDatetimeIndex, ABCPeriodIndex))
83308337
new_data.set_axis(1, self.index.to_timestamp(freq=freq, how=how))
83318338
elif axis == 1:
8339+
assert isinstance(self.columns, (ABCDatetimeIndex, ABCPeriodIndex))
83328340
new_data.set_axis(0, self.columns.to_timestamp(freq=freq, how=how))
83338341
else: # pragma: no cover
83348342
raise AssertionError(f"Axis must be 0 or 1. Got {axis}")
@@ -8361,8 +8369,10 @@ def to_period(self, freq=None, axis=0, copy=True) -> "DataFrame":
83618369

83628370
axis = self._get_axis_number(axis)
83638371
if axis == 0:
8372+
assert isinstance(self.index, ABCDatetimeIndex)
83648373
new_data.set_axis(1, self.index.to_period(freq=freq))
83658374
elif axis == 1:
8375+
assert isinstance(self.columns, ABCDatetimeIndex)
83668376
new_data.set_axis(0, self.columns.to_period(freq=freq))
83678377
else: # pragma: no cover
83688378
raise AssertionError(f"Axis must be 0 or 1. Got {axis}")
@@ -8466,6 +8476,17 @@ def isin(self, values) -> "DataFrame":
84668476
self.columns,
84678477
)
84688478

8479+
# ----------------------------------------------------------------------
8480+
# Add index and columns
8481+
index: "Index" = properties.AxisProperty(
8482+
axis=1, doc="The index (row labels) of the DataFrame."
8483+
)
8484+
NDFrame._internal_names_set.add("index")
8485+
columns: "Index" = properties.AxisProperty(
8486+
axis=0, doc="The column labels of the DataFrame."
8487+
)
8488+
NDFrame._internal_names_set.add("columns")
8489+
84698490
# ----------------------------------------------------------------------
84708491
# Add plotting methods to DataFrame
84718492
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)}
@@ -5142,6 +5130,7 @@ def __finalize__(
51425130
self.attrs[name] = other.attrs[name]
51435131
# For subclasses using _metadata.
51445132
for name in self._metadata:
5133+
assert isinstance(name, str)
51455134
object.__setattr__(self, name, getattr(other, name, None))
51465135
return self
51475136

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
)
@@ -379,7 +379,7 @@ def _generate_marginal_results_without_values(
379379
):
380380
if len(cols) > 0:
381381
# need to "interleave" the margins
382-
margin_keys = []
382+
margin_keys: Union[List, Index] = []
383383

384384
def _all_key():
385385
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
)
@@ -3386,6 +3388,7 @@ def swaplevel(self, i=-2, j=-1, copy=True) -> "Series":
33863388
Series
33873389
Series with levels swapped in MultiIndex.
33883390
"""
3391+
assert isinstance(self.index, ABCMultiIndex)
33893392
new_index = self.index.swaplevel(i, j)
33903393
return self._constructor(self._values, index=new_index, copy=copy).__finalize__(
33913394
self
@@ -3410,6 +3413,7 @@ def reorder_levels(self, order) -> "Series":
34103413
raise Exception("Can only reorder levels on a hierarchical axis.")
34113414

34123415
result = self.copy()
3416+
assert isinstance(result.index, ABCMultiIndex)
34133417
result.index = result.index.reorder_levels(order)
34143418
return result
34153419

@@ -4461,6 +4465,7 @@ def to_timestamp(self, freq=None, how="start", copy=True) -> "Series":
44614465
if copy:
44624466
new_values = new_values.copy()
44634467

4468+
assert isinstance(self.index, (ABCDatetimeIndex, ABCPeriodIndex))
44644469
new_index = self.index.to_timestamp(freq=freq, how=how)
44654470
return self._constructor(new_values, index=new_index).__finalize__(self)
44664471

@@ -4485,9 +4490,17 @@ def to_period(self, freq=None, copy=True) -> "Series":
44854490
if copy:
44864491
new_values = new_values.copy()
44874492

4493+
assert isinstance(self.index, ABCDatetimeIndex)
44884494
new_index = self.index.to_period(freq=freq)
44894495
return self._constructor(new_values, index=new_index).__finalize__(self)
44904496

4497+
# ----------------------------------------------------------------------
4498+
# Add index and columns
4499+
index: "Index" = properties.AxisProperty(
4500+
axis=0, doc="The index (axis labels) of the Series."
4501+
)
4502+
generic.NDFrame._internal_names_set.add("index")
4503+
44914504
# ----------------------------------------------------------------------
44924505
# Accessor Methods
44934506
# ----------------------------------------------------------------------

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)