o
    LhA                     @  s  U d dl mZ d dlZd dlmZ d dlmZmZmZm	Z	 d dl
Z
d dlm  mZ d dlmZmZ d dlmZ d dlmZmZmZmZmZmZ d dlmZmZ erd d	lmZm Z m!Z!m"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-m.Z.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z;m<Z< d dlm=Z= d dl>m?Z? d dl@mAZA d dlBmCZD d dlEmFZFmGZGmHZH dZIdeJd< G dd ded eZKdS )    )annotationsN)BytesIO)TYPE_CHECKINGAnyLiteralcast)evaluate_exprsnative_to_narwhals_dtype)SQLLazyFrame)ImplementationValidateBackendVersionVersionnot_implementedparse_columns_to_drop
zip_strict)ColumnNotFoundErrorInvalidOperationError)IterableIteratorMappingSequence)Path)
ModuleType)Binary)Self	TypeAliasTypeIs)CompliantDataFrameAny)IbisExprIbisGroupByIbisNamespaceIbisInterchangeSeries)_EagerAllowedImpl_LazyAllowedImpl)_LimitedContext)	LazyFrame)DType	DataFrame)AsofJoinStrategyJoinStrategyLazyUniqueKeepStrategyz*Sequence[ir.BooleanColumn] | Sequence[str]r   JoinPredicatesc                   @  s  e Zd ZejZdddddZedddZe	dddZ
dddZdddZdddZdd d!Zdd#d$Zdd(d)Zdd+d,Zdd2d3Zdd6d7Zdd9d:Zdd=d>Zdd?d@ZddDdEZdddHdIZddJdKZddMdNZeddPdQZeddSdTZddVdWZddYdZZdd[d\Z dd]d^Z!ddcddZ"ddgdhZ#eddjdkZ$ddsdtZ%ddydzZ&dd|d}Z'dd~dZ(dddZ)dddZ*dddZ+dddZ,dddZ-dddZ.dddZ/dddZ0e12dZ3e12dZ4e1 Z5dFS )IbisLazyFrameF)validate_backend_versiondfir.Tableversionr   r1   boolreturnNonec                C  s,   || _ || _d | _d | _|r|   d S d S N)_native_frame_version_cached_schema_cached_columns_validate_backend_version)selfr2   r4   r1    r?   Y/var/www/html/Persson_Maskin/env/lib/python3.10/site-packages/narwhals/_ibis/dataframe.py__init__5   s   zIbisLazyFrame.__init__objir.Table | AnyTypeIs[ir.Table]c                 C  s   t | tjS r8   )
isinstanceirTable)rB   r?   r?   r@   
_is_native?   s   zIbisLazyFrame._is_nativedatacontextr'   r   c               C  s   | ||j dS Nr4   )r:   )clsrI   rJ   r?   r?   r@   from_nativeC   s   zIbisLazyFrame.from_native+LazyFrame[ir.Table] | DataFrameV1[ir.Table]c                 C  s4   | j tju rddlm} || ddS | j j| ddS )Nr   r*   interchange)levellazy)r:   r   V1narwhals.stable.v1r+   	lazyframe)r>   r+   r?   r?   r@   to_narwhalsG   s   zIbisLazyFrame.to_narwhalsc                 C  s   | j tjurd}t|| S )Nz;__narwhals_dataframe__ is not implemented for IbisLazyFrame)r:   r   rS   AttributeError)r>   msgr?   r?   r@   __narwhals_dataframe__N   s   z$IbisLazyFrame.__narwhals_dataframe__c                 C  s   | S r8   r?   r>   r?   r?   r@   __narwhals_lazyframe__U      z$IbisLazyFrame.__narwhals_lazyframe__r   c                 C  s   t S r8   )ibisrZ   r?   r?   r@   __native_namespace__X   r\   z"IbisLazyFrame.__native_namespace__r"   c                 C  s   ddl m} || jdS )Nr   r!   rL   )narwhals._ibis.namespacer"   r:   )r>   r"   r?   r?   r@   __narwhals_namespace__[   s   z$IbisLazyFrame.__narwhals_namespace__namestrr$   c                 C  s"   ddl m} || j|| jdS )Nr   r#   rL   )narwhals._ibis.seriesr$   nativeselectr:   )r>   ra   r$   r?   r?   r@   
get_column`   s   zIbisLazyFrame.get_columnIterator[ir.Expr]c                 c  s    | j D ]}| j| V  qd S r8   )columnsrd   )r>   ra   r?   r?   r@   _iter_columnse   s   
zIbisLazyFrame._iter_columnsbackend_EagerAllowedImpl | Nonekwargsr   r   c                 K  s   |d u s	|t ju rddlm} || j d| jddS |t ju r4ddlm	} || j
 t jd| jddS |t ju rJddlm} || j d| jdS d	| }t|)
Nr   )ArrowDataFrameT)r1   r4   validate_column_names)PandasLikeDataFrame)implementationr1   r4   rn   )PolarsDataFrame)r1   r4   zUnsupported `backend` value: )r   PYARROWnarwhals._arrow.dataframerm   rd   
to_pyarrowr:   PANDASnarwhals._pandas_like.dataframero   	to_pandasPOLARSnarwhals._polars.dataframerq   	to_polars
ValueError)r>   rj   rl   rm   ro   rq   rX   r?   r?   r@   collecti   s4   


zIbisLazyFrame.collectnintc                 C  s   |  | j|S r8   )_with_nativerd   head)r>   r}   r?   r?   r@   r         zIbisLazyFrame.headcolumn_namesc                 G  s   |  | jj| S r8   )r   rd   re   )r>   r   r?   r?   r@   simple_select   r   zIbisLazyFrame.simple_selectexprsr   c                 G  s,   dd t | g|R  D }| | j|S )Nc                 S  s    g | ]\}}t d ||qS )z	ir.Scalar)r   ra   .0ra   valr?   r?   r@   
<listcomp>   s    z+IbisLazyFrame.aggregate.<locals>.<listcomp>)r   r   rd   	aggregate)r>   r   	selectionr?   r?   r@   r      s   zIbisLazyFrame.aggregatec                 G  s@   dd t | g|R  D }|sd}t|| jj| }| |S )Nc                 S  s   g | ]	\}}| |qS r?   )ra   r   r?   r?   r@   r      s    z(IbisLazyFrame.select.<locals>.<listcomp>zKAt least one expression must be provided to `select` with the Ibis backend.)r   r{   rd   re   r   )r>   r   r   rX   tr?   r?   r@   re      s   
zIbisLazyFrame.selectrh   Sequence[str]strictc                  s4   t | ||d  fdd| jD }| | jj| S )N)r   c                 3  s    | ]	}| vr|V  qd S r8   r?   )r   colcolumns_to_dropr?   r@   	<genexpr>   s    z%IbisLazyFrame.drop.<locals>.<genexpr>)r   rh   r   rd   re   )r>   rh   r   r   r?   r   r@   drop   s   zIbisLazyFrame.dropN_LazyAllowedImpl | Nonec                 C  s   |d ur
d}t || S )Nz,`backend` argument is not supported for Ibis)r{   )r>   rj   rX   r?   r?   r@   rR      s   zIbisLazyFrame.lazyc                 G  s,   t t| g|R  }| | jjdi |S )Nr?   )dictr   r   rd   mutate)r>   r   new_columns_mapr?   r?   r@   with_columns   s   zIbisLazyFrame.with_columns	predicatec                 C  s$   t d|| d }| | j|S )Nzir.BooleanValuer   )r   r   rd   filter)r>   r   maskr?   r?   r@   r      s   zIbisLazyFrame.filterdict[str, DType]c                   s0    j d u r fdd j j D  _  j S )Nc                      i | ]\}}|t | jqS r?   r	   r:   r   ra   dtyperZ   r?   r@   
<dictcomp>       z(IbisLazyFrame.schema.<locals>.<dictcomp>)r;   rd   schemafieldsitemsrZ   r?   rZ   r@   r      s
   

zIbisLazyFrame.schema	list[str]c                 C  s2   | j d u r| jd urt| jnt| jj| _ | j S r8   )r<   r;   listr   rd   rh   rZ   r?   r?   r@   rh      s   



zIbisLazyFrame.columnspd.DataFramec                 C  
   | j  S r8   )rd   rw   rZ   r?   r?   r@   rw         
zIbisLazyFrame.to_pandaspa.Tablec                 C  r   r8   )rd   rt   rZ   r?   r?   r@   to_arrow   r   zIbisLazyFrame.to_arrowc                 C  s   | j | j|dS rK   )	__class__rd   )r>   r4   r?   r?   r@   _with_version      zIbisLazyFrame._with_versionc                 C  s   | j || jdS rK   )r   r:   )r>   r2   r?   r?   r@   r      r   zIbisLazyFrame._with_nativekeys"Sequence[str] | Sequence[IbisExpr]drop_null_keysr    c                C  s   ddl m} || ||dS )Nr   r   )r   )narwhals._ibis.group_byr    )r>   r   r   r    r?   r?   r@   group_by   s   zIbisLazyFrame.group_bymappingMapping[str, str]c                   s    d fdd}|  | j|S )Nr   rb   r6   c                   s     | | S r8   )get)r   r   r?   r@   _rename   s   z%IbisLazyFrame.rename.<locals>._rename)r   rb   r6   rb   )r   rd   rename)r>   r   r   r?   r   r@   r      s   zIbisLazyFrame.renameIterable[str]c                C  s"   t | j|}|r| j| S | S )zWIbis adds a suffix to the right table col, even when it matches the left during a join.)setrh   intersectionr   )r2   rh   
duplicatesr?   r?   r@   _join_drop_duplicate_columns   s   z*IbisLazyFrame._join_drop_duplicate_columnsotherhowr-   left_onSequence[str] | Noneright_onsuffixc                  s  |dkrdn|}d  }|| kr|  |j }|dkr+| jj|j||d}|  |S |d us1J |d us7J | |||}	| jj|j|	||d}|dkr fdd|D }
| ||
}d	d |	D }g }|D ]}|jj}|| jvr}|j	j|kr}|
| qg|r|j| }|  |S )
Nfullouter{name}cross)r   rnameleftc                 3      | ]}|  V  qd S r8   r?   r   r}   r   r?   r@   r         z%IbisLazyFrame.join.<locals>.<genexpr>c                 s  s(    | ]}t |tstd | V  qdS )r   N)rE   rb   r   op)r   pr?   r?   r@   r   
  s   & )r   rd   viewjoin_convert_predicatesr   rightra   rh   r   appendr   )r>   r   r   r   r   r   
how_nativer   joined
predicatesright_namesitto_droppredr   r?   r   r@   r      s0   	



zIbisLazyFrame.joinby_leftby_rightstrategyr,   c                  s   d  }t jt jd}	g }
|	| }r || j| |j| }nd}t||d ur5|d ur5| |||}
| jj|j||
|d}| ||  g}|d ur\ fdd|D }| ||}| 	|S )Nr   )backwardforwardzIOnly `backward` and `forward` strategies are currently supported for Ibis)r   c                 3  r   r8   r?   r   r   r?   r@   r   -  r   z*IbisLazyFrame.join_asof.<locals>.<genexpr>)
operatorgeler   rd   NotImplementedErrorr   	asof_joinr   r   )r>   r   r   r   r   r   r   r   r   strategy_opr   r   onrX   r   r   r?   r   r@   	join_asof  s   
zIbisLazyFrame.join_asofr/   c                   s&   ||kr|S  fddt ||D S )Nc                   s*   g | ]\}}t d j|  j| kqS )zir.BooleanColumn)r   rd   )r   r   r   r   r>   r?   r@   r   6  s    z5IbisLazyFrame._convert_predicates.<locals>.<listcomp>)r   )r>   r   r   r   r?   r   r@   r   1  s
   z!IbisLazyFrame._convert_predicatesc                   s    fdd j  j D S )Nc                   r   r?   r   r   rZ   r?   r@   r   <  r   z0IbisLazyFrame.collect_schema.<locals>.<dictcomp>)rd   r   r   r   rZ   r?   rZ   r@   collect_schema;  s   
zIbisLazyFrame.collect_schemasubsetkeepr.   c                  s   |dkr|n|p
 j  }r@t fdd|D r,dt| j  d j  d}t|dd d}|| }  jj||d	S   jj|d
S )Nanyc                 3  s    | ]}| j vV  qd S r8   )rh   )r   xrZ   r?   r@   r   F  s    z'IbisLazyFrame.unique.<locals>.<genexpr>zColumns z not found in .first)r   none)r   r   )r   )rh   r   r   
differencer   r   rd   distinct)r>   r   r   subset_rX   mapped_keepto_keepr?   rZ   r@   uniqueA  s    zIbisLazyFrame.uniqueby
descendingbool | Sequence[bool]
nulls_lastc                  s|   t  tr fddtt|D  g }tt|D ]} | r#tjntj}||| | d}|| q| | j	j
| S )Nc                   s   g | ]} qS r?   r?   )r   _r   r?   r@   r   T  s    z&IbisLazyFrame.sort.<locals>.<listcomp>nulls_first)rE   r5   rangelenr]   descascr   r   rd   order_by)r>   r   r   r   	sort_colsidirection_fnr   r?   r   r@   sortR  s   
zIbisLazyFrame.sortkreversec          	      C  sx   t |tr|gtt| }g }t||D ]\}}|rtjntj}||dd}|t	d| q| 
| jj| |S )NFr   z	ir.Column)rE   r5   r  r   r   r]   r  r  r   r   r   rd   r  r   )	r>   r
  r   r  r  
is_reverseby_colr  r   r?   r?   r@   top_k_  s   
zIbisLazyFrame.top_kc                 C  s$   |d ur|n| j }| | j|S r8   )rh   r   rd   	drop_null)r>   r   r   r?   r?   r@   
drop_nullsk  s   zIbisLazyFrame.drop_nullsc                 C  sr   | j j}|  }|D ]}|| }||jkrd| d}t|q
t|dkr,d}t|| | jj	|d ddS )Nz-`explode` operation not supported for dtype `z`, expected List type   zExploding on multiple columns is not supported with Ibis backend since we cannot guarantee that the exploded columns have matching element counts.r   T)
keep_empty)
r:   dtypesr   Listr   r  r   r   rd   unnest)r>   rh   r  r   r   r   rX   r?   r?   r@   explodeo  s   

zIbisLazyFrame.exploder   indexvariable_name
value_namec           	        s~   dd l m} |d u rg n| |d u r fdd| jD n|}ttg  ||}| jj|j| ||d}| 	|j
| S )Nr   c                   s   g | ]}| vr|qS r?   r?   )r   cindex_r?   r@   r     s    z)IbisLazyFrame.unpivot.<locals>.<listcomp>)names_to	values_to)ibis.selectors	selectorsrh   r   r   fromkeysrd   pivot_longercolsr   re   )	r>   r   r  r  r  son_final_columns	unpivotedr?   r  r@   unpivot  s   zIbisLazyFrame.unpivotr  c                 C  s8   t  t j|d|t j g}| | jj	| S )N)r  )
r]   
row_numberoverwindowra   r   allr   rd   re   )r>   ra   r  	to_selectr?   r?   r@   with_row_index  s   zIbisLazyFrame.with_row_indexfilestr | Path | BytesIOc                 C  s&   t |trd}t|| j| d S )Nz5Writing to BytesIO is not supported for Ibis backend.)rE   r   r   rd   
to_parquet)r>   r/  rX   r?   r?   r@   sink_parquet  s   
zIbisLazyFrame.sink_parquetzO`LazyFrame.gather_every` is deprecated and will be removed in a future version.zG`LazyFrame.tail` is deprecated and will be removed in a future version.)r2   r3   r4   r   r1   r5   r6   r7   )rB   rC   r6   rD   )rI   r3   rJ   r'   r6   r   )r6   rO   )r6   r   )r6   r   )r6   r"   )ra   rb   r6   r$   )r6   rg   )rj   rk   rl   r   r6   r   )r}   r~   r6   r   )r   rb   r6   r   )r   r   r6   r   )rh   r   r   r5   r6   r   r8   )rj   r   r6   r   )r   r   r6   r   )r6   r   )r6   r   )r6   r   )r6   r   )r4   r   r6   r   )r2   r3   r6   r   )r   r   r   r5   r6   r    )r   r   r6   r   )r2   r3   rh   r   r6   r3   )r   r   r   r-   r   r   r   r   r   rb   r6   r   )r   r   r   rb   r   rb   r   r   r   r   r   r,   r   rb   r6   r   )r   r   r   r   r   r   r6   r/   )r   r   r   r.   r6   r   )r   rb   r   r   r   r5   r6   r   )r
  r~   r   r   r  r   r6   r   )r   r   r6   r   )rh   r   r6   r   )
r   r   r  r   r  rb   r  rb   r6   r   )ra   rb   r  r   r6   r   )r/  r0  r6   r7   )6__name__
__module____qualname__r   IBIS_implementationrA   staticmethodrH   classmethodrN   rV   rY   r[   r^   r`   rf   ri   r|   r   r   r   re   r   rR   r   r   propertyr   rh   rw   r   r   r   r   r   r   r   r   r   r   r   r	  r  r  r  r(  r.  r2  r   
deprecatedgather_everytail_evaluate_window_exprr?   r?   r?   r@   r0   /   sn    









$



	




	






$











r0   )r   r3   rO   )L
__future__r   r   ior   typingr   r   r   r   r]   ibis.expr.typesexprtypesrF   narwhals._ibis.utilsr   r	   narwhals._sql.dataframer
   narwhals._utilsr   r   r   r   r   r   narwhals.exceptionsr   r   collections.abcr   r   r   r   pathlibr   r   pandaspdpyarrowpaibis.expr.operationsr   typing_extensionsr   r   r   narwhals._compliant.typingr   narwhals._ibis.exprr   r   r    r_   r"   rc   r$   narwhals._typingr%   r&   r'   narwhals.dataframer(   narwhals.dtypesr)   rT   r+   DataFrameV1narwhals.typingr,   r-   r.   r/   __annotations__r0   r?   r?   r?   r@   <module>   sD     
