o
    $&]i                     @  s  U d dl mZ d dlmZmZmZmZ d dlmZm	Z	 d dl
mZmZmZmZmZmZ d dlZd dlmZ d dlmZmZ d dlmZmZmZmZmZmZmZm Z m!Z!m"Z" d d	l#m$Z$ d d
l%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. d dl/m0Z0 d dl1m2Z2m3Z3 d dl4m5Z6 erd dl7m8Z8 d dl9m:Z: d dl;m<Z< d dl=Z>d dl?Z@d dlAmBZBmCZCmDZD d dlEmFZFmGZG d dlHmIZI d dlJmKZK d dlLmMZM d dlNmOZO d dlPmQZQ d dlRmSZSmTZT d dl%mUZUmVZV d dlWmXZX d dlYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZe ede>jff Zgdehd< eiejdejd ejd!ejd"ejd#ejd$ejd%ejd&ejd'ejd(ejd)ejd*ejd+ejd,ejd-ejd.ejd/ejd0ejd1ejd2gZkd3ehd4< G d5d6 d6ed7 ZldS )8    )annotations)IterableIteratorMappingSequence)chainproduct)TYPE_CHECKINGAnyCallableLiteralcastoverloadN)EagerDataFrame)PANDAS_TO_NUMPY_DTYPE_MISSINGPandasLikeSeries)
align_and_extract_nativeget_dtype_backendimport_array_moduleiter_dtype_backendsnarwhals_to_native_dtypenative_to_narwhals_dtypeobject_native_to_narwhals_dtyperenameselect_columns_by_name	set_index)assert_never)	Implementation_into_arrow_table_remap_full_join_keyscheck_column_names_are_uniqueexclude_column_namesgenerate_temporary_column_nameparse_columns_to_dropscale_bytes
zip_strictis_pandas_like_dataframe)InvalidOperationError
ShapeError)col)BytesIO)Path)
ModuleType)Self	TypeAliasTypeIs)CompliantDataFrameAnyCompliantLazyFrameAny)PandasLikeExprPandasLikeGroupByPandasLikeNamespace)SparkSession)IntoArrowTable)_EagerAllowedImpl_LazyAllowedImpl)Version_LimitedContext)DType)AsofJoinStrategyDTypeBackend
IntoSchemaJoinStrategyPivotAggSizedMultiIndexSelectorSizedMultiNameSelectorSizeUnitUniqueKeepStrategy_2DArray_SliceIndex
_SliceName.r/   Constructorfloat64float32int64int32int16int8uint64uint32uint16uint8boolzdatetime64[s]zdatetime64[ms]zdatetime64[us]zdatetime64[ns]ztimedelta64[s]ztimedelta64[ms]ztimedelta64[us]ztimedelta64[ns]objectzfrozenset[np.dtype[Any]]CLASSICAL_NUMPY_DTYPESc                   @  s  e Zd Zddd9ddZed:ddZed;ddZed<ddZed=d!d"Z	ed>d#d$Z
ed?d'd(Zd@d)d*Zd@d+d,ZdAd.d/ZdBd1d2ZdCd4d5ZdDd6d7Zd8d9dEd;d<ZdFd@dAZedBdC ZdGdFdGZdHdHdIdIdMdNZdJdQdRZdKdTdUZdLdXdYZdMdZd[ZdNd\d]ZdOd_d`ZedPdbdcZedQdgdhZ edRdkdhZ edSdmdhZ dSdndhZ dTdpdqZ!e!Z"dUdtduZ#edVdwdxZ$dVdydzZ%dWd|d}Z&dXddZ'dYddZ(dZddZ)d[ddZ*d\ddZ+d]ddZ,dXddZ-d^ddZ.d_ddZ/d`ddZ0daddZ1dbddZ2dcddZ3ddddZ4ddddZ5ddddZ6deddZ7dfddÄZ8dfddńZ9dgddʄZ:dhdd΄Z;diddԄZ<djddׄZ=djddلZ>dHdڜdkdd߄Z?	HdHdHddlddZ@edmddZAdnddZBdHdHdIdIddZCdoddZDdpddZEdqddZFedrddZGedqddZGdsddZGdtdd ZHduddZId@ddZJdvd
dZKdwddZLedxddZMedyddZNdzddZOd{dd ZPd|d#d$ZQd}d&d'ZRd~d)d*ZSdd+d,ZTdd1d2ZUdd5d6ZVdd7d8ZWdHS (  PandasLikeDataFrameFvalidate_backend_versionnative_dataframer
   implementationr   versionr<   validate_column_namesrV   r[   returnNonec                C  s4   || _ || _|| _|rt|j |r|   d S d S N)_native_frame_implementation_versionr    columns_validate_backend_version)selfr\   r]   r^   r_   r[    ri   ]/var/www/html/IGF-ODF-V3/venv/lib/python3.10/site-packages/narwhals/_pandas_like/dataframe.py__init__h   s   	
zPandasLikeDataFrame.__init__datar9   contextr=   r.   c               C  s   |j }t||}| r| }n/| r-| dkr"ddlm} nddlm} ||}n|	 r:|
 j|}nd}t|| j||dS )N)r      r   r   )
from_arrowzCcongratulations, you entered unreachable code - please report a bugrm   )rd   r   	is_pandas	to_pandasis_modin_backend_versionmodin.pandas.ioro   modin.pandas.utilsis_cudfto_native_namespace	DataFrameAssertionErrorfrom_native)clsrl   rm   r]   tblnativempd_from_arrowmsgri   ri   rj   ro   y   s   


zPandasLikeDataFrame.from_arrowMapping[str, Any]schema.IntoSchema | Mapping[str, DType | None] | Nonec                 s   j }| }td|j}td|j}i }d }	| D ])\}
}t||r@tj| d}|	d u r6|}	|||
< qt	|	|d ||
< q|||
< q|sI|sO|
|}n
|
dd |D }|r|rdt|j|}ndd tt|D } fd	dt| |D }||}| j| dS )
Nztype[pd.Series[Any]]type[pd.DataFrame]rp      c                 S     i | ]}|g qS ri   ri   .0r*   ri   ri   rj   
<dictcomp>       z1PandasLikeDataFrame.from_dict.<locals>.<dictcomp>c                 s      | ]}d V  qd S rb   ri   r   _ri   ri   rj   	<genexpr>       z0PandasLikeDataFrame.from_dict.<locals>.<genexpr>c              	     2   i | ]\\}}}|d ur|t || j jdqS N)r]   r^   r   rd   re   r   keydtypebackendrp   ri   rj   r          
)rd   rx   r   Seriesry   items
isinstancer   r{   r   	from_dictr   dtypesrangelenzipastype)r|   rl   rm   r   r]   pdxr   ry   aligned_data	left_mostnameseries	compliantr~   backendsnative_schemari   rp   rj   r      s4   	





zPandasLikeDataFrame.from_dictSequence[Mapping[str, Any]]c         
        s    j }| }td|j}|s|s||}n
|dd |D }|rJ|r,t|j|}ndd tt	|D } fddt
| |D }	||	}| j| dS )Nr   c                 S  r   ri   ri   r   ri   ri   rj   r      r   z2PandasLikeDataFrame.from_dicts.<locals>.<dictcomp>c                 s  r   rb   ri   r   ri   ri   rj   r      r   z1PandasLikeDataFrame.from_dicts.<locals>.<genexpr>c              	     r   r   r   r   rp   ri   rj   r      r   rp   )rd   rx   r   ry   from_recordsr   r   r   r   r   r   r   r   r{   )
r|   rl   rm   r   r]   nsry   r~   r   r   ri   rp   rj   
from_dicts   s   	


zPandasLikeDataFrame.from_dictsobjTypeIs[Any]c                 C  s   t | S rb   r&   )r   ri   ri   rj   
_is_native      zPandasLikeDataFrame._is_nativec               C  s   | ||j |jddS )NTr]   r^   r_   )rd   re   )r|   rl   rm   ri   ri   rj   r{      s   zPandasLikeDataFrame.from_nativerH   !IntoSchema | Sequence[str] | Nonec                 s   ddl m} |j   j}t|t|fr1 fdd| D }||| d	||
|}n
||| ||d}| j||dS )Nr   )Schemac                 3  s    | ]}t | V  qd S rb   )r   )r   native_typer]   ri   rj   r      s
    
z1PandasLikeDataFrame.from_numpy.<locals>.<genexpr>rf   rp   )narwhals.schemar   rd   rx   ry   r   r   valueskeysr   rr   _numpy_column_namesr{   )r|   rl   rm   r   r   ry   itr~   ri   r   rj   
from_numpy   s   	

zPandasLikeDataFrame.from_numpyc                 C     | S rb   ri   rh   ri   ri   rj   __narwhals_dataframe__
     z*PandasLikeDataFrame.__narwhals_dataframe__c                 C  r   rb   ri   r   ri   ri   rj   __narwhals_lazyframe__  r   z*PandasLikeDataFrame.__narwhals_lazyframe__r7   c                 C  s   ddl m} || j| jdS )Nr   r6   )r^   )narwhals._pandas_like.namespacer7   rd   re   )rh   r7   ri   ri   rj   __narwhals_namespace__  s   z*PandasLikeDataFrame.__narwhals_namespace__r-   c                 C  s8   | j tjtjtjhv r| j  S dt| j  }t|)Nz!Expected pandas/modin/cudf, got: )rd   r   PANDASMODINCUDFrx   typerz   rh   r   ri   ri   rj   __native_namespace__  s   
z(PandasLikeDataFrame.__native_namespace__intc                 C  s
   t | jS rb   )r   r~   r   ri   ri   rj   __len__   s   
zPandasLikeDataFrame.__len__c                 C  s   | j | j| j|ddS )NFr   )	__class__r~   rd   )rh   r^   ri   ri   rj   _with_version#  s   z!PandasLikeDataFrame._with_versionTr_   dfc                C  s   | j || j| j|dS )Nr   )r   rd   re   )rh   r   r_   ri   ri   rj   _with_native+  s   z PandasLikeDataFrame._with_nativeotherr   pd.Series[Any]c                 C  s   | j j}|jr|j }t||jd ||j|jdS t| }t| }kr2d| d| d}t||j j|urAt	|j ||j
dS |j S )Nr   )indexr   r   zExpected object of length z, got: .r   )r~   r   
_broadcastr   ilocr   r   r   r)   r   rd   )rh   r   r   s	len_otherlen_idxr   ri   ri   rj   _extract_comparand3  s   z&PandasLikeDataFrame._extract_comparandc                 C  s   t rdd l}|S t| jS Nr   )r	   numpyr   rd   )rh   npri   ri   rj   _array_funcs?  s   
z PandasLikeDataFrame._array_funcsr   strc                 C  s   t j| j| | dS Nrp   r   r{   r~   )rh   r   ri   ri   rj   
get_columnG     zPandasLikeDataFrame.get_columnNcopyr   r   bool | Nonec                C  s   | j ||dS )Nr   r   )to_numpy)rh   r   r   ri   ri   rj   	__array__J  s   zPandasLikeDataFrame.__array__rows'SizedMultiIndexSelector[pd.Series[Any]]c                 C  s0   t |tr	t|n|}| | jj|d d f S rb   r   tuplelistr   r~   r   )rh   r   r   ri   ri   rj   _gatherM  s   zPandasLikeDataFrame._gather_SliceIndex | rangec                 C  s,   | j | jjt|j|j|jd d f ddS NFr   )r   r~   r   slicestartstopstep)rh   r   ri   ri   rj   _gather_sliceQ  s    z!PandasLikeDataFrame._gather_slicerf   rJ   c                 C  sl   |j d ur| jj|j nd }|jd ur| jj|jd nd }t|||j}| j| jjd d |f ddS )Nr   Fr   )	r   r~   rf   get_locr   r   r   r   r   )rh   rf   r   r   selectorri   ri   rj   _select_slice_nameW  s   

z&PandasLikeDataFrame._select_slice_namec                 C  s   | j | jjd d |f ddS r   r   r~   r   rh   rf   ri   ri   rj   _select_slice_indexg  s   z'PandasLikeDataFrame._select_slice_indexc                 C  s4   t |tr	t|n|}| j| jjd d |f ddS r   r   r   ri   ri   rj   _select_multi_indexl  s   z'PandasLikeDataFrame._select_multi_index&SizedMultiNameSelector[pd.Series[Any]]c                 C  s   |  | jjd d |f S rb   )r   r~   locr   ri   ri   rj   _select_multi_namet     z&PandasLikeDataFrame._select_multi_name	list[str]c                 C  s   | j j S rb   )r~   rf   tolistr   ri   ri   rj   rf   x  s   zPandasLikeDataFrame.columnsnamedLiteral[True]list[dict[str, Any]]c                C     d S rb   ri   rh   r  ri   ri   rj   r   |  r   zPandasLikeDataFrame.rowsLiteral[False]list[tuple[Any, ...]]c                C  r  rb   ri   r  ri   ri   rj   r     r   ,list[tuple[Any, ...]] | list[dict[str, Any]]c                C  r  rb   ri   r  ri   ri   rj   r     r   c                C  sH   |s| j tju rdd | jddD S t| jjdd dS | jjddS )	Nc                 S  s   g | ]}t | qS ri   )r   r   )r   rowri   ri   rj   
<listcomp>      z,PandasLikeDataFrame.rows.<locals>.<listcomp>T)r  Fr   r   recordsorient)rd   r   r   r   r   r~   
itertuplesto_dictr  ri   ri   rj   r     s
   Iterator[PandasLikeSeries]c                 c  s*    | j  D ]\}}tj|| dV  qd S r   )r~   r   r   r{   )rh   _namer   ri   ri   rj   iter_columns  s   z PandasLikeDataFrame.iter_columnsbuffer_size4Iterator[tuple[Any, ...]] | Iterator[dict[str, Any]]c                c  sP    |s| j jdd dE d H  d S | j j}| j jddD ]
}tt||V  qd S )NFr  r   )r~   r  rf   dictr   )rh   r  r  	col_namesr  ri   ri   rj   	iter_rows  s   zPandasLikeDataFrame.iter_rowsdict[str, DType]c                   s    j j  fddj jD S )Nc                   sD   i | ]}| | d krt  | jjn
tj| jjqS )rW   )r   re   rd   r   r~   r   native_dtypesrh   ri   rj   r     s    z.PandasLikeDataFrame.schema.<locals>.<dictcomp>)r~   r   rf   r   ri   r  rj   r     s   zPandasLikeDataFrame.schemac                 C  s   | j S rb   r   r   ri   ri   rj   collect_schema  s   z"PandasLikeDataFrame.collect_schemacolumn_namesc                 G  s   | j t| jt|| jddS r   )r   r   r~   r   rd   )rh   r#  ri   ri   rj   simple_select  s   z!PandasLikeDataFrame.simple_selectexprsr3   c                 G  sj   | j | }|s| jt| j ddS |d j| }|  }|dd |D }| jjj|j_| j|ddS )NFr   r   c                 S  s   g | ]}|j qS ri   )r~   r   r   ri   ri   rj   r    r   z.PandasLikeDataFrame.select.<locals>.<listcomp>T)	_evaluate_exprsr   r   r~   _align_full_broadcastr   _concat_horizontalrf   r   )rh   r%  
new_series	namespacer   ri   ri   rj   select  s   
zPandasLikeDataFrame.selectsubsetSequence[str] | Nonec                 C  sL   |d u r| j | jjddddS |  }|j|j|  dd }| |S )Nr   axisFr   T)ignore_nulls)r   r~   dropnar   any_horizontalr*   is_nullfilter)rh   r-  plxmaskri   ri   rj   
drop_nulls  s   
zPandasLikeDataFrame.drop_nullsunitrF   int | floatc                 C  s   | j jdd }t||dS )NT)deep)r9  )r~   memory_usagesumr$   )rh   r9  szri   ri   rj   estimated_size  s   z"PandasLikeDataFrame.estimated_sizeorder_byc                 C  s   |   }|d u r!| jt| }|j|jj|| | jj	|d}n"t
dt|d jdd|}|jg |d|dd   |}| || S )N)rm   r   r   r3   r   ordinal)method)partition_byr@  r   )r   r   aranger   _expr_from_series_seriesfrom_iterabler~   r   r   nw_colrank_to_compliant_exproverlit	broadcastaliasr,  all)rh   r   r@  r6  rl   	row_indexrJ  ri   ri   rj   with_row_index  s$   z"PandasLikeDataFrame.with_row_indexr   tuple[Any, ...]c                 C  s   t dd | jj| D S )Nc                 s  s    | ]}|V  qd S rb   ri   r   xri   ri   rj   r     r   z*PandasLikeDataFrame.row.<locals>.<genexpr>)r   r~   r   )rh   r   ri   ri   rj   r    r  zPandasLikeDataFrame.row	predicatec                 C  s*   |  |}| |}| j| jj| ddS r   )_evaluate_single_output_exprr   r   r~   r   )rh   rV  r7  mask_nativeri   ri   rj   r5    s
   

zPandasLikeDataFrame.filterc           	        s    j | }|st dkr S dd |D }g } jjD ]}||v r+ ||}n j| }|| q| fdd| D   	 }|
|} jjj|j_ j|ddS )Nr   c                 S  s   i | ]}|j |qS ri   )r   r&  ri   ri   rj   r         z4PandasLikeDataFrame.with_columns.<locals>.<dictcomp>c                 3  s    | ]}  |V  qd S rb   )r   r&  r   ri   rj   r     s    z3PandasLikeDataFrame.with_columns.<locals>.<genexpr>Fr   )r'  r   r~   rf   r   popappendextendr   r   r)  r   r   )	rh   r%  rf   name_columns	to_concatr   r   r+  r   ri   r   rj   with_columns  s   


z PandasLikeDataFrame.with_columnsmappingMapping[str, str]c                 C  s   |  t| j|| jdS )Nrf   r]   )r   r   r~   rd   )rh   r`  ri   ri   rj   r     s   zPandasLikeDataFrame.renameSequence[str]strictc                C  s&   t | ||d}| j| jj|dddS )N)rd  r   Fr   )r#   r   r~   drop)rh   rf   rd  to_dropri   ri   rj   re  
  s   zPandasLikeDataFrame.dropby
descendingbool | Sequence[bool]
nulls_lastc                G  sP   | j }t|tr| }ndd |D }|rdnd}| j|jt|||dddS )Nc                 S  s   g | ]}| qS ri   ri   )r   dri   ri   rj   r    r   z,PandasLikeDataFrame.sort.<locals>.<listcomp>lastfirst)	ascendingna_positionFr   )r~   r   rV   r   sort_valuesr   )rh   rh  rj  rg  r   rn  ro  ri   ri   rj   sort  s   
zPandasLikeDataFrame.sortkIterable[str]reversec                  sv   | j }| j t|tr*t fdd|D r*|r!| |||S | |||S | j|jt	||d
|ddS )Nc                 3  s    | ]	} |   V  qd S rb   )
is_numericrT  r!  ri   rj   r      s    z,PandasLikeDataFrame.top_k.<locals>.<genexpr>)rn  Fr   )r~   r   r   rV   rP  r   	nsmallestnlargestrp  r   head)rh   rr  rg  rt  r   ri   r!  rj   top_k  s    zPandasLikeDataFrame.top_kr   _EagerAllowedImpl | Nonekwargsr1   c                 K  s   |d u rt | j| j| jddS |tju r1tj| jdd}|| jur'|jdd t |  fi |S |tju rGddl	m
} ||  d| jddS |tju r\ddlm} ||  d| jd	S d
| }t|)NFr   TrZ   r   )ArrowDataFrame)r\   r[   r^   r_   )PolarsDataFramer   r[   r^   zUnsupported `backend` value: )rY   r~   rd   re   r   r   updaterr   PYARROWnarwhals._arrow.dataframer|  to_arrowPOLARSnarwhals._polars.dataframer}  	to_polars
ValueError)rh   r   r{  kwdsr|  r}  r   ri   ri   rj   collect*  s<   




zPandasLikeDataFrame.collectr   (Sequence[str] | Sequence[PandasLikeExpr]drop_null_keysr5   c                C  s   ddl m} || ||dS )Nr   r4   )r  )narwhals._pandas_like.group_byr5   )rh   r   r  r5   ri   ri   rj   group_byT  s   zPandasLikeDataFrame.group_byleft_onright_onsuffixpd.DataFramec                C  s&   | j j|ddj|j ||dd|fdS )Nanyr-  howinner r  r  r  suffixes)r~   r2  merge)rh   r   r  r  r  ri   ri   rj   _join_inner[  s   zPandasLikeDataFrame._join_innerc                  sR    j j|j j|ddd||dfd} fddt||D }|j|dd	 |S )
Nr  r  leftr  r  r  r  r  c                   s2   g | ]\}}||kr| j vr|n|  qS ri   r   )r   left_key	right_keyrh   r  ri   rj   r  p  s
    z2PandasLikeDataFrame._join_left.<locals>.<listcomp>Trf   inplace)r~   r  r2  r%   re  )rh   r   r  r  r  result_nativeextrari   r  rj   
_join_leftf  s   zPandasLikeDataFrame._join_leftc                  s   |   }| j}t|| }|jj|d}t|j t| }	|t|  j	dd}
||	  j	dd}t
|j| j|}|| j fdd|D d}||
  j||  ||	dd fd}||||
 |gS )	Nr   r   r/  c                   s   i | ]	}||   qS ri   ri   r   r  ri   rj   r         z2PandasLikeDataFrame._join_full.<locals>.<dictcomp>outerr  r  )r   r~   r   r   r    rf   r   r   isnar  setintersection
differencer  _concat_diagonal)rh   r   r  r  r  r   self_nativeright_on_mapperother_nativeright_suffixedleft_null_maskright_null_mask	to_renameright_null_rowsjoin_resultri   r  rj   
_join_fullz  s,   

zPandasLikeDataFrame._join_fullc                C  s   | j }| j}| s| s| rJ|dk rJtdg | j|jR d}| jjdi |dij	|jjdi |did||d|fd}|j
|dd	 |S | jj	|jd
d|fdS )N)r         n_bytesrf   r   r  r  r  Tr  cross)r  r  ri   )rd   rt   rs   rw   rq   r"   rf   r~   assignr  re  )rh   r   r  r]   backend_version	key_tokenr  ri   ri   rj   _join_cross  s&   	zPandasLikeDataFrame._join_crossc                C  s<   | j |t|tt||d}| jj|ddj|d||dS )Nr   columns_to_selectcolumns_mappingr  r  r  r  r  r  )_join_filter_renamer   r  r   r~   r2  r  )rh   r   r  r  r  ri   ri   rj   
_join_semi  s   zPandasLikeDataFrame._join_semic                  s   | j }| r| jj|jj|ddd||dS tdg | j|jR d | j|t|t	t
||d}| jj|j|dd| rBdnd	 ||d
j fdd }|j dd |S )Nr  r  leftantir  r  r  r  r  r  )r  	indicatorr  r  c                   s   |   dkS )N	left_onlyri   )tindicator_tokenri   rj   <lambda>  s    z0PandasLikeDataFrame._join_anti.<locals>.<lambda>Tr  )rd   rw   r~   r  r2  r"   rf   r  r   r  r   rq   r   re  )rh   r   r  r  r]   r  r  ri   r  rj   
_join_anti  s6   
zPandasLikeDataFrame._join_antir  r  dict[str, str]c                 C  s$   | j }tt|j||d||d S )zHelper function to avoid creating extra columns and row duplication.

        Used in `"anti"` and `"semi`" join's.

        Notice that a native object is returned.
        )r#  r]   rb  )rd   r   r   r~   drop_duplicates)rh   r   r  r  r]   ri   ri   rj   r    s   	z'PandasLikeDataFrame._join_filter_renamer  rB   c                C  s   |dkr| j ||d}nU|d u s|d u rt|||dkr'| j||||d}n:|dkr4| j|||d}n-|dkrA| j|||d}n |dkrO| j||||d}n|d	kr]| j||||d}nt| | |S )
Nr  )r   r  r  )r   r  r  r  anti)r   r  r  semir  full)	r  r  r  r  r  r  r  r   r   )rh   r   r  r  r  r  resultri   ri   rj   join  s,   	

zPandasLikeDataFrame.joinby_leftby_rightstrategyr?   c          	      C  s0   |   }| |j| j|j|||||d|fdS )Nr  )r  r  left_byright_by	directionr  )r   r   
merge_asofr~   )	rh   r   r  r  r  r  r  r  r6  ri   ri   rj   	join_asof  s   zPandasLikeDataFrame.join_asofnc                 C     | j | j|ddS r   )r   r~   rx  rh   r  ri   ri   rj   rx  2     zPandasLikeDataFrame.headc                 C  r  r   )r   r~   tailr  ri   ri   rj   r  5  r  zPandasLikeDataFrame.tail)maintain_orderkeeprG   r  c          	      C  s   ddd ||}|r| | }r||r@|r@td| j}| j|d dj|dddjj|p1| j|d|}|j	|dd	 n |rU| j|dddjj|pP| j|d}n| jj|p\| j|d}| j
|dd
S )NFrm  )noner  r  )r@  )rj  rh  r  Tr  r   )get_check_columns_existr"   rf   rR  rq  r~   r  rp  re  r   )	rh   r-  r  r  r@  mapped_keeperrortokenresri   ri   rj   unique8  s*   
zPandasLikeDataFrame.unique)session_LazyAllowedImpl | Noner  SparkSession | Noner2   c                C  s6  |   }|d u r
| S |tju r$dd l}ddlm} ||dd| jdS |tju r@dd l	}ddl
m} ||| d| jdS |tju r\dd lm} ddlm}	 |	||d| jdS |tju rydd l}
dd	lm} ||
j|| jd
d| jdS | rddlm} |d u rd}t||||| j|ddS t)Nr   )DuckDBLazyFrame	pandas_dfTr~  )PolarsLazyFrame)DaskLazyFrame)r\   r[   r^   )IbisLazyFramer   )r[   r^   )SparkLikeLazyFramez5Spark like backends require `session` to be not None.)r^   r]   r[   )rr   r   DUCKDBduckdbnarwhals._duckdb.dataframer  tablere   r  polarsr  r  from_pandaslazyDASKdask.dataframe	dataframenarwhals._dask.dataframer  IBISibisnarwhals._ibis.dataframer  memtablerf   is_spark_likenarwhals._spark_like.dataframer  r  createDataFramerz   )rh   r   r  r  r  r  plr  ddr  r  r  r  r   ri   ri   rj   r  W  s^   



zPandasLikeDataFrame.lazytuple[int, int]c                 C  s   | j jS rb   )r~   shaper   ri   ri   rj   r
    r   zPandasLikeDataFrame.shape	as_seriesdict[str, Any]c                  s&   |r fdd j D S  jjddS )Nc                   s"   i | ]}|t j j|  d qS )rp   r   r   r   ri   rj   r     s    z/PandasLikeDataFrame.to_dict.<locals>.<dictcomp>r   r  )rf   r~   r  )rh   r  ri   r   rj   r    s
   
zPandasLikeDataFrame.to_dictc                  s   j j} d u rjtju  |t r(|d ur!j j| dS j j dS j	jj
fddj D }|rO j| jdjd j }nj }|d ur]|j| dS |D ]}t|tv ryt fddjD }|  S q_|j dS )Nr   r   c                   s(   g | ]\}}t | r|jd ur|qS rb   )r   	time_zone)r   r   val)dtype_datetimeri   rj   r    s    
z0PandasLikeDataFrame.to_numpy.<locals>.<listcomp>UTCc                   s,   g | ]} |j d dd d d f qS )N)r   r   )r   r   r   )r   rh   ri   rj   r    s    )r~   r   rd   r   r   isinrX   rP  r   re   Datetimer   r   r_  r   r*   dtconvert_time_zonereplace_time_zoner   r   r   hstackrf   )rh   r   r   r   
to_convertr   	col_dtypearrri   )r   r  rh   rj   r     sD   

zPandasLikeDataFrame.to_numpyc                 C  sR   | j tju r	| jS | j tju r| j S | j tju r| j S d| j  }t|)NzUnknown implementation: )	rd   r   r   r~   r   rr   r   
_to_pandasrz   r   ri   ri   rj   rr     s   

zPandasLikeDataFrame.to_pandaspl.DataFramec                 C  s   dd l }||  S r   )r  r  rr   )rh   r  ri   ri   rj   r    s   zPandasLikeDataFrame.to_polarsfilestr | Path | BytesIOc                 C  s   | j | d S rb   )r~   
to_parquetrh   r  ri   ri   rj   write_parquet     z!PandasLikeDataFrame.write_parquetc                 C  r  rb   ri   r  ri   ri   rj   	write_csv  r   zPandasLikeDataFrame.write_csvc                 C  r  rb   ri   r  ri   ri   rj   r"    r   str | Path | BytesIO | None
str | Nonec                 C  s   | j j|ddS )NFr  )r~   to_csvr  ri   ri   rj   r"    r!  c                 C  s   t j| jjdd | dS )NFr  rp   )r   r{   r~   
duplicatedr   ri   ri   rj   	is_unique  s   zPandasLikeDataFrame.is_uniquer  
int | Nonecolumnint | str | Nonec                 C  s   |d u r|d u r| j  }dkrd|}t|| jjd S |d u s&|d u r,d}t|t|tr7| j|n|}| jj||f S )N)r   r   zfcan only call `.item()` without "row" or "column" values if the DataFrame has a single element; shape=)r   r   z8cannot call `.item()` with only one of `row` or `column`)r
  r  r~   r   r   r   rf   r   )rh   r  r)  r
  r   _colri   ri   rj   item  s   zPandasLikeDataFrame.itemc                 C  s   | j | j ddS r   )r   r~   r   r   ri   ri   rj   clone  r   zPandasLikeDataFrame.cloneoffsetc                 C  s   | j | jj|d | ddS r   r   )rh   r  r.  ri   ri   rj   gather_every	  s   z PandasLikeDataFrame.gather_everyonr   #tuple[Sequence[str], Sequence[str]]c                C  sB   |p|rt | h ||nt | |}|pt | h ||}||fS rb   )r!   )rh   r0  r   r   ri   ri   rj   _pivot_into_index_values  s   z,PandasLikeDataFrame._pivot_into_index_valuesunique_valuestuple[str, ...]c                C  s,   d\}}}d | }| | | | | S )N){}"z",")r  )r3  LBRBQbodyri   ri   rj   _pivot_multi_on_name  s   

z(PandasLikeDataFrame._pivot_multi_on_namen_values	separatorc                  s(   |dkr fdd| D S dd | D S )Nr   c                   s   g | ]	}  | qS ri   )r  stripr   r>  ri   rj   r  &  r  z>PandasLikeDataFrame._pivot_single_on_names.<locals>.<listcomp>c                 S  s   g | ]}|d  qS )ri   r   ri   ri   rj   r  '  rY  ri   )r#  r=  r>  ri   r@  rj   _pivot_single_on_names!  s   z*PandasLikeDataFrame._pivot_single_on_namesIterable[tuple[str, ...]]n_onIterator[str]c                c  sh    |dkr"|D ]}|| d  }|d }| || |fV  qd S |D ]}| || d  V  q$d S )Nr   r   )r  r<  )rh   r#  rD  r=  r>  r*   namesprefixri   ri   rj   _pivot_multi_on_names)  s   z)PandasLikeDataFrame._pivot_multi_on_namesIterable[Any]c                C  s*   |dkr|  |||S t| ||||S )zReformat output column names from a native pivot operation, to match `polars`.

        Note:
            `column_names` is a `pd.MultiIndex`, but not in the stubs.
        r   )rB  r   rH  )rh   r#  rD  r=  r>  ri   ri   rj   _pivot_remap_column_names:  s   z-PandasLikeDataFrame._pivot_remap_column_namesaggregate_function?Literal['min', 'max', 'first', 'last', 'sum', 'mean', 'median']c                C  s6   | j tju ri nddi}| jjd||||dd|S )NobservedTF)r   r   rf   aggfuncmarginsri   )rd   r   r   r~   pivot_table)rh   r0  r   r   rK  r  ri   ri   rj   _pivot_tableF  s   z PandasLikeDataFrame._pivot_tablePivotAgg | Nonec                C  sd   |d u r| j j|||dS |dkr*| j jg ||ddt|dj|||dS | ||||S )N)rf   r   r   r   F)as_indexsize)r~   pivotgroupbyaggr  fromkeysrQ  )rh   r0  r   r   rK  ri   ri   rj   _pivot\  s   zPandasLikeDataFrame._pivotsort_columnsc                  s    j }| rd}t| |||\}} ||||}	|r) fdd|D n fdd|D }
tt|gt|
R  }|	jd d |f }	|	j	} j
|t|t||d}||	_	dg|	j	_ |	 S )Nzcpivot is not supported for Modin backend due to https://github.com/modin-project/modin/issues/7409.c                 3  s,    | ]}  | jd d d V  qdS )F)rh  rj  N)r   r  rq  to_listr   r   ri   rj   r     s    
z,PandasLikeDataFrame.pivot.<locals>.<genexpr>c                 3  s"    | ]}  |  V  qd S rb   )r   r  r[  r   r   ri   rj   r     s     )rD  r=  r>  r  )rd   rs   NotImplementedErrorr2  rY  r   r   r   r   rf   rJ  r   rF  r   reset_index)rh   r0  r   r   rK  rZ  r>  r]   r   r  uniquesordered_colsrf   remappedri   r   rj   rU  n  s*   

zPandasLikeDataFrame.pivotc                 C  s0   | j tju r| jjddS dd l}|j| jS )NF)preserve_indexr   )rd   r   r   r~   r  pyarrowTabler  )rh   pari   ri   rj   r    s   zPandasLikeDataFrame.to_arrowfractionfloat | Nonewith_replacementseedc                C  s   | j | jj||||dddS )N)r  fracreplacerandom_stateFr   )r   r~   sample)rh   r  re  rg  rh  ri   ri   rj   rl    s   zPandasLikeDataFrame.samplevariable_name
value_namec                 C  s   |  | jj||||dS )N)id_vars
value_varsvar_namern  )r   r~   melt)rh   r0  r   rm  rn  ri   ri   rj   unpivot  s   zPandasLikeDataFrame.unpivotc                   s$  | j j}|  }D ]}|| }||jkrd| d}t|q
tdkr3| j| jd ddS | jd  j	  t
 fdddd  D sUd	}t|| j}fd
d|D }g |d  d }	fdddd  D }
|  }| j|j|	g|
dd| ddS )Nz-`explode` operation not supported for dtype `z`, expected List typer   r   Fr   c                 3  s&    | ]}| j   k V  qd S rb   )r   r   rP  r   col_name)anchor_seriesnative_frameri   rj   r     s
    
z.PandasLikeDataFrame.explode.<locals>.<genexpr>z2exploded columns must have matching element countsc                   s   g | ]}| vr|qS ri   ri   )r   cr   ri   rj   r    r  z/PandasLikeDataFrame.explode.<locals>.<listcomp>c                   s   g | ]
} |    qS ri   )explodeto_framert  )rw  ri   rj   r    s    r/  )re   r   r"  Listr(   r   r   r~   ry  r   rP  r)   rf   r   concat)rh   rf   r   r   col_to_exploder   r   original_columnsother_columnsexploded_frameexploded_seriesr6  ri   )rv  rf   rw  rj   ry    s>   




zPandasLikeDataFrame.explode)r\   r
   r]   r   r^   r<   r_   rV   r[   rV   r`   ra   )rl   r9   rm   r=   r`   r.   )rl   r   rm   r=   r   r   r`   r.   )rl   r   rm   r=   r   r   r`   r.   )r   r
   r`   r   )rl   r
   rm   r=   r`   r.   )rl   rH   rm   r=   r   r   r`   r.   )r`   r.   )r`   r7   )r`   r-   )r`   r   )r^   r<   r`   r.   )r   r
   r_   rV   r`   r.   )r   r   r`   r   )r   r   r`   r   rb   )r   r
   r   r   r`   rH   )r   r   r`   r.   )r   r   r`   r.   )rf   rJ   r`   r.   )rf   r   r`   r.   )rf   r   r`   r.   )rf   r   r`   r.   )r`   r  )r  r  r`   r  )r  r	  r`   r
  )r  rV   r`   r  )r`   r  )r  rV   r  r   r`   r  )r`   r  )r#  r   r`   r.   )r%  r3   r`   r.   )r-  r.  r`   r.   )r9  rF   r`   r:  )r   r   r@  r.  r`   r.   )r   r   r`   rS  )rV  r3   r`   r.   )r`  ra  r`   r.   )rf   rc  rd  rV   r`   r.   )rg  r   rh  ri  rj  rV   r`   r.   )rr  r   rg  rs  rt  ri  r`   r.   )r   rz  r{  r
   r`   r1   )r   r  r  rV   r`   r5   )
r   r.   r  rc  r  rc  r  r   r`   r  )r   r.   r  r   r`   r  )r   r.   r  rc  r  rc  r`   r  )r   r.   r  r  r  r  r`   r  )r   r.   r  rB   r  r.  r  r.  r  r   r`   r.   )r   r.   r  r   r  r   r  r.  r  r.  r  r?   r  r   r`   r.   )r  r   r`   r.   )
r-  r.  r  rG   r  r   r@  r.  r`   r.   )r   r  r  r  r`   r2   )r`   r	  )r  rV   r`   r  )r`   r  )r`   r  )r  r  r`   ra   )r  ra   r`   r   )r  r#  r`   r$  )r`   r   )r  r(  r)  r*  r`   r
   )r  r   r.  r   r`   r.   )r0  rc  r   r.  r   r.  r`   r1  )r3  r4  r`   r   )r#  rs  r=  r   r>  r   r`   r  )
r#  rC  rD  r   r=  r   r>  r   r`   rE  )
r#  rI  rD  r   r=  r   r>  r   r`   r  )
r0  rc  r   rc  r   rc  rK  rL  r`   r
   )
r0  rc  r   rc  r   rc  rK  rR  r`   r  )r0  rc  r   r.  r   r.  rK  rR  rZ  rV   r>  r   r`   r.   )r`   r
   )
r  r(  re  rf  rg  rV   rh  r(  r`   r.   )
r0  r.  r   r.  rm  r   rn  r   r`   r.   )rf   rc  r`   r.   )X__name__
__module____qualname__rk   classmethodro   r   r   staticmethodr   r{   r   r   r   r   r   r   r   r   r   propertyr   r   r   r   r   r   r   r   r   rf   r   r   r  _iter_columnsr  r   r"  r$  r,  r8  r?  rR  r  r5  r_  r   re  rq  ry  r  r  r  r  r  r  r  r  r  r  r  rx  r  r  r  r
  r  r   rr   r  r   r"  r'  r,  r-  r/  r2  r<  rB  rH  rJ  rQ  rY  rU  r  rl  rs  ry  ri   ri   ri   rj   rY   e   s    
/"
	* #$!B/
(rY   )r   r3   r
   r   )m
__future__r   collections.abcr   r   r   r   	itertoolsr   r   typingr	   r
   r   r   r   r   r   r   narwhals._compliantr   narwhals._pandas_like.seriesr   r   narwhals._pandas_like.utilsr   r   r   r   r   r   r   r   r   r   narwhals._typing_compatr   narwhals._utilsr   r   r   r    r!   r"   r#   r$   r%   narwhals.dependenciesr'   narwhals.exceptionsr(   r)   narwhals.functionsr*   rI  ior+   pathlibr,   typesr-   pandaspdr  r  typing_extensionsr.   r/   r0   narwhals._compliant.typingr1   r2   narwhals._pandas_like.exprr3   r  r5   r   r7   narwhals._spark_like.utilsr8   narwhals._translater9   narwhals._typingr:   r;   r<   r=   narwhals.dtypesr>   narwhals.typingr?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   ry   rK   __annotations__	frozensetr   rX   rY   ri   ri   ri   rj   <module>   sr     0,8
