
    >ied4                    $   d dl mZ d dlZd dlmZ d dlmZ d dlZd dlZ	d dl
mZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZmZmZ d dlmZ d dlmZ  G d d          Z G d de          Z  G d de          Z!d Z"d Z#d Z$d Z%dS )    )annotationsN)defaultdict)datetime)is_bool_dtype)Array)tokenize)methods)IndexingError)Seriesnew_dd_object)is_index_likeis_series_likemeta_nonempty)HighLevelGraph)is_arraylikec                  L    e Zd Zd Zed             Zed             Zd Zd ZdS )_IndexerBasec                    || _         d S N)obj)selfr   s     7lib/python3.11/site-packages/dask/dataframe/indexing.py__init__z_IndexerBase.__init__   s        c                    | j         j        S r   )r   _namer   s    r   r   z_IndexerBase._name   s    x~r   c                    t           r   )NotImplementedErrorr   s    r   _meta_indexerz_IndexerBase._meta_indexer   s    !!r   c                6    || j         S | j        dd|f         S )z
        get metadata
        N)r   r    )r   iindexercindexers      r   
_make_metaz_IndexerBase._make_meta!   s'     8O%aaak22r   c                R    t          |           j        t          | j                  fS r   )type__name__r   r   r   s    r   __dask_tokenize__z_IndexerBase.__dask_tokenize__*   s     Dzz"HTX$6$666r   N)	r'   
__module____qualname__r   propertyr   r    r$   r(    r   r   r   r      sw             X " " X"3 3 37 7 7 7 7r   r   c                  0    e Zd Zed             Zd Zd ZdS )_iLocIndexerc                $    | j         j        j        S r   )r   _metailocr   s    r   r    z_iLocIndexer._meta_indexer/   s    x~""r   c                   d}t          |t                    st          |          t          |          dk    rt	          d          |\  }}|t          d           k    rt          |          | j        j        j        s| 	                    ||          S | j        j        |         }| j        
                    |          S )Nzd'DataFrame.iloc' only supports selecting columns. It must be used like 'df.iloc[:, column_indexer]'.   Too many indexers)
isinstancetupler   len
ValueErrorslicer   columns	is_unique_iloc__getitem__)r   keymsgr"   r#   	col_namess         r   r=   z_iLocIndexer.__getitem__3   s    A 	 #u%% 	+%c***s88a<<0111 (uT{{""%c***x) 	3::h111 (2I8''	222r   c                    |t          d           k    sJ |                     ||          }| j                            t          j        ||          S )Nmeta)r9   r$   r   map_partitionsr	   r1   r   r"   r#   rC   s       r   r<   z_iLocIndexer._ilocL   sK    5;;&&&&x22x&&w|XD&IIIr   N)r'   r)   r*   r+   r    r=   r<   r,   r   r   r.   r.   .   sP        # # X#3 3 32J J J J Jr   r.   c                  d    e Zd ZdZed             Zd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd ZdS )_LocIndexerz"Helper class for the .loc accessorc                $    | j         j        j        S r   )r   r0   locr   s    r   r    z_LocIndexer._meta_indexerV   s    x~!!r   c                    t          |t                    r?t          |          | j        j        k    rd}t          |          |d         }|d         }n|}d }|                     ||          S )Nr4   r      )r5   r6   r7   r   ndimr
   _loc)r   r>   r?   r"   r#   s        r   r=   z_LocIndexer.__getitem__Z   sp    c5!! 	3xx$(-'')#C(((1vH1vHH HHyy8,,,r   c                8   t          |t                    r|                     ||          S t          |t                    r|                     ||          S t          |          r$|                      || j                  |          S | j        j        r| 	                    |          }t          |t                    r|                     ||          S t          |          r/t          |j                  s|                     |j        |          S t          |t"                    st%          |          r|                     ||          S |                     ||          S t          |t"          t(          j        f          s#t          |          r%t          |j                  sd}t-          |          t          |t                    st          ||          }|                     ||          }| j                            t2          j        |||          S )z%Helper function for the .loc accessorz^Cannot index with list against unknown division. Try setting divisions using ``ddf.set_index``rB   )r5   r   _loc_seriesr   
_loc_arraycallablerM   r   known_divisions_maybe_partial_time_stringr9   
_loc_slicer   r   dtype	_loc_listvalueslistr   _loc_elementnpndarrayKeyErrorr$   rD   r	   try_loc)r   r"   r#   r?   rC   s        r   rM   z_LocIndexer._locj   s   h'' 	;##Hh777%(( 	;??8X666h 	;99XXdh//:::8# 	66x@@H(E** =x:::)) =-2O2O =~~hox@@@Hd++ =|H/E/E =~~h999 ((8<<<(T2:$677 5x((51>x~1N1N5D  smm#%00 5 844??8X66D8**8$ +   r   c                b    t          | j        j        j                  }t	          ||          }|S )z{
        Convert index-indexer for partial time string slicing
        if obj.index is DatetimeIndex / PeriodIndex
        )r   r   r0   indexrS   )r   r"   idxs      r   rS   z&_LocIndexer._maybe_partial_time_string   s,    
 DHN011-c8<<r   c                    t          |j                  st          d          |                     ||          }| j                            t          j        ||d|          S )NzuCannot index with non-boolean dask Series. Try passing computed values instead (e.g. ``ddf.loc[iindexer.compute()]``)z
loc-series)tokenrC   )r   rU   r\   r$   r   rD   r	   rI   rE   s       r   rO   z_LocIndexer._loc_series   sm    X^,, 	H   x22x&&K8<d ' 
 
 	
r   c                n    |                     d| j        j                  }|                     ||          S )N_)to_dask_dataframer   r_   rO   )r   r"   r#   iindexer_seriess       r   rP   z_LocIndexer._loc_array   s1    "44S$(.II:::r   c                   dt          || j                  z  }|                     |          }|                     ||          }t	          |          ri }g }t          |                                          }t          |          D ]L\  }	\  }
}t          j	        | j
        |
f||f|||	f<   |                    t          |          d                    M|                    t          |d         d                   d                    t          j        ||| j        g          }n2d d g}|df|                    d          i}t          j        ||          }t          ||||          S )Nloc-%sr   rK   dependenciesrC   	divisions)r   r   _get_partitionsr$   r7   sorteditems	enumerater	   rI   r   appendr   from_collectionsheadr   )r   r"   r#   namepartsrC   dskrm   rp   idivindexergraphs                r   rV   z_LocIndexer._loc_list   s\   (8TX666$$X..x22x== 	?CI5;;==))E%.u%5%5 5 5!>C 'dj#->RD!G  !34444VE"IaL11"5666"3D#TXJWWWEEtI!9diill+C"3D#>>EUDtyIIIIr   c                   dt          || j                  z  }|                     |          }|| j        j        d         k     s|| j        j        d         k    rt	          dt          |          z            |dft          j        | j        |ft          ||          |fi}| 
                    ||          }t          j        ||| j        g          }t          |||||g          S )Nrh   r   ri   z"the label [%s] is not in the indexrj   rl   )r   r   rn   rm   r\   strr	   rI   r   r9   r$   r   rs   r   )r   r"   r#   ru   partrw   rC   r{   s           r   rY   z_LocIndexer._loc_element   s    (8TX666##H--dh(+++x$(:LR:P/P/P?#h--OPPP 1IT"h))	
 x22/c
SSSUDt(?STTTTr   c                    t          |t                    st          |          rt          | j        j        |          S t          | j        j        |          S r   )r5   rX   r   _partitions_of_index_valuesr   rm   _partition_of_index_value)r   keyss     r   rn   z_LocIndexer._get_partitions   sQ    dD!! 	G\$%7%7 	G.tx/A4HHH -TX-?FFFr   c                6    t          | j        j        |          S r   )_coerce_loc_indexr   rm   )r   r>   s     r   r   z_LocIndexer._coerce_loc_index   s     !3S999r   c                   dt          |||           z  }t          |t                    sJ |j        dv sJ |j        |                     |j                  }nd}|j        |                     |j                  }n| j        j        dz
  }|j        K| j        j	        r?|j        | j        j
        d         n$t          | j        j
        d         |j                  }n|                     |j                  }|j        K| j        j	        r?|j        | j        j
        d         n$t          | j        j
        d         |j                  }n|                     |j                  }||k    r9|dft          j        | j        |ft          |j        |j                  |fi}||g}	nP|dft          j        | j        |ft          |j        d           |fi}t#          d||z
            D ]C}
|| j        ||
z   f|||
f<   t          j        | j        ||
z   ft          d d           |f|||
f<   Dt          j        | j        |ft          d |j                  |f||||z
  f<   |j        | j        j
        d         }n t          || j        j
        |                   }|j        | j        j
        d         }n#t          || j        j
        |dz                      }|f| j        j
        |dz   |dz            z   |fz   }	t%          |	          t%          |          dz   k    sJ |                     ||          }t)          j        ||| j        g          }t-          ||||	          S )Nrh   )NrK   r   rK   ri   rj   rl   )r   r5   r9   stepstartrn   stopr   npartitionsrR   rm   minr   maxr	   rI   r   ranger7   r$   r   rs   r   )r   r"   r#   ru   r   r   istartistoprw   rm   rx   	div_startdiv_stoprC   r{   s                  r   rT   z_LocIndexer._loc_slice   s   (8Xt<<<(E*****}	))))>%((88EEE=$''66DD8'!+D>!dh&>! =( "1%%+A.>> F ++HN;;F= TX%=  >) "2&&+B/@@ E **8=99E5==q	KZ'(.(-88	C  II q	KZ'(.$//	C 1dUl++ 	 	#$(J	#:CaLL  UQY/dD)) 	$CaLL T"dHM**	'CdUl"# ~% H.q1		(:5(ABB	}$8-b1udh&8&BCC tx1%!)dQh2FGG8+U  9~~SA----x22/c
SSSUDtyIIIIr   N)r'   r)   r*   __doc__r+   r    r=   rM   rS   rO   rP   rV   rY   rn   r   rT   r,   r   r   rG   rG   S   s        ,," " X"- - - & & &P  	
 	
 	
; ; ;J J J,U U U(G G G: : :WJ WJ WJ WJ WJr   rG   c                    | d         d}t          |          t          | |          }t          j        | |          }t	          t          |           dz
  t          d|dz
                      S )a'  In which partition does this value lie?

    >>> _partition_of_index_value([0, 5, 10], 3)
    0
    >>> _partition_of_index_value([0, 5, 10], 8)
    1
    >>> _partition_of_index_value([0, 5, 10], 100)
    1
    >>> _partition_of_index_value([0, 5, 10], 5)  # left-inclusive divisions
    1
    r   N4Can not use loc on DataFrame without known divisionsr3   rK   )r8   r   bisectbisect_rightr   r7   r   )rm   valr?   rx   s       r   r   r   8  sg     |Doo
Is
+
+CIs++As9~~!3q!a%==111r   c           	     ,   | d         d}t          |          t          t                    }|D ]c}t          j        | |          }t          t          |           dz
  t          d|dz
                      }||                             |           d|S )aS  Return defaultdict of division and values pairs
    Each key corresponds to the division which values are index values belong
    to the division.

    >>> sorted(_partitions_of_index_values([0, 5, 10], [3]).items())
    [(0, [3])]
    >>> sorted(_partitions_of_index_values([0, 5, 10], [3, 8, 5]).items())
    [(0, [3]), (1, [8, 5])]
    r   Nr   r3   rK   )	r8   r   rX   r   r   r   r7   r   rr   )rm   rW   r?   resultsr   rx   ry   s          r   r   r   L  s     |Doo$G ! !	3//#i..1$c!QUmm44C    Nr   c                   | r/t          | d         t                    rt          j        |          S | rRt          | d         t          j                  r2t	          j        |                              | d         j                  S |S )zxTransform values to be comparable against divisions

    This is particularly valuable to use with pandas datetimes
    r   )r5   r   pd	TimestamprZ   
datetime64astyperU   )rm   os     r   r   r   b  sx    
  Z	!h77 |A ;Z	!bm<< ;}Q&&y|'9:::Hr   c                   t          |           sJ t          | t          j        t          j        f          s|S t          |t
                    rt          |j        t                    r|                     |j        d          }n|j        }t          |j	        t                    r|                     |j	        d          }n|j	        }t          ||          S t          |t                    rX|                     |d          }|                     |d          }t          t          ||          t          ||                    S |S )z`
    Convert indexer for partial string selection
    if data has DatetimeIndex/PeriodIndex
    leftright)r   r5   r   DatetimeIndexPeriodIndexr9   r   r}   _maybe_cast_slice_boundr   r   r   )r_   rz   r   r   s       r   rS   rS   n  s(    eb.?@@ '5!! 9gmS)) 	"11'-HHEEMEglC(( 	 00wGGDD<DUD!!!	GS	!	! 9--gv>>,,Wg>>S%%s5$'7'7888Nr   )&
__future__r   r   collectionsr   r   numpyrZ   pandasr   pandas.api.typesr   dask.array.corer   	dask.baser   dask.dataframer	   dask.dataframe._compatr
   dask.dataframe.corer   r   dask.dataframe.utilsr   r   r   dask.highlevelgraphr   
dask.utilsr   r   r.   rG   r   r   r   rS   r,   r   r   <module>r      s   " " " " " "  # # # # # #               * * * * * * ! ! ! ! ! !       " " " " " " 0 0 0 0 0 0 5 5 5 5 5 5 5 5 M M M M M M M M M M . . . . . . # # # # # #7 7 7 7 7 7 7 72"J "J "J "J "J< "J "J "JJbJ bJ bJ bJ bJ, bJ bJ bJJ2 2 2(  ,	 	 	    r   