o
    LhM                     @  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! 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.m/Z/ d dl0m1Z1m2Z2 erd dl3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9Z:d dl;Z<d dl=m>Z>m?Z?m@Z@ d dlAmBZBmCZC d dlDmEZE d dlFmGZG d dlHmIZI d dlJmKZK d dlLmMZMmNZN d dl$mOZOmPZP d dlQmRZR d dlSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_ ede:j`f Zadebd< eceddeddeddedd edd!edd"edd#edd$edd%edd&edd'edd(edd)edd*edd+edd,edd-edd.edd/edd0gZed1ebd2< G d3d4 d4ed5 ZfdS )6    )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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)BytesIO)Path)
ModuleType)Self	TypeAliasTypeIs)CompliantDataFrameAnyCompliantLazyFrameAny)PandasLikeExprPandasLikeGroupByPandasLikeNamespace)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d4ddZed5ddZed6ddZed7ddZed8d d!Z	ed9d$d%Z
d:d&d'Zd:d(d)Zd;d+d,Zd<d.d/Zd=d1d2Zd>d3d4Zd5d6d?d8d9Zd@d=d>Zed?d@ ZdAdCdDZdBdEdFdCdJdKZdDdNdOZdEdQdRZdFdUdVZdGdWdXZdHdYdZZdId\d]ZedJd_d`ZedKdddeZedLdhdeZedMdjdeZdMdkdeZdNdmdnZ e Z!dOdqdrZ"edPdtduZ#dPdvdwZ$dQdydzZ%dRd}d~Z&dSddZ'dTddZ(dUddZ)dVddZ*dWddZ+dRddZ,dXddZ-dYddZ.dZddZ/d[ddZ0d\ddZ1d]ddZ2d^ddZ3d^ddZ4d^ddZ5d_ddZ6d`ddZ7d`ddÄZ8daddȄZ9dbdd̄Z:dcdd҄Z;ddddՄZ<ddddׄZ=dEd؜dedd݄Z>dBdfddZ?edgddZ@dhddZAdBdEdFdCddZBdiddZCdjddZDdkddZEedlddZFedkddZFdmddZFdnddZGdod dZHd:ddZIdpddZJdqd
dZKedrddZLedsddZMdtddZNduddZOdvddZPdwd!d"ZQdxd$d%ZRdyd&d'ZSdzd,d-ZTd{d0d1ZUd|d2d3ZVdES (}  PandasLikeDataFrameFvalidate_backend_versionnative_dataframer
   implementationr   versionr9   validate_column_namesrS   rX   returnNonec                C  s4   || _ || _|| _|rt|j |r|   d S d S N)_native_frame_implementation_versionr   columns_validate_backend_version)selfrY   rZ   r[   r\   rX    rf   `/var/www/html/Persson_Maskin/env/lib/python3.10/site-packages/narwhals/_pandas_like/dataframe.py__init__e   s   	
zPandasLikeDataFrame.__init__datar6   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rj   )ra   r   	is_pandas	to_pandasis_modin_backend_versionmodin.pandas.iorl   modin.pandas.utilsis_cudfto_native_namespace	DataFrameAssertionErrorfrom_native)clsri   rj   rZ   tblnativempd_from_arrowmsgrf   rf   rg   rl   v   s   


zPandasLikeDataFrame.from_arrowMapping[str, Any]schemaIntoSchema | Nonec               C  s   ddl m} |j}| }td|j}td|j}i }	d }
| D ])\}}t||rFt	j
||d}|
d u r<|}
||	|< q!t|
|d |	|< q!||	|< q!|	sO|sU||	}n
|dd |D }|rud }|	rkt|j|}||||}| j
||dS )	Nr   Schemaztype[pd.Series[Any]]ztype[pd.DataFrame]rm      c                 S  s   i | ]}|g qS rf   rf   .0colrf   rf   rg   
<dictcomp>       z1PandasLikeDataFrame.from_dict.<locals>.<dictcomp>)narwhals.schemar   ra   ru   r   Seriesrv   items
isinstancer   rx   r   	from_dictr   dtypesastypero   )ry   ri   rj   r   r   rZ   nsr   rv   aligned_data	left_mostnameseries	compliantr{   backendrf   rf   rg   r      s0   	


zPandasLikeDataFrame.from_dictobjTypeIs[Any]c                 C  s   t | S r_   r%   )r   rf   rf   rg   
_is_native      zPandasLikeDataFrame._is_nativec               C  s   | ||j |jddS )NTrZ   r[   r\   )ra   rb   )ry   ri   rj   rf   rf   rg   rx      s   zPandasLikeDataFrame.from_nativerE   !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   r   c                 3  s    | ]}t | V  qd S r_   )r   )r   native_typerZ   rf   rg   	<genexpr>   s
    
z1PandasLikeDataFrame.from_numpy.<locals>.<genexpr>rc   rm   )r   r   ra   ru   rv   r   r   valueskeysr   ro   _numpy_column_namesrx   )ry   ri   rj   r   r   rv   itr{   rf   r   rg   
from_numpy   s   	

zPandasLikeDataFrame.from_numpyc                 C     | S r_   rf   re   rf   rf   rg   __narwhals_dataframe__      z*PandasLikeDataFrame.__narwhals_dataframe__c                 C  r   r_   rf   r   rf   rf   rg   __narwhals_lazyframe__   r   z*PandasLikeDataFrame.__narwhals_lazyframe__r5   c                 C  s   ddl m} || j| jdS )Nr   r4   )r[   )narwhals._pandas_like.namespacer5   ra   rb   )re   r5   rf   rf   rg   __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: )ra   r   PANDASMODINCUDFru   typerw   re   r}   rf   rf   rg   __native_namespace__   s   
z(PandasLikeDataFrame.__native_namespace__intc                 C  s
   t | jS r_   )lenr{   r   rf   rf   rg   __len__   s   
zPandasLikeDataFrame.__len__c                 C  s   | j | j| j|ddS )NFr   )	__class__r{   ra   )re   r[   rf   rf   rg   _with_version   s   z!PandasLikeDataFrame._with_versionTr\   dfc                C  s   | j || j| j|dS )Nr   )r   ra   rb   )re   r   r\   rf   rf   rg   _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   )indexdtyper   zExpected object of length z, got: .r   )r{   r   
_broadcastr   ilocr   r   r   r(   r   ra   )re   r   r   s	len_otherlen_idxr}   rf   rf   rg   _extract_comparand  s   z&PandasLikeDataFrame._extract_comparandc                 C  s   t rdd l}|S t| jS Nr   )r	   numpyr   ra   )re   nprf   rf   rg   _array_funcs  s   
z PandasLikeDataFrame._array_funcsr   strc                 C  s   t j| j| | dS Nrm   r   rx   r{   )re   r   rf   rf   rg   
get_column     zPandasLikeDataFrame.get_columnNcopyr   r   bool | Nonec                C  s   | j ||dS )Nr   r   )to_numpy)re   r   r   rf   rf   rg   	__array__  s   zPandasLikeDataFrame.__array__rows'SizedMultiIndexSelector[pd.Series[Any]]c                 C  s0   t |tr	t|n|}| | jj|d d f S r_   r   tuplelistr   r{   r   )re   r   r   rf   rf   rg   _gather  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)re   r   rf   rf   rg   _gather_slice!  s    z!PandasLikeDataFrame._gather_slicerc   rG   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{   rc   get_locr   r   r   r   r   )re   rc   r   r   selectorrf   rf   rg   _select_slice_name'  s   

z&PandasLikeDataFrame._select_slice_namec                 C  s   | j | jjd d |f ddS r   r   r{   r   re   rc   rf   rf   rg   _select_slice_index7  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   rf   rf   rg   _select_multi_index<  s   z'PandasLikeDataFrame._select_multi_index&SizedMultiNameSelector[pd.Series[Any]]c                 C  s   |  | jjd d |f S r_   )r   r{   locr   rf   rf   rg   _select_multi_nameD     z&PandasLikeDataFrame._select_multi_name	list[str]c                 C  s   | j j S r_   )r{   rc   tolistr   rf   rf   rg   rc   H  s   zPandasLikeDataFrame.columnsnamedLiteral[True]list[dict[str, Any]]c                C     d S r_   rf   re   r   rf   rf   rg   r   L  r   zPandasLikeDataFrame.rowsLiteral[False]list[tuple[Any, ...]]c                C  r   r_   rf   r   rf   rf   rg   r   O  r   ,list[tuple[Any, ...]] | list[dict[str, Any]]c                C  r   r_   rf   r   rf   rf   rg   r   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 rf   )r   r   )r   rowrf   rf   rg   
<listcomp>Z      z,PandasLikeDataFrame.rows.<locals>.<listcomp>T)r   Fr   r   recordsorient)ra   r   r   r   r   r{   
itertuplesto_dictr   rf   rf   rg   r   U  s
   Iterator[PandasLikeSeries]c                 c  s*    | j  D ]\}}tj|| dV  qd S r   )r{   r   r   rx   )re   _namer   rf   rf   rg   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   rc   dictzip)re   r   r  	col_namesr   rf   rf   rg   	iter_rowsf  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 )rT   )r   rb   ra   r   r{   r   native_dtypesre   rf   rg   r   u  s    z.PandasLikeDataFrame.schema.<locals>.<dictcomp>)r{   r   rc   r   rf   r  rg   r   r  s   zPandasLikeDataFrame.schemac                 C  s   | j S r_   r   r   rf   rf   rg   collect_schema  s   z"PandasLikeDataFrame.collect_schemacolumn_namesc                 G  s   | j t| jt|| jddS r   )r   r   r{   r   ra   )re   r  rf   rf   rg   simple_select  s   z!PandasLikeDataFrame.simple_selectexprsr1   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 rf   )r{   r   r   rf   rf   rg   r     r   z.PandasLikeDataFrame.select.<locals>.<listcomp>T)	_evaluate_into_exprsr   r   r{   _align_full_broadcastr   _concat_horizontalrc   r   )re   r  
new_series	namespacer   rf   rf   rg   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)re   r  plxmaskrf   rf   rg   
drop_nulls  s   
zPandasLikeDataFrame.drop_nullsunitrC   int | floatc                 C  s   | j jdd }t||dS )NT)deep)r%  )r{   memory_usagesumr#   )re   r%  szrf   rf   rg   estimated_size  s   z"PandasLikeDataFrame.estimated_sizeorder_byc                 C  s   |   }|d u r#t| }| j|}|j|jj|| | jj	|d}n|
|d jddd}|jg |dd |}| || S )N)rj   r   r   r   ordinalF)method
descending)partition_byr,  r   )r   r   r   arange_expr_from_series_seriesfrom_iterabler{   r   r   rankoveraliasr  all)re   r   r,  r"  sizeri   	row_indexr6  rf   rf   rg   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 r_   rf   r   xrf   rf   rg   r     s    z*PandasLikeDataFrame.row.<locals>.<genexpr>)r   r{   r   )re   r   rf   rf   rg   r     r   zPandasLikeDataFrame.row	predicatePandasLikeExpr | list[bool]c                 C  s>   t |tr|}n| |d }| |}| j| jj| ddS )Nr   Fr   )r   r   r  r   r   r{   r   )re   r@  mask_nativer#  rf   rf   rg   r!    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 rf   )r   r  rf   rf   rg   r         z4PandasLikeDataFrame.with_columns.<locals>.<dictcomp>c                 3  s    | ]}  |V  qd S r_   )r   r  r   rf   rg   r     s    z3PandasLikeDataFrame.with_columns.<locals>.<genexpr>Fr   )r  r   r{   rc   r   popappendextendr   r   r  r   r   )	re   r  rc   name_columns	to_concatr   r   r  r   rf   r   rg   with_columns  s   


z PandasLikeDataFrame.with_columnsmappingMapping[str, str]c                 C  s   |  t| j|| jdS )Nrc   rZ   )r   r   r{   ra   )re   rJ  rf   rf   rg   r     s   zPandasLikeDataFrame.renameSequence[str]strictc                C  s&   t | ||d}| j| jj|dddS )N)rN  r   Fr   )r"   r   r{   drop)re   rc   rN  to_droprf   rf   rg   rO    s   zPandasLikeDataFrame.dropbyr/  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 rf   rf   )r   drf   rf   rg   r     r   z,PandasLikeDataFrame.sort.<locals>.<listcomp>lastfirst)	ascendingna_positionFr   )r{   r   rS   r   sort_valuesr   )re   r/  rS  rQ  r   rW  rX  rf   rf   rg   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 r_   )
is_numericr>  r  rf   rg   r     s    z,PandasLikeDataFrame.top_k.<locals>.<genexpr>)rW  Fr   )r{   r   r   rS   r9  r   	nsmallestnlargestrY  r   head)re   r[  rQ  r]  r   rf   r  rg   top_k  s    zPandasLikeDataFrame.top_kr   _EagerAllowedImpl | Nonekwargsr/   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   TrW   r   )ArrowDataFrame)rY   rX   r[   r\   )PolarsDataFramer   rX   r[   zUnsupported `backend` value: )rV   r{   ra   rb   r   r   updatero   PYARROWnarwhals._arrow.dataframere  to_arrowPOLARSnarwhals._polars.dataframerf  	to_polars
ValueError)re   r   rd  kwdsre  rf  r}   rf   rf   rg   collect  s<   




zPandasLikeDataFrame.collectr   (Sequence[str] | Sequence[PandasLikeExpr]drop_null_keysr3   c                C  s   ddl m} || ||dS )Nr   r2   )rs  )narwhals._pandas_like.group_byr3   )re   r   rs  r3   rf   rf   rg   group_by$  s   zPandasLikeDataFrame.group_byleft_onright_onsuffixpd.DataFramec                C  s   | j j|j ||dd|fdS )Ninner rv  rw  howsuffixes)r{   merge)re   r   rv  rw  rx  rf   rf   rg   _join_inner+  s   zPandasLikeDataFrame._join_innerc                  sH    j j|j d||dfd} fddt||D }|j|dd |S )Nleftr{  r}  rv  rw  r~  c                   s2   g | ]\}}||kr| j vr|n|  qS rf   r   )r   left_key	right_keyre   rx  rf   rg   r   @  s
    z2PandasLikeDataFrame._join_left.<locals>.<listcomp>Trc   inplace)r{   r  r$   rO  )re   r   rv  rw  rx  result_nativeextrarf   r  rg   
_join_left6  s   zPandasLikeDataFrame._join_leftc                C  sJ   t |||}|jj|d}t|j t| }| jj|||dd|fdS )Nr   outerr{  r|  )r   r{   r   r   rc   r   r   r  )re   r   rv  rw  rx  right_on_mapperother_nativeright_suffixedrf   rf   rg   
_join_fullJ  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_bytesrc   r   rz  r{  r  Tr  cross)r}  r~  rf   )ra   rq   rp   rt   rn   r!   rc   r{   assignr  rO  )re   r   rx  rZ   backend_version	key_tokenr  rf   rf   rg   _join_crossZ  s&   	zPandasLikeDataFrame._join_crossc                C  s2   | j |t|tt||d}| jj|d||dS )Nr   columns_to_selectcolumns_mappingrz  r}  rv  rw  )_join_filter_renamer   r  r  r{   r  )re   r   rv  rw  r  rf   rf   rg   
_join_semip  s   zPandasLikeDataFrame._join_semic                  s   | j }| r| jj|jd||dS tdg | j|jR d | j|t|tt	||d}| jj||
 r8dnd ||dj fd	d
 }|j dd |S )Nleftantir  r  r  r  r  r  )r}  	indicatorrv  rw  c                   s   |   dkS )N	left_onlyrf   )tindicator_tokenrf   rg   <lambda>  s    z0PandasLikeDataFrame._join_anti.<locals>.<lambda>Tr  )ra   rt   r{   r  r!   rc   r  r   r  r  rn   r   rO  )re   r   rv  rw  rZ   r  r  rf   r  rg   
_join_anti|  s0   

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  rZ   rL  )ra   r   r   r{   drop_duplicates)re   r   r  r  rZ   rf   rf   rg   r    s   	z'PandasLikeDataFrame._join_filter_renamer}  r?   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   rx  rz  )r   rv  rw  rx  anti)r   rv  rw  semir  full)	r  ro  r  r  r  r  r  r   r   )re   r   r}  rv  rw  rx  resultrf   rf   rg   join  s,   	

zPandasLikeDataFrame.joinby_leftby_rightstrategyr<   c          	      C  s0   |   }| |j| j|j|||||d|fdS )Nr{  )rv  rw  left_byright_by	directionr~  )r   r   
merge_asofr{   )	re   r   rv  rw  r  r  r  rx  r"  rf   rf   rg   	join_asof  s   zPandasLikeDataFrame.join_asofnc                 C     | j | j|ddS r   )r   r{   ra  re   r  rf   rf   rg   ra       zPandasLikeDataFrame.headc                 C  r  r   )r   r{   tailr  rf   rf   rg   r    r  zPandasLikeDataFrame.tail)maintain_orderkeeprD   r  c                C  sB   ddd ||}|r| | }r|| j| jj||dddS )NFrV  )noneany)r  r  r   )get_check_columns_existr   r{   r  )re   r  r  r  mapped_keeperrorrf   rf   rg   unique  s   	zPandasLikeDataFrame.unique_LazyAllowedImpl | Noner0   c                 C  s   |   }|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 | rxdd l}	dd	lm}
 |
|	j|| jd
d| jdS t)Nr   )DuckDBLazyFrame	pandas_dfTrg  )PolarsLazyFrame)DaskLazyFrame)rY   rX   r[   )IbisLazyFramer   )rX   r[   )ro   r   DUCKDBduckdbnarwhals._duckdb.dataframer  tablerb   rl  polarsrm  r  from_pandaslazyDASKdask.dataframe	dataframenarwhals._dask.dataframer  is_ibisibisnarwhals._ibis.dataframer  memtablerc   rw   )re   r   r  r  r  plr  ddr  r  r  rf   rf   rg   r    sH   


zPandasLikeDataFrame.lazytuple[int, int]c                 C  s   | j jS r_   )r{   shaper   rf   rf   rg   r  5  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 )rm   r   r   r   rf   rg   r   ;  s    z/PandasLikeDataFrame.to_dict.<locals>.<dictcomp>r   r   )rc   r{   r   )re   r  rf   r   rg   r   9  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 r_   )r   	time_zone)r   keyval)dtype_datetimerf   rg   r   O  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   re   rf   rg   r   h  s    )r{   r   ra   r   r   isinrU   r9  r   rb   Datetimer   r   rI  r   r   dtconvert_time_zonereplace_time_zoner   r   r   hstackrc   )re   r   r   r  
to_convertr   	col_dtypearrrf   )r   r  re   rg   r   A  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: )	ra   r   r   r{   r   ro   r   
_to_pandasrw   r   rf   rf   rg   ro   p  s   

zPandasLikeDataFrame.to_pandaspl.DataFramec                 C  s   dd l }||  S r   )r  r  ro   )re   r  rf   rf   rg   rn  z  s   zPandasLikeDataFrame.to_polarsfilestr | Path | BytesIOc                 C  s   | j | d S r_   )r{   
to_parquetre   r  rf   rf   rg   write_parquet     z!PandasLikeDataFrame.write_parquetc                 C  r   r_   rf   r  rf   rf   rg   	write_csv  r   zPandasLikeDataFrame.write_csvc                 C  r   r_   rf   r  rf   rf   rg   r    r   str | Path | BytesIO | None
str | Nonec                 C  s   | j j|ddS )NFr  )r{   to_csvr  rf   rf   rg   r    r  c                 C  s   t j| jjdd | dS )NF)r  rm   )r   rx   r{   
duplicatedr   rf   rf   rg   	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| j }t|| jjd S |d u s%|d u r+d}t|t|tr6| j|n|}| jj||f S )N)r   r   zycan only call `.item()` if the dataframe is of shape (1, 1), or if explicit row/col values are provided; frame has shape )r   r   z8cannot call `.item()` with only one of `row` or `column`)r  ro  r{   r   r   r   rc   r   )re   r   r  r}   _colrf   rf   rg   item  s   
zPandasLikeDataFrame.itemc                 C  s   | j | j ddS r   )r   r{   r   r   rf   rf   rg   clone  r   zPandasLikeDataFrame.cloneoffsetc                 C  s   | j | jj|d | ddS r   r   )re   r  r  rf   rf   rg   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 r_   )r    )re   r  r   r   rf   rf   rg   _pivot_into_index_values  s   z,PandasLikeDataFrame._pivot_into_index_valuesunique_valuestuple[str, ...]c                C  s,   d\}}}d | }| | | | | S )N){}"z",")r  )r  LBRBQbodyrf   rf   rg   _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 rf   )r  stripr   r  rf   rg   r     s    z>PandasLikeDataFrame._pivot_single_on_names.<locals>.<listcomp>c                 S  s   g | ]}|d  qS )rf   r   rf   rf   rg   r     rC  rf   )r  r  r  rf   r  rg   _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  )re   r  r  r  r  r   namesprefixrf   rf   rg   _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   )r  r   r  )re   r  r  r  r  rf   rf   rg   _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   rc   aggfuncmarginsrf   )ra   r   r   r{   pivot_table)re   r  r   r   r  rp  rf   rf   rg   _pivot_table  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)rc   r   r   r   F)as_indexr:  )r{   pivotgroupbyaggr  fromkeysr$  )re   r  r   r   r  rf   rf   rg   _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)r/  rS  N)r   r  rZ  to_listr   r   rf   rg   r     s    
z,PandasLikeDataFrame.pivot.<locals>.<genexpr>c                 3  s"    | ]}  |  V  qd S r_   )r   r  r-  r   r   rf   rg   r   '  s     )r  r  r  r{  )ra   rp   NotImplementedErrorr  r+  r   r   r   r   rc   r  r   r  r   reset_index)re   r  r   r   r  r,  r  rZ   r}   r  uniquesordered_colsrc   remappedrf   r   rg   r'    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   )ra   r   r   r{   rk  pyarrowTabler  )re   parf   rf   rg   rk  3  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)re   r  r7  r9  r:  rf   rf   rg   r>  ;  s   zPandasLikeDataFrame.samplevariable_name
value_namec                 C  s   |  | jj||||dS )N)id_vars
value_varsvar_namer@  )r   r{   melt)re   r  r   r?  r@  rf   rf   rg   unpivotJ  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 r_   )r   r   r9  r   col_name)anchor_seriesnative_framerf   rg   r   o  s
    
z.PandasLikeDataFrame.explode.<locals>.<genexpr>z2exploded columns must have matching element countsc                   s   g | ]}| vr|qS rf   rf   )r   cr   rf   rg   r   w  r   z/PandasLikeDataFrame.explode.<locals>.<listcomp>c                   s   g | ]
} |    qS rf   )explodeto_framerF  )rI  rf   rg   r   z  s    r  )rb   r   r  Listr'   r   r   r{   rK  r   r9  r(   rc   r   concat)re   rc   r   r   col_to_exploder   r}   original_columnsother_columnsexploded_frameexploded_seriesr"  rf   )rH  rc   rI  rg   rK  Z  s>   




zPandasLikeDataFrame.explode)rY   r
   rZ   r   r[   r9   r\   rS   rX   rS   r]   r^   )ri   r6   rj   r:   r]   r,   )ri   r~   rj   r:   r   r   r]   r,   )r   r
   r]   r   )ri   r
   rj   r:   r]   r,   )ri   rE   rj   r:   r   r   r]   r,   )r]   r,   )r]   r5   )r]   r+   )r]   r   )r[   r9   r]   r,   )r   r
   r\   rS   r]   r,   )r   r   r]   r   )r   r   r]   r   r_   )r   r
   r   r   r]   rE   )r   r   r]   r,   )r   r   r]   r,   )rc   rG   r]   r,   )rc   r   r]   r,   )rc   r   r]   r,   )rc   r   r]   r,   )r]   r   )r   r   r]   r   )r   r   r]   r   )r   rS   r]   r   )r]   r   )r   rS   r  r   r]   r  )r]   r
  )r  r   r]   r,   )r  r1   r]   r,   )r  r  r]   r,   )r%  rC   r]   r&  )r   r   r,  r  r]   r,   )r   r   r]   r=  )r@  rA  r]   r,   )rJ  rK  r]   r,   )rc   rM  rN  rS   r]   r,   )rQ  r   r/  rR  rS  rS   r]   r,   )r[  r   rQ  r\  r]  rR  r]   r,   )r   rc  rd  r
   r]   r/   )r   rr  rs  rS   r]   r3   )
r   r,   rv  rM  rw  rM  rx  r   r]   ry  )r   r,   rx  r   r]   ry  )r   r,   rv  rM  rw  rM  r]   ry  )r   r,   r  r   r  r  r]   ry  )r   r,   r}  r?   rv  r  rw  r  rx  r   r]   r,   )r   r,   rv  r   rw  r   r  r  r  r  r  r<   rx  r   r]   r,   )r  r   r]   r,   )r  r  r  rD   r  r   r]   r,   )r   r  r]   r0   )r]   r  )r  rS   r]   r  )r]   ry  )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  rM  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  r   r  r   r  r   r]   r   )
r  rM  r   rM  r   rM  r  r  r]   r
   )
r  rM  r   rM  r   rM  r  r%  r]   ry  )r  rM  r   r  r   r  r  r%  r,  rS   r  r   r]   r,   )r]   r
   )
r  r  r7  r8  r9  rS   r:  r  r]   r,   )
r  r  r   r  r?  r   r@  r   r]   r,   )rc   rM  r]   r,   )W__name__
__module____qualname__rh   classmethodrl   r   staticmethodr   rx   r   r   r   r   r   r   r   r   r   propertyr   r   r   r   r   r   r   r   r   rc   r   r   r  _iter_columnsr	  r   r  r  r  r$  r+  r<  r   r!  rI  r   rO  rZ  rb  rq  ru  r  r  r  r  r  r  r  r  r  ra  r  r  r  r  r   r   ro   rn  r  r  r  r  r   r  r  r  r  r  r  r$  r+  r'  rk  r>  rE  rK  rf   rf   rf   rg   rV   b   s    
%
	* $./
(rV   )r   r1   r
   r   )g
__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   narwhals._typing_compatr   narwhals._utilsr   r   r   r   r    r!   r"   r#   r$   narwhals.dependenciesr&   narwhals.exceptionsr'   r(   ior)   pathlibr*   typesr+   pandaspdr  r  typing_extensionsr,   r-   r.   narwhals._compliant.typingr/   r0   narwhals._pandas_like.exprr1   rt  r3   r   r5   narwhals._translater6   narwhals._typingr7   r8   r9   r:   narwhals.dtypesr;   narwhals.typingr<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rv   rH   __annotations__	frozensetr   rU   rV   rf   rf   rf   rg   <module>   sn     ,,8
