o
    $&]i?                     @  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 d dl	Z	d dl
m  mZ d dlmZ d dl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 d d	l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/m0Z0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9m:Z: d dl;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castIbisExpr)evaluate_exprslitnative_to_narwhals_dtype)SQLLazyFrame)ImplementationValidateBackendVersionVersiongenerate_temporary_column_namenot_implementedparse_columns_to_dropto_pyarrow_table
zip_strict)InvalidOperationError)IterableIteratorMappingSequence)Path)
ModuleType)Binary)Self	TypeAliasTypeIs)CompliantDataFrameAnyIbisGroupByIbisNamespaceIbisInterchangeSeries)_EagerAllowedImpl)_LimitedContext)	LazyFrame)DType	DataFrame)AsofJoinStrategyJoinStrategyUniqueKeepStrategyz*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Z0e1 Z2dFS )IbisLazyFrameF)validate_backend_versiondfir.Tableversionr   r2   boolreturnNonec                C  s,   || _ || _d | _d | _|r|   d S d S N)_native_frame_version_cached_schema_cached_columns_validate_backend_version)selfr3   r5   r2    r@   V/var/www/html/IGF-ODF-V3/venv/lib/python3.10/site-packages/narwhals/_ibis/dataframe.py__init__7   s   zIbisLazyFrame.__init__objir.Table | AnyTypeIs[ir.Table]c                 C  s   t | tjS r9   )
isinstanceirTable)rC   r@   r@   rA   
_is_nativeA   s   zIbisLazyFrame._is_nativedatacontextr(   r   c               C  s   | ||j dS Nr5   )r;   )clsrJ   rK   r@   r@   rA   from_nativeE   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@   rA   to_narwhalsI   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   rT   AttributeError)r?   msgr@   r@   rA   __narwhals_dataframe__P   s   z$IbisLazyFrame.__narwhals_dataframe__c                 C  s   | S r9   r@   r?   r@   r@   rA   __narwhals_lazyframe__W      z$IbisLazyFrame.__narwhals_lazyframe__r   c                 C  s   t S r9   )ibisr[   r@   r@   rA   __native_namespace__Z   r]   z"IbisLazyFrame.__native_namespace__r$   c                 C  s   ddl m} || jdS )Nr   r#   rM   )narwhals._ibis.namespacer$   r;   )r?   r$   r@   r@   rA   __narwhals_namespace__]   s   z$IbisLazyFrame.__narwhals_namespace__namestrr&   c                 C  s"   ddl m} || j|| jdS )Nr   r%   rM   )narwhals._ibis.seriesr&   nativeselectr;   )r?   rb   r&   r@   r@   rA   
get_columnb   s   zIbisLazyFrame.get_columnIterator[ir.Expr]c                 c  s    | j D ]}| j| V  qd S r9   )columnsre   )r?   rb   r@   r@   rA   _iter_columnsg   s   
zIbisLazyFrame._iter_columnsbackend_EagerAllowedImpl | Nonekwargsr   r    c                 K  s   |d u s	|t ju rddlm} |t| j d| jddS |t ju r6ddl	m
} || j t jd| jddS |t ju rLddlm} || j d| jdS d	| }t|)
Nr   )ArrowDataFrameT)r2   r5   validate_column_names)PandasLikeDataFrame)implementationr2   r5   ro   )PolarsDataFrame)r2   r5   zUnsupported `backend` value: )r   PYARROWnarwhals._arrow.dataframern   r   re   
to_pyarrowr;   PANDASnarwhals._pandas_like.dataframerp   	to_pandasPOLARSnarwhals._polars.dataframerr   	to_polars
ValueError)r?   rk   rm   rn   rp   rr   rY   r@   r@   rA   collectk   s4   


zIbisLazyFrame.collectnintc                 C  s   |  | j|S r9   )_with_nativere   head)r?   r~   r@   r@   rA   r         zIbisLazyFrame.headcolumn_namesc                 G  s   |  | jj| S r9   )r   re   rf   )r?   r   r@   r@   rA   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   rb   .0rb   valr@   r@   rA   
<listcomp>   s    z+IbisLazyFrame.aggregate.<locals>.<listcomp>)r	   r   re   	aggregate)r?   r   	selectionr@   r@   rA   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@   )rb   r   r@   r@   rA   r      s    z(IbisLazyFrame.select.<locals>.<listcomp>zKAt least one expression must be provided to `select` with the Ibis backend.)r	   r|   re   rf   r   )r?   r   r   rY   tr@   r@   rA   rf      s   
zIbisLazyFrame.selectri   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 r9   r@   )r   colcolumns_to_dropr@   rA   	<genexpr>   s    z%IbisLazyFrame.drop.<locals>.<genexpr>)r   ri   r   re   rf   )r?   ri   r   r   r@   r   rA   drop   s   zIbisLazyFrame.dropN_c                 K  s   |d ur
d}t || S )Nz,`backend` argument is not supported for Ibis)r|   )r?   rk   r   rY   r@   r@   rA   rS      s   zIbisLazyFrame.lazyc                 G  s,   t t| g|R  }| | jjdi |S )Nr@   )dictr	   r   re   mutate)r?   r   new_columns_mapr@   r@   rA   with_columns   s   zIbisLazyFrame.with_columns	predicatec                 C  s$   t d|| d }| | j|S )Nzir.BooleanValuer   )r   r   re   filter)r?   r   maskr@   r@   rA   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   rb   dtyper[   r@   rA   
<dictcomp>       z(IbisLazyFrame.schema.<locals>.<dictcomp>)r<   re   schemafieldsitemsr[   r@   r[   rA   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 r9   )r=   r<   listr   re   ri   r[   r@   r@   rA   ri      s   



zIbisLazyFrame.columnspd.DataFramec                 C  
   | j  S r9   )re   rx   r[   r@   r@   rA   rx         
zIbisLazyFrame.to_pandaspa.Tablec                 C  r   r9   )re   ru   r[   r@   r@   rA   to_arrow   r   zIbisLazyFrame.to_arrowc                 C  s   | j | j|dS rL   )	__class__re   )r?   r5   r@   r@   rA   _with_version      zIbisLazyFrame._with_versionc                 C  s   | j || jdS rL   )r   r;   )r?   r3   r@   r@   rA   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@   rA   group_by   s   zIbisLazyFrame.group_bymappingMapping[str, str]c                   s    d fdd}|  | j|S )Nr   rc   r7   c                   s     | | S r9   )get)r   r   r@   rA   _rename   s   z%IbisLazyFrame.rename.<locals>._rename)r   rc   r7   rc   )r   re   rename)r?   r   r   r@   r   rA   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.)setri   intersectionr   )r3   ri   
duplicatesr@   r@   rA   _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 r9   r@   r   r~   r   r@   rA   r   
      z%IbisLazyFrame.join.<locals>.<genexpr>c                 s  s(    | ]}t |tstd | V  qdS )r   N)rF   rc   r   op)r   pr@   r@   rA   r     s   & )r   re   viewjoin_convert_predicatesr   rightrb   ri   r   appendr   )r?   r   r   r   r   r   
how_nativer   joined
predicatesright_namesitto_droppredr   r@   r   rA   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   r9   r@   r   r   r@   rA   r   /  r   z*IbisLazyFrame.join_asof.<locals>.<genexpr>)
operatorgeler   re   NotImplementedErrorr   	asof_joinr   r   )r?   r   r   r   r   r   r   r   r   strategy_opr   r   onrY   r   r   r@   r   rA   	join_asof  s   
zIbisLazyFrame.join_asofr0   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   re   )r   r   r   r   r?   r@   rA   r   8  s    z5IbisLazyFrame._convert_predicates.<locals>.<listcomp>)r   )r?   r   r   r   r@   r   rA   r   3  s
   z!IbisLazyFrame._convert_predicatesc                   s    fdd j  j D S )Nc                   r   r@   r   r   r[   r@   rA   r   >  r   z0IbisLazyFrame.collect_schema.<locals>.<dictcomp>)re   r   r   r   r[   r@   r[   rA   collect_schema=  s   
zIbisLazyFrame.collect_schemasubsetkeepr/   order_byc                C  s   |p| j }| | }r|td| j dd}|r&|dkr&tj|ddd}n|r2tj|ddd}ntd}tj||d	}|d
krJ| j	 
|}	nt 
|td }	| jjdi ||	itj| tdk|}
| |
S )N   
row_index_)prefixlastT
descending
nulls_lastF   )r   r   noner@   )ri   _check_columns_existr   r   _sortr
   r^   windowre   countover
row_numberr   r   r   r   r   )r?   r   r   r   subset_errortmp_name	order_by_r   exprr3   r@   r@   rA   uniqueC  s$   

zIbisLazyFrame.uniquebyr   bool | Sequence[bool]r   c                G  s0   ddl m} |j|||d}| | jj| S )Nr   r   r   )narwhals._ibis.exprr   r   r   re   r   )r?   r   r   r  r   colsr@   r@   rA   sort`  s   zIbisLazyFrame.sortkreversec                C  sT   ddl m} t|tr| ndd |D }|j||dd}| | jj| |S )Nr   r   c                 S  s   g | ]}| qS r@   r@   )r   elr@   r@   rA   r   i  s    z'IbisLazyFrame.top_k.<locals>.<listcomp>Tr   )	r  r   rF   r6   r   r   re   r   r   )r?   r
  r  r  r   descr  r@   r@   rA   top_kf  s   zIbisLazyFrame.top_kc                 C  s$   |d ur|n| j }| | j|S r9   )ri   r   re   	drop_null)r?   r   r   r@   r@   rA   
drop_nullsm  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 typer   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   lenr   r   re   unnest)r?   ri   r  r   r   r   rY   r@   r@   rA   explodeq  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@   rA   r     s    z)IbisLazyFrame.unpivot.<locals>.<listcomp>)names_to	values_to)ibis.selectors	selectorsri   r   r   fromkeysre   pivot_longerr  r   rf   )	r?   r   r  r  r  son_final_columns	unpivotedr@   r  rA   unpivot  s   zIbisLazyFrame.unpivotc                 C  s8   t  t j|d|t j g}| | jj	| S )N)r   )
r^   r   r   r   rb   r   allr   re   rf   )r?   rb   r   	to_selectr@   r@   rA   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.)rF   r   r   re   
to_parquet)r?   r+  rY   r@   r@   rA   sink_parquet  s   
zIbisLazyFrame.sink_parquet)r3   r4   r5   r   r2   r6   r7   r8   )rC   rD   r7   rE   )rJ   r4   rK   r(   r7   r   )r7   rP   )r7   r   )r7   r   )r7   r$   )rb   rc   r7   r&   )r7   rh   )rk   rl   rm   r   r7   r    )r~   r   r7   r   )r   rc   r7   r   )r   r   r7   r   )ri   r   r   r6   r7   r   r9   )rk   r8   r   r8   r7   r   )r   r   r7   r   )r7   r   )r7   r   )r7   r   )r7   r   )r5   r   r7   r   )r3   r4   r7   r   )r   r   r   r6   r7   r"   )r   r   r7   r   )r3   r4   ri   r   r7   r4   )r   r   r   r.   r   r   r   r   r   rc   r7   r   )r   r   r   rc   r   rc   r   r   r   r   r   r-   r   rc   r7   r   )r   r   r   r   r   r   r7   r0   )r   r   r   r/   r   r   r7   r   )r  rc   r   r  r   r6   r7   r   )r
  r   r  r   r  r  r7   r   )r   r   r7   r   )ri   r   r7   r   )
r   r   r  r   r  rc   r  rc   r7   r   )rb   rc   r   r   r7   r   )r+  r,  r7   r8   )3__name__
__module____qualname__r   IBIS_implementationrB   staticmethodrI   classmethodrO   rW   rZ   r\   r_   ra   rg   rj   r}   r   r   r   rf   r   rS   r   r   propertyr   ri   rx   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r  r'  r*  r.  r   _evaluate_window_exprr@   r@   r@   rA   r1   1   sb    









$



	


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










r1   )r   r4   rP   )L
__future__r   r   ior   typingr   r   r   r^   ibis.expr.typesr  typesrG   r  r   narwhals._ibis.utilsr	   r
   r   narwhals._sql.dataframer   narwhals._utilsr   r   r   r   r   r   r   r   narwhals.exceptionsr   collections.abcr   r   r   r   pathlibr   r   pandaspdpyarrowpaibis.expr.operationsr   typing_extensionsr   r   r   narwhals._compliant.typingr    r   r"   r`   r$   rd   r&   narwhals._typingr'   r(   narwhals.dataframer)   narwhals.dtypesr*   rU   r,   DataFrameV1narwhals.typingr-   r.   r/   r0   __annotations__r1   r@   r@   r@   rA   <module>   sD    (

