13
13
Sequence ,
14
14
Tuple ,
15
15
Union ,
16
+ cast ,
16
17
)
17
18
import warnings
18
19
71
72
)
72
73
73
74
if TYPE_CHECKING :
74
- from pandas import Series
75
+ from pandas import CategoricalIndex , Series
75
76
76
77
_index_doc_kwargs = dict (ibase ._index_doc_kwargs )
77
78
_index_doc_kwargs .update (
@@ -478,7 +479,7 @@ def from_tuples(
478
479
tuples ,
479
480
sortorder : Optional [int ] = None ,
480
481
names : Optional [Sequence [Hashable ]] = None ,
481
- ):
482
+ ) -> MultiIndex :
482
483
"""
483
484
Convert list of tuples to MultiIndex.
484
485
@@ -537,7 +538,9 @@ def from_tuples(
537
538
return cls .from_arrays (arrays , sortorder = sortorder , names = names )
538
539
539
540
@classmethod
540
- def from_product (cls , iterables , sortorder = None , names = lib .no_default ):
541
+ def from_product (
542
+ cls , iterables , sortorder = None , names = lib .no_default
543
+ ) -> MultiIndex :
541
544
"""
542
545
Make a MultiIndex from the cartesian product of multiple iterables.
543
546
@@ -596,7 +599,7 @@ def from_product(cls, iterables, sortorder=None, names=lib.no_default):
596
599
return cls (levels , codes , sortorder = sortorder , names = names )
597
600
598
601
@classmethod
599
- def from_frame (cls , df , sortorder = None , names = None ):
602
+ def from_frame (cls , df , sortorder = None , names = None ) -> MultiIndex :
600
603
"""
601
604
Make a MultiIndex from a DataFrame.
602
605
@@ -664,14 +667,15 @@ def from_frame(cls, df, sortorder=None, names=None):
664
667
# --------------------------------------------------------------------
665
668
666
669
@cache_readonly
667
- def _values (self ):
670
+ def _values (self ) -> np . ndarray :
668
671
# We override here, since our parent uses _data, which we don't use.
669
672
values = []
670
673
671
674
for i in range (self .nlevels ):
672
675
vals = self ._get_level_values (i )
673
676
if is_categorical_dtype (vals .dtype ):
674
- vals = vals ._internal_get_values ()
677
+ vals = cast ("CategoricalIndex" , vals )
678
+ vals = vals ._data ._internal_get_values ()
675
679
if isinstance (vals .dtype , ExtensionDtype ) or isinstance (
676
680
vals , (ABCDatetimeIndex , ABCTimedeltaIndex )
677
681
):
@@ -683,7 +687,7 @@ def _values(self):
683
687
return arr
684
688
685
689
@property
686
- def values (self ):
690
+ def values (self ) -> np . ndarray :
687
691
return self ._values
688
692
689
693
@property
@@ -782,7 +786,9 @@ def _set_levels(
782
786
783
787
self ._reset_cache ()
784
788
785
- def set_levels (self , levels , level = None , inplace = None , verify_integrity = True ):
789
+ def set_levels (
790
+ self , levels , level = None , inplace = None , verify_integrity : bool = True
791
+ ):
786
792
"""
787
793
Set new levels on MultiIndex. Defaults to returning new index.
788
794
@@ -909,7 +915,7 @@ def nlevels(self) -> int:
909
915
return len (self ._levels )
910
916
911
917
@property
912
- def levshape (self ):
918
+ def levshape (self ) -> Shape :
913
919
"""
914
920
A tuple with the length of each level.
915
921
@@ -967,7 +973,7 @@ def _set_codes(
967
973
968
974
self ._reset_cache ()
969
975
970
- def set_codes (self , codes , level = None , inplace = None , verify_integrity = True ):
976
+ def set_codes (self , codes , level = None , inplace = None , verify_integrity : bool = True ):
971
977
"""
972
978
Set new codes on MultiIndex. Defaults to returning new index.
973
979
@@ -985,7 +991,7 @@ def set_codes(self, codes, level=None, inplace=None, verify_integrity=True):
985
991
If True, mutates in place.
986
992
987
993
.. deprecated:: 1.2.0
988
- verify_integrity : bool ( default True)
994
+ verify_integrity : bool, default True
989
995
If True, checks that levels and codes are compatible.
990
996
991
997
Returns
@@ -1080,12 +1086,12 @@ def _constructor(self):
1080
1086
return type (self ).from_tuples
1081
1087
1082
1088
@doc (Index ._shallow_copy )
1083
- def _shallow_copy (self , values , name = lib .no_default ):
1089
+ def _shallow_copy (self , values : np . ndarray , name = lib .no_default ) -> MultiIndex :
1084
1090
names = name if name is not lib .no_default else self .names
1085
1091
1086
1092
return type (self ).from_tuples (values , sortorder = None , names = names )
1087
1093
1088
- def _view (self : MultiIndex ) -> MultiIndex :
1094
+ def _view (self ) -> MultiIndex :
1089
1095
result = type (self )(
1090
1096
levels = self .levels ,
1091
1097
codes = self .codes ,
@@ -1580,7 +1586,7 @@ def is_monotonic_decreasing(self) -> bool:
1580
1586
return self [::- 1 ].is_monotonic_increasing
1581
1587
1582
1588
@cache_readonly
1583
- def _inferred_type_levels (self ):
1589
+ def _inferred_type_levels (self ) -> List [ str ] :
1584
1590
""" return a list of the inferred types, one for each level """
1585
1591
return [i .inferred_type for i in self .levels ]
1586
1592
@@ -1598,7 +1604,7 @@ def fillna(self, value=None, downcast=None):
1598
1604
raise NotImplementedError ("isna is not defined for MultiIndex" )
1599
1605
1600
1606
@doc (Index .dropna )
1601
- def dropna (self , how = "any" ):
1607
+ def dropna (self , how : str = "any" ) -> MultiIndex :
1602
1608
nans = [level_codes == - 1 for level_codes in self .codes ]
1603
1609
if how == "any" :
1604
1610
indexer = np .any (nans , axis = 0 )
@@ -1610,7 +1616,7 @@ def dropna(self, how="any"):
1610
1616
new_codes = [level_codes [~ indexer ] for level_codes in self .codes ]
1611
1617
return self .set_codes (codes = new_codes )
1612
1618
1613
- def _get_level_values (self , level , unique = False ):
1619
+ def _get_level_values (self , level : int , unique : bool = False ) -> Index :
1614
1620
"""
1615
1621
Return vector of label values for requested level,
1616
1622
equal to the length of the index
@@ -1619,13 +1625,13 @@ def _get_level_values(self, level, unique=False):
1619
1625
1620
1626
Parameters
1621
1627
----------
1622
- level : int level
1628
+ level : int
1623
1629
unique : bool, default False
1624
1630
if True, drop duplicated values
1625
1631
1626
1632
Returns
1627
1633
-------
1628
- values : ndarray
1634
+ Index
1629
1635
"""
1630
1636
lev = self .levels [level ]
1631
1637
level_codes = self .codes [level ]
@@ -1759,7 +1765,7 @@ def to_frame(self, index=True, name=None):
1759
1765
result .index = self
1760
1766
return result
1761
1767
1762
- def to_flat_index (self ):
1768
+ def to_flat_index (self ) -> Index :
1763
1769
"""
1764
1770
Convert a MultiIndex to an Index of Tuples containing the level values.
1765
1771
@@ -1862,7 +1868,7 @@ def _lexsort_depth(self) -> int:
1862
1868
return self .sortorder
1863
1869
return _lexsort_depth (self .codes , self .nlevels )
1864
1870
1865
- def _sort_levels_monotonic (self ):
1871
+ def _sort_levels_monotonic (self ) -> MultiIndex :
1866
1872
"""
1867
1873
This is an *internal* function.
1868
1874
@@ -1929,7 +1935,7 @@ def _sort_levels_monotonic(self):
1929
1935
verify_integrity = False ,
1930
1936
)
1931
1937
1932
- def remove_unused_levels (self ):
1938
+ def remove_unused_levels (self ) -> MultiIndex :
1933
1939
"""
1934
1940
Create new MultiIndex from current that removes unused levels.
1935
1941
@@ -2065,7 +2071,9 @@ def __getitem__(self, key):
2065
2071
)
2066
2072
2067
2073
@Appender (_index_shared_docs ["take" ] % _index_doc_kwargs )
2068
- def take (self , indices , axis = 0 , allow_fill = True , fill_value = None , ** kwargs ):
2074
+ def take (
2075
+ self : MultiIndex , indices , axis = 0 , allow_fill = True , fill_value = None , ** kwargs
2076
+ ) -> MultiIndex :
2069
2077
nv .validate_take ((), kwargs )
2070
2078
indices = ensure_platform_int (indices )
2071
2079
@@ -2129,7 +2137,7 @@ def argsort(self, *args, **kwargs) -> np.ndarray:
2129
2137
return self ._values .argsort (* args , ** kwargs )
2130
2138
2131
2139
@Appender (_index_shared_docs ["repeat" ] % _index_doc_kwargs )
2132
- def repeat (self , repeats , axis = None ):
2140
+ def repeat (self , repeats : int , axis = None ) -> MultiIndex :
2133
2141
nv .validate_repeat ((), {"axis" : axis })
2134
2142
repeats = ensure_platform_int (repeats )
2135
2143
return MultiIndex (
@@ -2200,7 +2208,7 @@ def drop(self, codes, level=None, errors="raise"):
2200
2208
2201
2209
return self .delete (inds )
2202
2210
2203
- def _drop_from_level (self , codes , level , errors = "raise" ):
2211
+ def _drop_from_level (self , codes , level , errors = "raise" ) -> MultiIndex :
2204
2212
codes = com .index_labels_to_array (codes )
2205
2213
i = self ._get_level_number (level )
2206
2214
index = self .levels [i ]
@@ -2219,7 +2227,7 @@ def _drop_from_level(self, codes, level, errors="raise"):
2219
2227
2220
2228
return self [mask ]
2221
2229
2222
- def swaplevel (self , i = - 2 , j = - 1 ):
2230
+ def swaplevel (self , i = - 2 , j = - 1 ) -> MultiIndex :
2223
2231
"""
2224
2232
Swap level i with level j.
2225
2233
@@ -2277,7 +2285,7 @@ def swaplevel(self, i=-2, j=-1):
2277
2285
levels = new_levels , codes = new_codes , names = new_names , verify_integrity = False
2278
2286
)
2279
2287
2280
- def reorder_levels (self , order ):
2288
+ def reorder_levels (self , order ) -> MultiIndex :
2281
2289
"""
2282
2290
Rearrange levels using input order. May not drop or duplicate levels.
2283
2291
@@ -2323,7 +2331,7 @@ def reorder_levels(self, order):
2323
2331
levels = new_levels , codes = new_codes , names = new_names , verify_integrity = False
2324
2332
)
2325
2333
2326
- def _get_codes_for_sorting (self ):
2334
+ def _get_codes_for_sorting (self ) -> List [ Categorical ] :
2327
2335
"""
2328
2336
we are categorizing our codes by using the
2329
2337
available categories (all, not just observed)
@@ -2343,7 +2351,9 @@ def cats(level_codes):
2343
2351
for level_codes in self .codes
2344
2352
]
2345
2353
2346
- def sortlevel (self , level = 0 , ascending = True , sort_remaining = True ):
2354
+ def sortlevel (
2355
+ self , level = 0 , ascending : bool = True , sort_remaining : bool = True
2356
+ ) -> Tuple [MultiIndex , np .ndarray ]:
2347
2357
"""
2348
2358
Sort MultiIndex at the requested level.
2349
2359
@@ -3396,7 +3406,7 @@ def _reorder_indexer(
3396
3406
ind = np .lexsort (keys )
3397
3407
return indexer [ind ]
3398
3408
3399
- def truncate (self , before = None , after = None ):
3409
+ def truncate (self , before = None , after = None ) -> MultiIndex :
3400
3410
"""
3401
3411
Slice index between two labels / tuples, return new MultiIndex
3402
3412
@@ -3517,7 +3527,7 @@ def _union(self, other, sort):
3517
3527
def _is_comparable_dtype (self , dtype : DtypeObj ) -> bool :
3518
3528
return is_object_dtype (dtype )
3519
3529
3520
- def _get_reconciled_name_object (self , other ):
3530
+ def _get_reconciled_name_object (self , other ) -> MultiIndex :
3521
3531
"""
3522
3532
If the result of a set operation will be self,
3523
3533
return self, unless the names change, in which
@@ -3662,7 +3672,7 @@ def _validate_fill_value(self, item):
3662
3672
raise ValueError ("Item must have length equal to number of levels." )
3663
3673
return item
3664
3674
3665
- def insert (self , loc : int , item ):
3675
+ def insert (self , loc : int , item ) -> MultiIndex :
3666
3676
"""
3667
3677
Make new MultiIndex inserting new item at location
3668
3678
@@ -3702,7 +3712,7 @@ def insert(self, loc: int, item):
3702
3712
levels = new_levels , codes = new_codes , names = self .names , verify_integrity = False
3703
3713
)
3704
3714
3705
- def delete (self , loc ):
3715
+ def delete (self , loc ) -> MultiIndex :
3706
3716
"""
3707
3717
Make new index with passed location deleted
3708
3718
@@ -3719,7 +3729,7 @@ def delete(self, loc):
3719
3729
)
3720
3730
3721
3731
@doc (Index .isin )
3722
- def isin (self , values , level = None ):
3732
+ def isin (self , values , level = None ) -> np . ndarray :
3723
3733
if level is None :
3724
3734
values = MultiIndex .from_tuples (values , names = self .names )._values
3725
3735
return algos .isin (self ._values , values )
@@ -3800,7 +3810,7 @@ def _get_na_rep(dtype) -> str:
3800
3810
return {np .datetime64 : "NaT" , np .timedelta64 : "NaT" }.get (dtype , "NaN" )
3801
3811
3802
3812
3803
- def maybe_droplevels (index , key ):
3813
+ def maybe_droplevels (index : Index , key ) -> Index :
3804
3814
"""
3805
3815
Attempt to drop level or levels from the given index.
3806
3816
0 commit comments