
    O3j@                       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c 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 d d	lmZ er{d d
l m!Z!m"Z"m#Z#m$Z$ d dl%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/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dlm<Z< d dl=m>Z> d dl?m@Z@ d dlAmBZC d dlDmEZEmFZFmGZG dZHdeId<    G d ded   e      ZJy)     )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)InvalidOperationError)IterableIteratorMappingSequence)Path)
ModuleType)	TypeAlias)Binary)SelfTypeIs)CompliantDataFrameAnyIbisGroupByIbisNamespaceIbisInterchangeSeries)_EagerAllowedImpl)_LimitedContext)	LazyFrame)DType	DataFrame)AsofJoinStrategyJoinStrategyUniqueKeepStrategyz*Sequence[ir.BooleanColumn] | Sequence[str]r   JoinPredicatesc                  L   e Zd Zej                  Zdd	 	 	 	 	 	 	 d,dZed-d       Ze	d.d       Z
d/dZd0dZd0dZd1d	Zd2d
Zd3dZd4dZ	 	 	 	 	 	 d5dZd6dZd7dZd8dZd8dZd9dZd:d;dZd8dZd<dZed=d       Zed>d       Zd?dZd@dZdAdZ dBdZ!	 	 	 	 	 	 dCdZ"dDdZ#edEd       Z$	 	 	 	 	 	 	 	 	 	 	 	 dFd Z%	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dGd!Z&	 	 	 	 	 	 	 	 dHd"Z'd=d#Z(	 	 	 	 	 	 	 	 dId$Z)dJd%Z*dKd&Z+dLd'Z,dMd(Z-	 	 	 	 	 	 	 	 	 	 dNd)Z.dOd*Z/dPd+Z0 e1       Z2 e1       Z3y)QIbisLazyFrameF)validate_backend_versionc               b    || _         || _        d | _        d | _        |r| j	                          y y N)_native_frame_version_cached_schema_cached_columns_validate_backend_version)selfdfversionr3   s       E/DATA/.local/lib/python3.12/site-packages/narwhals/_ibis/dataframe.py__init__zIbisLazyFrame.__init__7   s7     (*7;15#**, $    c                6    t        | t        j                        S r5   )
isinstanceirTable)objs    r>   
_is_nativezIbisLazyFrame._is_nativeA   s    #rxx((r@   c              *     | ||j                         S Nr=   )r7   )clsdatacontexts      r>   from_nativezIbisLazyFrame.from_nativeE   s    4!1!122r@   c                    | j                   t        j                  u rddlm}  || d      S | j                   j                  | d      S )Nr   r+   interchange)levellazy)r7   r   V1narwhals.stable.v1r,   	lazyframe)r;   r,   s     r>   to_narwhalszIbisLazyFrame.to_narwhalsI   s<    ==GJJ&4T77}}&&t6&::r@   c                X    | j                   t        j                  urd}t        |      | S )Nz;__narwhals_dataframe__ is not implemented for IbisLazyFrame)r7   r   rR   AttributeError)r;   msgs     r>   __narwhals_dataframe__z$IbisLazyFrame.__narwhals_dataframe__P   s'    ==

*OC %%r@   c                    | S r5    r;   s    r>   __narwhals_lazyframe__z$IbisLazyFrame.__narwhals_lazyframe__W   s    r@   c                    t         S r5   )ibisr\   s    r>   __native_namespace__z"IbisLazyFrame.__native_namespace__Z   s    r@   c                4    ddl m}  || j                        S )Nr   r#   rI   )narwhals._ibis.namespacer$   r7   )r;   r$   s     r>   __narwhals_namespace__z$IbisLazyFrame.__narwhals_namespace__]   s    :T]]33r@   c                h    ddl m}  || j                  j                  |      | j                        S )Nr   r%   rI   )narwhals._ibis.seriesr&   nativeselectr7   )r;   namer&   s      r>   
get_columnzIbisLazyFrame.get_columnb   s%    ?$T[[%7%7%=t}}UUr@   c              #  P   K   | j                   D ]  }| j                  |     y wr5   )columnsrf   )r;   rh   s     r>   _iter_columnszIbisLazyFrame._iter_columnsg   s#     LLD++d## !s   $&c                   ||t         j                  u r=ddlm}  |t	        | j
                  j                               d| j                  d      S |t         j                  u rCddl	m
}  || j
                  j                         t         j                  d| j                  d      S |t         j                  u r3ddlm}  || j
                  j                         d| j                        S d	| }t!        |      )
Nr   )ArrowDataFrameT)r3   r=   validate_column_names)PandasLikeDataFrame)implementationr3   r=   ro   )PolarsDataFrame)r3   r=   zUnsupported `backend` value: )r   PYARROWnarwhals._arrow.dataframern   r   rf   
to_pyarrowr7   PANDASnarwhals._pandas_like.dataframerp   	to_pandasPOLARSnarwhals._polars.dataframerr   	to_polars
ValueError)r;   backendkwargsrn   rp   rr   rX   s          r>   collectzIbisLazyFrame.collectk   s     ?g)?)??@! !7!7!9:)-&*	  n+++K&%%'-44)-&*  n+++B"%%')-  .gY7or@   c                V    | j                  | j                  j                  |            S r5   )_with_nativerf   head)r;   ns     r>   r   zIbisLazyFrame.head   s"      !1!1!!455r@   c                R    | j                   | j                  j                  |       S r5   )r   rf   rg   )r;   column_namess     r>   simple_selectzIbisLazyFrame.simple_select   s%      !3!3!3\!BCCr@   c           
         t        | g| D cg c]   \  }}t        d|j                  |            " }}}| j                  | j                  j                  |            S c c}}w )Nz	ir.Scalar)r
   r   rh   r   rf   	aggregate)r;   exprsrh   val	selections        r>   r   zIbisLazyFrame.aggregate   sh     ,D959
9	c chhtn-9 	 
   !6!6y!ABB	
s   %A"c                    t        | g| D cg c]  \  }}|j                  |       }}}|sd}t        |       | j                  j                  | }| j                  |      S c c}}w )NzKAt least one expression must be provided to `select` with the Ibis backend.)r
   rh   r|   rf   rg   r   )r;   r   rh   r   r   rX   ts          r>   rg   zIbisLazyFrame.select   sm    5CD5Q55QR5Q	cSXXd^5Q	R_CS/!DKK	*  ## Ss   A'c                   t        | ||      fd| j                  D        }| j                   | j                  j                  |       S )Nstrictc              3  ,   K   | ]  }|vs|  y wr5   r[   ).0colcolumns_to_drops     r>   	<genexpr>z%IbisLazyFrame.drop.<locals>.<genexpr>   s     OLSC4NSLs   	)r   rk   r   rf   rg   )r;   rk   r   r   r   s       @r>   dropzIbisLazyFrame.drop   sB    /gfMODLLO	  !3!3!3Y!?@@r@   Nc                $    |d}t        |      | S )Nz,`backend` argument is not supported for Ibis)r|   )r;   r}   _rX   s       r>   rQ   zIbisLazyFrame.lazy   s    
 @CS/!r@   c                    t        t        | g|       }| j                   | j                  j                  di |      S )Nr[   )dictr
   r   rf   mutate)r;   r   new_columns_maps      r>   with_columnszIbisLazyFrame.with_columns   s<    ~d;U;<  !3!3!3!Fo!FGGr@   c                    t        d ||       d         }| j                  | j                  j                  |            S )Nzir.BooleanValuer   )r   r   rf   filter)r;   	predicatemasks      r>   r   zIbisLazyFrame.filter   s8    %yq'9:  !3!3D!9::r@   c           	         | j                   _| j                  j                         j                  j	                         D ci c]  \  }}|t        || j                         c}}| _         | j                   S c c}}w r5   )r8   rf   schemafieldsitemsr   r7   r;   rh   dtypes      r>   r   zIbisLazyFrame.schema   st    &
 $(;;#5#5#7#>#>#D#D#F##FKD% .udmmDD#F#D """	#s   !A8c                    | j                   E| j                  t        | j                        nt        | j                  j
                        | _         | j                   S r5   )r9   r8   listr   rf   rk   r\   s    r>   rk   zIbisLazyFrame.columns   sR    ' &&2 T[[!$++--.  
 ###r@   c                6    | j                   j                         S r5   )rf   rx   r\   s    r>   rx   zIbisLazyFrame.to_pandas   s    {{$$&&r@   c                6    | j                   j                         S r5   )rf   ru   r\   s    r>   to_arrowzIbisLazyFrame.to_arrow   s    {{%%''r@   c                <    | j                  | j                  |      S rH   )	__class__rf   )r;   r=   s     r>   _with_versionzIbisLazyFrame._with_version   s    ~~dkk7~;;r@   c                <    | j                  || j                        S rH   )r   r7   )r;   r<   s     r>   r   zIbisLazyFrame._with_native   s    ~~b$--~88r@   c               $    ddl m}  || ||      S )Nr   r!   )drop_null_keys)narwhals._ibis.group_byr"   )r;   keysr   r"   s       r>   group_byzIbisLazyFrame.group_by   s     	84nEEr@   c                d    dfd}| j                  | j                  j                  |            S )Nc                (    j                  | |       S r5   )get)r   mappings    r>   _renamez%IbisLazyFrame.rename.<locals>._rename   s    ;;sC((r@   )r   strreturnr   )r   rf   rename)r;   r   r   s    ` r>   r   zIbisLazyFrame.rename   s*    	)   !3!3G!<==r@   c               p    t        | j                        j                  |      }|r | j                  | S | S )zWIbis adds a suffix to the right table col, even when it matches the left during a join.)setrk   intersectionr   )r<   rk   
duplicatess      r>   _join_drop_duplicate_columnsz*IbisLazyFrame._join_drop_duplicate_columns   s4     _11':
'1wrww
#9r9r@   c                  |dk(  rdn|}dz   }|| k(  r)| j                  |j                  j                               }|dk(  r9| j                  j                  |j                  ||      }| j                  |      S |J |J | j	                  |||      }	| j                  j                  |j                  |	||      }|dk(  rfd|D        }
| j                  ||
      }d |	D        }g }|D ]R  }|j                  j                  }|| j                  vs(|j                  j                  |k7  sB|j                  |       T |r |j                  | }| j                  |      S )	Nfullouter{name}cross)howrnameleftc              3  (   K   | ]	  }|z     y wr5   r[   r   r   suffixs     r>   r   z%IbisLazyFrame.join.<locals>.<genexpr>
       8x!1v:x   c              3  r   K   | ]/  }t        |t              rt        d |j                                1 yw)r   N)rB   r   r   op)r   ps     r>   r   z%IbisLazyFrame.join.<locals>.<genexpr>  s(     W*QJqRUDV$x(*s   77)r   rf   viewjoin_convert_predicatesr   rightrh   rk   r   appendr   )r;   otherr   left_onright_onr   
how_nativer   joined
predicatesright_namesitto_droppredr   s        `         r>   r   zIbisLazyFrame.join   s]    !$vW3
6!D=%%ell&7&7&9:E [[%%ell
%%PF$$V,,"""###--eWhG
!!%,,

RW!X8x8K66v{KFW*WBG

,51HNN5)	 
 $g.  ((r@   c                  dz   }t         j                  t         j                  d}	g }
|	j                  |      x}r$ || j                  |   |j                  |         }nd}t        |      ||| j                  |||      }
| j                  j                  |j                  ||
|      }| j                  ||z   g      }|fd|D        }| j                  ||      }| j                  |      S )Nr   )backwardforwardzIOnly `backward` and `forward` strategies are currently supported for Ibis)r   c              3  (   K   | ]	  }|z     y wr5   r[   r   s     r>   r   z*IbisLazyFrame.join_asof.<locals>.<genexpr>/  r   r   )
operatorgeler   rf   NotImplementedErrorr   	asof_joinr   r   )r;   r   r   r   by_leftby_rightstrategyr   r   strategy_opr   r   onrX   r   r   s          `        r>   	join_asofzIbisLazyFrame.join_asof  s     6!#+;;8;;G%'
**2*#%dkk'&:ELL<R#SB]C%c**8#711%(KJ&&u||R5&Q226Hv<M;NO8x8K66v{KF  ((r@   c           
         ||k(  r|S t        ||d      D cg c].  \  }}t        d| j                  |   |j                  |   k(        0 c}}S c c}}w )NTr   zir.BooleanColumn)zipr   rf   )r;   r   r   r   r   r   s         r>   r   z!IbisLazyFrame._convert_predicates3  sd     hN  #7HTB
Be #dkk$&75<<;N&NPB
 	
 
s   3Ac           	         | j                   j                         j                  j                         D ci c]  \  }}|t	        || j
                         c}}S c c}}w r5   )rf   r   r   r   r   r7   r   s      r>   collect_schemazIbisLazyFrame.collect_schema=  sZ      ${{113::@@B
Be *5$--@@B
 	
 
s   !Ac                  |xs | j                   }| j                  |      x}r|t        d| j                   d      }|r|dk(  rt        j                  |ddd}n$|rt        j                  |ddd}nt        d      }t        j                  ||	      }|d
k(  r*| j                  j                         j                  |      }	n/t        j                         j                  |      t        d      z   }	 | j                  j                  di ||	ij                  t        j                  |   t        d      k(        j                  |      }
| j!                  |
      S )N   
row_index_)prefixlastT
descending
nulls_lastF   )r   order_bynoner[   )rk   _check_columns_existr   r	   _sortr   r_   windowrf   countover
row_numberr   r   r   r   r   )r;   subsetkeepr   subset_errortmp_name	order_by_r  exprr<   s              r>   uniquezIbisLazyFrame.uniqueC  s%    (DLL--g6656K1!T\\,W TdSI UuUIAIg	B6>;;$$&++F3D??$))&1CF:DDKK2(D!12VDFF8$A./T(^ 	
   $$r@   c                   ddl m}  |j                  |||d}| j                   | j                  j
                  |       S )Nr   r   r   )narwhals._ibis.exprr	   r  r   rf   r   )r;   r   r   byr	   colss         r>   sortzIbisLazyFrame.sort`  s<    0x~~rjZP  !5!5!5t!<==r@   c                   ddl m} t        |t              r| n|D cg c]  }|  c}} |j                  ||dd}| j                   | j                  j                  | j                  |            S c c}w )Nr   r   Tr   )	r  r	   rB   boolr  r   rf   r   r   )r;   kr  reverser	   eldescr  s           r>   top_kzIbisLazyFrame.top_kf  sp    0($77{w=Ww"fw=Wx~~rdtD  !5!5!5t!<!A!A!!DEE >Xs   
A5c                v    ||n| j                   }| j                  | j                  j                  |            S r5   )rk   r   rf   	drop_null)r;   r  r  s      r>   
drop_nullszIbisLazyFrame.drop_nullsm  s2    ".&DLL  !6!6w!?@@r@   c                :   | j                   j                  }| j                         }|D ]'  }||   }||j                  k7  sd| d}t	        |       t        |      dk7  rd}t        |      | j                  | j                  j                  |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)
r7   dtypesr   Listr   lenr   r   rf   unnest)r;   rk   r  r   r   r   rX   s          r>   explodezIbisLazyFrame.explodeq  s    %%$$&C3KE#CE7 K) )  ,C00  w<1^  &c**  !3!3GAJ4!3!PQQr@   c                D   dd l m} |g n|}|| j                  D cg c]	  }||vs| c}n|}t        t        j                  g |||            }	| j                  j                   |j                  | ||      }
| j                   |
j                  |	       S c c}w )Nr   )names_to	values_to)ibis.selectors	selectorsrk   r   r   fromkeysrf   pivot_longerr  r   rg   )r;   r   indexvariable_name
value_namesindex_con_final_columns	unpivoteds              r>   unpivotzIbisLazyFrame.unpivot  s     	#&+m<>J81Q8B 	
 T]]+OV+O]+OJ+OPQKK,,AFFCL=J - 
	   !1!1!1=!ABB 9s
   	BBc                   t        j                         j                  t        j                  |            j	                  |      t         j
                  j                         g}| j                   | j                  j                  |       S )N)r   )
r_   r  r  r  rh   r(  allr   rf   rg   )r;   rh   r   	to_selects       r>   with_row_indexzIbisLazyFrame.with_row_index  sg    OO""4;;#ABGGMNN 
	   !3!3!3Y!?@@r@   c                t    t        |t              rd}t        |      | j                  j	                  |       y )Nz5Writing to BytesIO is not supported for Ibis backend.)rB   r   r   rf   
to_parquet)r;   filerX   s      r>   sink_parquetzIbisLazyFrame.sink_parquet  s.    dG$IC%c**t$r@   )r<   ir.Tabler=   r   r3   r  r   None)rE   zir.Table | Anyr   zTypeIs[ir.Table])rK   r=  rL   r(   r   r   )r   +LazyFrame[ir.Table] | DataFrameV1[ir.Table])r   r   )r   r   )r   r$   )rh   r   r   r&   )r   zIterator[ir.Expr])r}   z_EagerAllowedImpl | Noner~   r   r   r    )r   intr   r   )r   r   r   r   )r   r	   r   r   )rk   Sequence[str]r   r  r   r   r5   )r}   r>  r   r>  r   r   )r   r	   r   r   )r   zdict[str, DType])r   z	list[str])r   zpd.DataFrame)r   zpa.Table)r=   r   r   r   )r<   r=  r   r   )r   z"Sequence[str] | Sequence[IbisExpr]r   r  r   r"   )r   zMapping[str, str]r   r   )r<   r=  rk   Iterable[str]r   r=  )r   r   r   r.   r   Sequence[str] | Noner   rC  r   r   r   r   )r   r   r   r   r   r   r   rC  r   rC  r   r-   r   r   r   r   )r   r   r   rA  r   rA  r   r0   )r  rC  r  r/   r   rC  r   r   )r  r   r   bool | Sequence[bool]r   r  r   r   )r  r@  r  rB  r  rD  r   r   )r  rC  r   r   )rk   rA  r   r   )
r   rC  r+  rC  r,  r   r-  r   r   r   )rh   r   r   rA  r   r   )r;  zstr | Path | BytesIOr   r>  )4__name__
__module____qualname__r   IBIS_implementationr?   staticmethodrF   classmethodrM   rU   rY   r]   r`   rc   ri   rl   r   r   r   r   rg   r   rQ   r   r   propertyr   rk   rx   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r#  r4  r8  r<  r   _evaluate_window_expr_filterr[   r@   r>   r2   r2   1   s    %))O SX--(/-KO-	- ) ) 3 3;4
V
$"/";>"	"H6DC$A
H;
 # # $ $'(<9F6FKOF	F> : :
")") 	")
 &") '") ") 
")H)) 	)
 ) &) ') #) ) 
)8

$1
=J
	

%$% !	%
 '% 
%:>FAR,C C $C 	C
 C 
C,A% ,-Gr@   r2   )r	   r=  r?  )K
__future__r   r   ior   typingr   r   r   r_   ibis.expr.typesr  typesrC   r  r	   narwhals._ibis.utilsr
   r   r   narwhals._sql.dataframer   narwhals._utilsr   r   r   r   r   r   r   narwhals.exceptionsr   collections.abcr   r   r   r   pathlibr   r   r   pandaspdpyarrowpaibis.expr.operationsr   typing_extensionsr   r   narwhals._compliant.typingr    r   r"   rb   r$   re   r&   narwhals._typingr'   r(   narwhals.dataframer)   narwhals.dtypesr*   rS   r,   DataFrameV1narwhals.typingr-   r.   r/   r0   __annotations__r2   r[   r@   r>   <module>rg     s    "   + +    ( N N 0   6EE  +.@36;2/,%;RR LNIL{ VW{ r@   