
    Wh@                       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mZ d d	lm Z  erwd 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ed   e      ZKy)    )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                     e Zd Zej                  Zdd	 	 	 	 	 	 	 d.dZed/d       Ze	d0d       Z
d1dZd2dZd2dZd3d	Zd4d
Zd5dZd6dZ	 	 	 	 	 	 d7dZd8dZd9dZd:dZd:dZd;dZd<d=dZd:dZd>dZed?d       Zed@d       ZdAdZdBdZdCdZ dDdZ!	 	 	 	 	 	 dEdZ"dFdZ#edGd       Z$	 	 	 	 	 	 	 	 	 	 	 	 dHd Z%	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dId!Z&	 	 	 	 	 	 	 	 dJd"Z'd?d#Z(	 	 	 	 	 	 	 	 dKd$Z)dLd%Z*dMd&Z+dNd'Z,dOd(Z-	 	 	 	 	 	 	 	 	 	 dPd)Z.dQd*Z/dRd+Z0 e1jd                  d,      Z3 e1jd                  d-      Z4 e1       Z5y)SIbisLazyFrameF)validate_backend_versionc               b    || _         || _        d | _        d | _        |r| j	                          y y N)_native_frame_version_cached_schema_cached_columns_validate_backend_version)selfdfversionr4   s       R/var/www/html/jupyter_env/lib/python3.12/site-packages/narwhals/_ibis/dataframe.py__init__zIbisLazyFrame.__init__7   s7     (*7;15#**, $    c                6    t        | t        j                        S r6   )
isinstanceirTable)objs    r?   
_is_nativezIbisLazyFrame._is_nativeA   s    #rxx((rA   c              *     | ||j                         S Nr>   )r8   )clsdatacontexts      r?   from_nativezIbisLazyFrame.from_nativeE   s    4!1!122rA   c                    | j                   t        j                  u rddlm}  || d      S | j                   j                  | d      S )Nr   r,   interchange)levellazy)r8   r   V1narwhals.stable.v1r-   	lazyframe)r<   r-   s     r?   to_narwhalszIbisLazyFrame.to_narwhalsI   s<    ==GJJ&4T77}}&&t6&::rA   c                X    | j                   t        j                  urd}t        |      | S )Nz;__narwhals_dataframe__ is not implemented for IbisLazyFrame)r8   r   rS   AttributeError)r<   msgs     r?   __narwhals_dataframe__z$IbisLazyFrame.__narwhals_dataframe__P   s'    ==

*OC %%rA   c                    | S r6    r<   s    r?   __narwhals_lazyframe__z$IbisLazyFrame.__narwhals_lazyframe__W   s    rA   c                    t         S r6   )ibisr]   s    r?   __native_namespace__z"IbisLazyFrame.__native_namespace__Z   s    rA   c                4    ddl m}  || j                        S )Nr   r$   rJ   )narwhals._ibis.namespacer%   r8   )r<   r%   s     r?   __narwhals_namespace__z$IbisLazyFrame.__narwhals_namespace__]   s    :T]]33rA   c                h    ddl m}  || j                  j                  |      | j                        S )Nr   r&   rJ   )narwhals._ibis.seriesr'   nativeselectr8   )r<   namer'   s      r?   
get_columnzIbisLazyFrame.get_columnb   s%    ?$T[[%7%7%=t}}UUrA   c              #  P   K   | j                   D ]  }| j                  |     y wr6   )columnsrg   )r<   ri   s     r?   _iter_columnszIbisLazyFrame._iter_columnsg   s(     LL 	$D++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)r4   r>   validate_column_names)PandasLikeDataFrame)implementationr4   r>   rp   )PolarsDataFrame)r4   r>   zUnsupported `backend` value: )r   PYARROWnarwhals._arrow.dataframero   r   rg   
to_pyarrowr8   PANDASnarwhals._pandas_like.dataframerq   	to_pandasPOLARSnarwhals._polars.dataframers   	to_polars
ValueError)r<   backendkwargsro   rq   rs   rY   s          r?   collectzIbisLazyFrame.collectk   s     ?g)?)??@! !7!7!9:)-&*	  n+++K&%%'-44)-&*  n+++B"%%')-  .gY7orA   c                V    | j                  | j                  j                  |            S r6   )_with_nativerg   head)r<   ns     r?   r   zIbisLazyFrame.head   s"      !1!1!!455rA   c                R    | j                   | j                  j                  |       S r6   )r   rg   rh   )r<   column_namess     r?   simple_selectzIbisLazyFrame.simple_select   s%      !3!3!3\!BCCrA   c           
         t        | g| D cg c]   \  }}t        d|j                  |            " }}}| j                  | j                  j                  |            S c c}}w )Nz	ir.Scalar)r
   r   ri   r   rg   	aggregate)r<   exprsri   val	selections        r?   r   zIbisLazyFrame.aggregate   se     ,D959
c chhtn-
	 
   !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
   ri   r}   rg   rh   r   )r<   r   ri   r   r   rY   ts          r?   rh   zIbisLazyFrame.select   sj    5CD5Q55QR	cSXXd^R	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r6   r\   ).0colcolumns_to_drops     r?   	<genexpr>z%IbisLazyFrame.drop.<locals>.<genexpr>   s     OSC4NSOs   	)r   rl   r   rg   rh   )r<   rl   r   r   r   s       @r?   dropzIbisLazyFrame.drop   sB    /gfMODLLO	  !3!3!3Y!?@@rA   Nc                $    |d}t        |      | S )Nz,`backend` argument is not supported for Ibis)r}   )r<   r~   _rY   s       r?   rR   zIbisLazyFrame.lazy   s    
 @CS/!rA   c                    t        t        | g|       }| j                   | j                  j                  di |      S )Nr\   )dictr
   r   rg   mutate)r<   r   new_columns_maps      r?   with_columnszIbisLazyFrame.with_columns   s<    ~d;U;<  !3!3!3!Fo!FGGrA   c                    t        d ||       d         }| j                  | j                  j                  |            S )Nzir.BooleanValuer   )r   r   rg   filter)r<   	predicatemasks      r?   r   zIbisLazyFrame.filter   s8    %yq'9:  !3!3D!9::rA   c           	         | j                   _| j                  j                         j                  j	                         D ci c]  \  }}|t        || j                         c}}| _         | j                   S c c}}w r6   )r9   rg   schemafieldsitemsr   r8   r<   ri   dtypes      r?   r   zIbisLazyFrame.schema   so    &
 $(;;#5#5#7#>#>#D#D#F#D% .udmmDD#D """	#s   !A8c                    | j                   E| j                  t        | j                        nt        | j                  j
                        | _         | j                   S r6   )r:   r9   listr   rg   rl   r]   s    r?   rl   zIbisLazyFrame.columns   sR    ' &&2 T[[!$++--.  
 ###rA   c                6    | j                   j                         S r6   )rg   ry   r]   s    r?   ry   zIbisLazyFrame.to_pandas   s    {{$$&&rA   c                6    | j                   j                         S r6   )rg   rv   r]   s    r?   to_arrowzIbisLazyFrame.to_arrow   s    {{%%''rA   c                <    | j                  | j                  |      S rI   )	__class__rg   )r<   r>   s     r?   _with_versionzIbisLazyFrame._with_version   s    ~~dkk7~;;rA   c                <    | j                  || j                        S rI   )r   r8   )r<   r=   s     r?   r   zIbisLazyFrame._with_native   s    ~~b$--~88rA   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ErA   c                d    dfd}| j                  | j                  j                  |            S )Nc                (    j                  | |       S r6   )get)r   mappings    r?   _renamez%IbisLazyFrame.rename.<locals>._rename   s    ;;sC((rA   )r   strreturnr   )r   rg   rename)r<   r   r   s    ` r?   r   zIbisLazyFrame.rename   s*    	)   !3!3G!<==rA   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.)setrl   intersectionr   )r=   rl   
duplicatess      r?   _join_drop_duplicate_columnsz*IbisLazyFrame._join_drop_duplicate_columns   s4     _11':
'1wrww
#9r9rA   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r6   r\   r   r   suffixs     r?   r   z%IbisLazyFrame.join.<locals>.<genexpr>
       8!1v:8   c              3  r   K   | ]/  }t        |t              rt        d |j                                1 yw)r   N)rC   r   r   op)r   ps     r?   r   z%IbisLazyFrame.join.<locals>.<genexpr>  s'     WQJqRUDV$x(Ws   77)r   rg   viewjoin_convert_predicatesr   rightri   rl   r   appendr   )r<   otherr   left_onright_onr   
how_nativer   joined
predicatesright_namesitto_droppredr   s        `         r?   r   zIbisLazyFrame.join   sb    !$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.  ((rA   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r6   r\   r   s     r?   r   z*IbisLazyFrame.join_asof.<locals>.<genexpr>/  r   r   )
operatorgeler   rg   NotImplementedErrorr   	asof_joinr   r   )r<   r   r   r   by_leftby_rightstrategyr   r   strategy_opr   r   onrY   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  ((rA   c           
         ||k(  r|S t        ||      D cg c].  \  }}t        d| j                  |   |j                  |   k(        0 c}}S c c}}w )Nzir.BooleanColumn)r   r   rg   )r<   r   r   r   r   r   s         r?   r   z!IbisLazyFrame._convert_predicates3  s]     hN  *'8<
e #dkk$&75<<;N&NP
 	
 
s   3Ac           	         | j                   j                         j                  j                         D ci c]  \  }}|t	        || j
                         c}}S c c}}w r6   )rg   r   r   r   r   r8   r   s      r?   collect_schemazIbisLazyFrame.collect_schema=  sU      ${{113::@@B
e *5$--@@
 	
 
s   !Ac                  |xs | j                   }| j                  |      x}r|t        d| j                         }|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   lastT
descending
nulls_lastF   )r   order_bynoner\   )rl   _check_columns_existr   r	   _sortr   r`   windowrg   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\\B TdSI UuUIAIg	B6>;;$$&++F3D??$))&1CF:DDKK2(D!12VDFF8$A./T(^ 	
   $$rA   c                   ddl m}  |j                  |||d}| j                   | j                  j
                  |       S )Nr   r   r   )narwhals._ibis.exprr	   r   r   rg   r   )r<   r   r   byr	   colss         r?   sortzIbisLazyFrame.sort`  s<    0x~~rjZP  !5!5!5t!<==rA   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	   rC   boolr   r   rg   r   r   )r<   kr  reverser	   eldescr  s           r?   top_kzIbisLazyFrame.top_kf  sl    0($77{w=W"f=Wx~~rdtD  !5!5!5t!<!A!A!!DEE >Xs   
A5c                v    ||n| j                   }| j                  | j                  j                  |            S r6   )rl   r   rg   	drop_null)r<   r  r  s      r?   
drop_nullszIbisLazyFrame.drop_nullsm  s2    ".&DLL  !6!6w!?@@rA   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)
r8   dtypesr   Listr   lenr   r   rg   unnest)r<   rl   r  r   r   r   rY   s          r?   explodezIbisLazyFrame.explodeq  s    %%$$& 	1C3KE#CE7 K) )  ,C00	1 w<1^  &c**  !3!3GAJ4!3!PQQrA   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	selectorsrl   r   r   fromkeysrg   pivot_longerr  r   rh   )r<   r   indexvariable_name
value_namesindex_con_final_columns	unpivoteds              r?   unpivotzIbisLazyFrame.unpivot  s     	#&+m<>J81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   ri   r%  allr   rg   rh   )r<   ri   r   	to_selects       r?   with_row_indexzIbisLazyFrame.with_row_index  sg    OO""4;;#ABGGMNN 
	   !3!3!3Y!?@@rA   c                t    t        |t              rd}t        |      | j                  j	                  |       y )Nz5Writing to BytesIO is not supported for Ibis backend.)rC   r   r   rg   
to_parquet)r<   filerY   s      r?   sink_parquetzIbisLazyFrame.sink_parquet  s.    dG$IC%c**t$rA   zO`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.)r=   ir.Tabler>   r   r4   r  r   None)rF   zir.Table | Anyr   zTypeIs[ir.Table])rL   r:  rM   r)   r   r   )r   +LazyFrame[ir.Table] | DataFrameV1[ir.Table])r   r   )r   r   )r   r%   )ri   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   )rl   Sequence[str]r   r  r   r   r6   )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:  rl   Iterable[str]r   r:  )r   r   r   r/   r   Sequence[str] | Noner   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   r1   )r  r@  r  r0   r   r@  r   r   )r  r   r   bool | Sequence[bool]r   r  r   r   )r  r=  r  r?  r  rA  r   r   )r  r@  r   r   )rl   r>  r   r   )
r   r@  r(  r@  r)  r   r*  r   r   r   )ri   r   r   r>  r   r   )r8  zstr | Path | BytesIOr   r;  )6__name__
__module____qualname__r   IBIS_implementationr@   staticmethodrG   classmethodrN   rV   rZ   r^   ra   rd   rj   rm   r   r   r   r   rh   r   rR   r   r   propertyr   rl   ry   r   r   r   r   r   r   r   r   r   r   r
  r  r  r  r   r1  r5  r9  r   
deprecatedgather_everytail_evaluate_window_exprr\   rA   r?   r3   r3   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% .?--YL &?%%QD
 ,-rA   r3   )r	   r:  r<  )L
__future__r   r   ior   typingr   r   r   r`   ibis.expr.typesr	  typesrD   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#   rc   r%   rf   r'   narwhals._typingr(   r)   narwhals.dataframer*   narwhals.dtypesr+   rT   r-   DataFrameV1narwhals.typingr.   r/   r0   r1   __annotations__r3   r\   rA   r?   <module>rf     s    "   + +    ( N N 0	 	 	 6EE +99@36;2/,%;RR LNILA.VWA.rA   