L iOddlmZddlmZddlmZddlmZmZddl Z ddl m Z ddl m Z m Z mZmZmZmZmZmZmZddlmZdd lmZmZmZmZmZmZmZmZdd l m!Z!dd l"m#Z#erdd l$m%Z%m&Z&m'Z'm(Z(dd l)m*Z*ddl+m,Z,ddl-m.Z.ddl/Z0ddl1Z2ddl m3Z3ddl4m5Z5m6Z6ddl7m8Z8ddl9m:Z:ddl;mZ>ddl?m@Z@ddl mAZAddlBmCZCddlmDZDddlEmFZFddlGmHZHddlImJZKddlLmMZMmNZNmOZOGdded eZPy)!) annotations)reduce)and_) TYPE_CHECKINGAnyN)StarExpression) DeferredTimeZoneFcatch_duckdb_exceptioncolevaluate_exprs_and_aliasesjoin_column_nameslitnative_to_narwhals_dtypewindow_expression) SQLLazyFrame)ImplementationValidateBackendVersionVersion extend_boolgenerate_temporary_column_nameparse_columns_to_droprequires zip_strict get_duckdb)InvalidOperationError)IterableIteratorMappingSequence)BytesIO)Path) ModuleType) Expression)SelfTypeIs)CompliantDataFrameAny) DuckDBExpr DuckDBGroupByDuckDBNamespaceDuckDBInterchangeSeries) duckdb_dtypes)_EagerAllowedImpl)_LimitedContext) LazyFrame)DType DataFrame)AsofJoinStrategy JoinStrategyUniqueKeepStrategycZeZdZejZdd d,dZed-dZe d.dZ e d/dZ d0dZ d1dZd1d Zd2d Zd3d Zd4d Zd5d Z d6dZd7dZd8dZd9dZd9dZd:dZd;ddZed?dZd@dZdAdZ dBdZ!dCdZ" dDdZ#dEdZ$ dFd Z% dGd!Z&d>d"Z' dHd#Z(dId$Z)dJd%Z*dKd&Z+dLd'Z, dMd(Z-e.j^d)dNd*Z0dOd+Z1y)PDuckDBLazyFrameF)validate_backend_versioncb||_||_d|_d|_|r|j yyN) _native_frame_version_cached_native_schema_cached_columns_validate_backend_version)selfdfversionr<s `/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/narwhals/_duckdb/dataframe.py__init__zDuckDBLazyFrame.__init__Fs779 SW"15 #  * * , $c6|jjSr>)_implementation_backend_versionrDs rGrLz DuckDBLazyFrame._backend_versionTs##4466rIc6t|tjSr>) isinstanceduckdbDuckDBPyRelation)objs rG _is_nativezDuckDBLazyFrame._is_nativeXs#v6677rIc*|||jSNrF)r@)clsdatacontexts rG from_nativezDuckDBLazyFrame.from_native\s4!1!122rIc|jtjurddlm}||dS|jj |dS)Nrr5 interchange)levellazy)r@rV1narwhals.stable.v1r6 lazyframe)rDargskwds DataFrameV1s rG to_narwhalszDuckDBLazyFrame.to_narwhalsbs> ==GJJ & Ct=9 9}}&&t6&::rIcX|jtjur d}t||S)Nz=__narwhals_dataframe__ is not implemented for DuckDBLazyFrame)r@rr_AttributeError)rDmsgs rG__narwhals_dataframe__z&DuckDBLazyFrame.__narwhals_dataframe__ks' == *QC % % rIc|Sr>rMs rG__narwhals_lazyframe__z&DuckDBLazyFrame.__narwhals_lazyframe__rs rIctSr>rrMs rG__native_namespace__z$DuckDBLazyFrame.__native_namespace__us |rIc4ddlm}||jS)Nrr,rV)narwhals._duckdb.namespacer-r@)rDr-s rG__narwhals_namespace__z&DuckDBLazyFrame.__narwhals_namespace__xs>t}}55rIchddlm}||jj||jS)Nrr.rV)narwhals._duckdb.seriesr/nativeselectr@)rDnamer/s rG get_columnzDuckDBLazyFrame.get_column}s%C&t{{'9'9$'?WWrIc#HK|jD]}t|ywr>)columnsr )rDrvs rG _iter_columnszDuckDBLazyFrame._iter_columnss"LL Dd)O s "c >||tjur`ddlm}|jdkr|j j }n|j j}||d|jdS|tjurCddl m }||j jtjd|jdS|tjur3ddlm}||j j!d|j Sd |}t#|) Nr)ArrowDataFrame)T)r<rFvalidate_column_names)PandasLikeDataFrame)implementationr<rFr)PolarsDataFrame)r<rFzUnsupported `backend` value: )rPYARROWnarwhals._arrow.dataframer|rLrtarrowfetch_arrow_tabler@PANDASnarwhals._pandas_like.dataframerrEPOLARSnarwhals._polars.dataframerpl ValueError)rDbackendkwargsr|retrrrhs rGcollectzDuckDBLazyFrame.collects ?g)?)?? @$$v-kk'')kk335!)- &*   n++ + K&  -44)- &*   n++ + B"  4 .gY7orIcV|j|jj|Sr>) _with_nativertlimit)rDns rGheadzDuckDBLazyFrame.heads"  !2!21!566rIcR|j|jj|Sr>)rrtru)rD column_namess rG simple_selectzDuckDBLazyFrame.simple_selects%  !3!3!3\!BCCrIct|g|Dcgc]\}}|j|}}} |j|jj |Scc}}w#t $r}t ||dd}~wwxYwr>)r aliasrrt aggregate Exceptionr )rDexprsrvval selectiones rGrzDuckDBLazyFrame.aggregates}-G-Uu-U )cCIIdO   <$$T[[%:%:9%EF F   <(D1t ; r).0rvrs rG z)DuckDBLazyFrame.select..s! )cCIIdO  )r rrtrurr )rDrrrs rGruzDuckDBLazyFrame.selectsb -G-Uu-U  <$$%7T[[%7%7%CD D <(D1t ; r)rrvvalues rGrz/DuckDBLazyFrame.with_columns..sSKD%ekk$'Sr) dictr rypoprr extenditemsrrtrurr )rDrnew_columns_maprvresultrs rG with_columnszDuckDBLazyFrame.with_columnss9$GGH   &    % + +D 1T    S?;P;P;RSS <$$%7T[[%7%7%@A A  <(D1t ; > 9(D1q 8 9s)7 A A  Ac z|j8tt|j|jj |_t |j}t|jj|jj Dcic]\}}|t||j|c}}Scc}}wr>) rArzipryrttypesr rrr@)rDdeferred_time_zone column_name duckdb_dtypes rGschemazDuckDBLazyFrame.schemas  % % -*.c$,, @Q@Q.R)SD &-dkk: .8 ##T[[%6%6.  * \ 1dmm-?    s"B7c|j<|jt|jn|jj |_|jSr>)rBrAlistrrtryrMs rGryzDuckDBLazyFrame.columnssM    '--9T[[![[((  ###rIc6|jjSr>)rtrErMs rG to_pandaszDuckDBLazyFrame.to_pandass{{~~rIcp|jjtjjSr>)r^rrrrtrMs rGto_arrowzDuckDBLazyFrame.to_arrows%yy{"">#9#9:AAArIc<|j|j|SrU) __class__rt)rDrFs rG _with_versionzDuckDBLazyFrame._with_version s~~dkk7~;;rIc<|j||jSrU)rr@)rDrEs rGrzDuckDBLazyFrame._with_natives~~b$--~88rIc$ddlm}||||S)Nrr*)drop_null_keys)narwhals._duckdb.group_byr+)rDkeysrr+s rGgroup_byzDuckDBLazyFrame.group_bys <T4GGrIc|j}fd|jD}|j|jj|S)Nc3vK|]0}|vrt|j|n t|2ywr>)r r)rrvmappings rGrz)DuckDBLazyFrame.rename..s9 /3goCIOOGDM *3t9 L s69)rtryrru)rDrrErs ` rGrenamezDuckDBLazyFrame.renamesD [[     !3!3!3Y!?@@rIcr|dk(rdn|}|dk(rm|jdkrd|j}t||jjdj |jjd}nq|J|Jdt ||D} t t| } |jjdj|jjd| | }|d vr|jD cgc]} td | d } } |jD]} | |jv}|dk(r!|s| jtd | d 7|dk(s|r8|| |vr2| jtd | d j| |v|| |vs}| jt| |j| j|jj}n4|jdj|jj}|j|Scc} w)Nfulloutercross)r}r}r~z;'duckdb>=1.1.4' is required for cross-join, found version: lhsrhsc3`K|]&\}}td|dtd|dk((ywlhs.""rhs."Nr rleftrights rGrz'DuckDBLazyFrame.join..5s<D%eD6O$eE7!,<(==,.) conditionhow>rrinnerrrrrlhs.*)rLNotImplementedErrorrt set_aliasrrrrjoinryr appendrrur)rDotherrleft_onright_onsuffix native_howrhrelitrxrurv col_in_lhsress rGrzDuckDBLazyFrame.join!s"!$v W3  $$y0STXTiTiSjk)#..++''.44U\\5K5KE5RSC& &&' ''#-gx#@B%+4$4I++''.33 &&u-# 4C < <15>AcE!A,'>F> -#'4<<#7 (MM#dV1o"67 G+H$4H8LMM#dV1o"6"<"<vfX=N"OP%X)=MM#d), -#**f%// 0A0ABC**W%// 0A0ABC  %%?s?H4c |j}|j} g} |%|#| jdt||Dngx}}|dk(r/| jt d|dt d|dk\nA|dk(r/| jt d|dt d|dkn d} t | t t| } dg} | jD]a}||jvr$|||h|vr| jd|d ||d5|||h|vs?| jtt |cd d j| d | d }|jtj|S)Nc3`K|]&\}}td|dtd|dk((ywrrrs rGrz,DuckDBLazyFrame.join_asof..bs<D%eD6O$eE7!,<(==rbackwardrrrforwardzKOnly 'backward' and 'forward' strategies are currently supported for DuckDBrz" as "z SELECT ,zD FROM lhs ASOF LEFT JOIN rhs ON )rtrrrr rrrrystrrrrPsql)rDrrrby_leftby_rightstrategyrrr conditionsrhrrurvquerys rG join_asofzDuckDBLazyFrame.join_asofSskkll')  8#7   #-gx#@  "$ #Gh z !   cE'!"45uXJa=P9QQ R  "   cE'!"45uXJa=P9QQ R_C%c* * &tZ 8 KK .Ds{{" D0EH0E$E dV6$xqAB!T(1FX1F%F c#d)n-  .HHV$%&{    E!233rIc|jSr>)rrMs rGcollect_schemazDuckDBLazyFrame.collect_schemas {{rIc:|xs |j}|j|x}r|td|jd}|r|dk(rtdt |nd}|dk(r't t dt||xsd|| }nt t d ||xsd|| }|j|jjt|j|jt|td k(j|gd S)N row_index_)prefixlastTnonecountrk) descending nulls_last row_numberr}Fr)ry_check_columns_existrrlenrr rrrtrurrr rr) rDsubsetkeeporder_bysubset_errortmp_nameflagsexprs rGuniquezDuckDBLazyFrame.uniques (DLL--g6 65 6K1!T\\,W4< D#h-0UY 6>$'>+,B  D%,B  D  KK  ~/H1E F M MH Q'   $z%$ (  )rIct|t|}|rdt||D}ndt||D}|j|jj |S)Nc3K|]I\}}|st|jn&t|jjKywr>)r rdescrrvrs rGrz'DuckDBLazyFrame.sort..sDD$/3D $$&D 8H8S8S8UUAAc3K|]I\}}|st|jn&t|jjKywr>)r nulls_firstrr s rGrz'DuckDBLazyFrame.sort..sDD$04D %%'T9I9U9U9WWr!)rrrrrtsort)rDrrbyrs rGr$zDuckDBLazyFrame.sortsf SW5 ",R"<B ",R"<B  !1!1!12!677rIc h|j}t|}t|trt | t |}nt d|D}ttd||t dt |}|t|k}d|d}|jtj|S)Nc3"K|]}|  ywr>rk)rrevs rGrz(DuckDBLazyFrame.top_k..s:33w:s rT)rrrz@ SELECT * FROM _rel QUALIFY z ) rtrrOboolrrtuplerr rrrPr) rDkr%reverse_relrrrrs rGtop_kzDuckDBLazyFrame.top_ks{{ "X gt $$[#b':J:'::J lO!"4R1   CFN K     E!233rIc||n |j}ttd|D}|j|jj |S)Nc3NK|]}t|jywr>)r isnotnull)rrvs rGrz-DuckDBLazyFrame.drop_nulls..s&Qs4y':':'<&Qs#%)ryrrrrtr)rDrrkeep_conditions rG drop_nullszDuckDBLazyFrame.drop_nullssD".&DLL&Q&QR  !3!3N!CDDrIcb |jj}|j}D]'}||}||jk7sd|d}t |t dk7r d}t |td |j}|j}td} jtd z| kD} |j| j fd|D} |j| jfd|D} |j| j!| S) Nz-`explode` operation not supported for dtype `z`, expected List typer}zExploding on multiple columns is not supported with DuckDB backend since we cannot guarantee that the exploded columns have matching element counts.rrc3`K|]%}|vrtdj|n|'yw)unnestN)r r)rrvcol_to_exploderys rGrz*DuckDBLazyFrame.explode..s8<@7?(N+11$7PTTs+.c3^K|]$}|vrtdj|n|&ywr>)rr)rrvrys rGrz*DuckDBLazyFrame.explode..s1*.D %dBs*-)r@dtypesrListrrrr rtryrr1r rrurunion)rDryr9rrvdtyperhroriginal_columnszeronot_null_condition non_null_relnull_relr7s ` @rGexplodezDuckDBLazyFrame.explodesM%%$$& 1D4LE #CE7K)),C00 1 w<1 ^ &c* *WQZkk<<1v+557!E>:RRUYY>rIcx|gn|}||jDcgc] }||vs| c}n|}|dk(r d}t||dk(r d}t|t|} |j} d| dt |dt |d} |j t j| jg|||Scc}w)Nz:`variable_name` cannot be empty string for duckdb backend.z7`value_name` cannot be empty string for duckdb backend.z) unpivot _rel on z' into name z value r) ryrrrtr rrPrru) rDonindex variable_name value_nameindex_con_rh unpivot_onr-rs rGunpivotzDuckDBLazyFrame.unpivots}%>@j$,,:Q!6/q:b B NC%c* *  KC%c* *&, {{|-()*:'(   $FJJu  $ $&J&J &Jz&J K  +;s B7B7)r}c| d}t|ttd|tdz j |}|j |j j|tS)Nz5Cannot pass `order_by` to `with_row_index` for DuckDBr)rr}) TypeErrorrr rrrrtrur)rDrvrrhrs rGwith_row_indexzDuckDBLazyFrame.with_row_indexse  ICC. !!L/HEANUU    !3!3D.:J!KLLrIcR|j}d|d}tj|y)Nz7 COPY (SELECT * FROM _rel) TO 'z+' (FORMAT parquet) )rtrPr)rDfiler-rs rG sink_parquetzDuckDBLazyFrame.sink_parquet#s/{{   5rI)rEduckdb.DuckDBPyRelationrFrr<r)returnNone)rVztuple[int, ...])rRzduckdb.DuckDBPyRelation | AnyrVzTypeIs[duckdb.DuckDBPyRelation])rXrUrYr2rVr&)rbrrcrrVILazyFrame[duckdb.DuckDBPyRelation] | DataFrameV1[duckdb.DuckDBPyRelation])rVr&)rVr$)rVr-)rvrrVr/)rVzIterator[Expression])rz_EagerAllowedImpl | NonerrrVr()rintrVr&)rrrVr&)rr)rVr&)ry Sequence[str]rr)rVr&r>)rrWrrWrVr&)rr)rVr&)rVzdict[str, DType])rVz list[str])rVz pd.DataFrame)rVzpa.Table)rFrrVr&)rErUrVr&)rz$Sequence[str] | Sequence[DuckDBExpr]rr)rVr+)rzMapping[str, str]rVr&) rr&rr8rSequence[str] | Nonerr[rrrVr&)rr&rrrrrr[rr[rr7rrrVr&)rr[rr9rr[rVr&)r%rrbool | Sequence[bool]rr)rVr&)r+rYr%z Iterable[str]r,r\rVr&)rr[rVr&)ryrZrVr&) rEr[rFr[rGrrHrrVr&)rvrrrZrVr&)rSzstr | Path | BytesIOrVrW)2__name__ __module__ __qualname__rDUCKDBrKrHpropertyrL staticmethodrS classmethodrZrerirlrnrqrwrzrrrrrurr^rrrryrrrrrrrrrrr$r.r3rBrMrbackend_versionrQrTrkrIrGr;r;<s%++O*/ - # - - #' -  -77883*3;J3 33 ;;"%; R;6 X $/$;>$ $L7D<<A  <9  $$ B<9H8HMQH HA0&0& 0& & 0& ' 0&0& 0&d-4-4 -4  -4 & -4'-4#-4-4 -4^ )$ )! ) ' )  )D 84*E '?R  $       BXf%M&MrIr;)r)rUrX)Q __future__r functoolsroperatorrtypingrrrPrnarwhals._duckdb.utilsr r r r r rrrrnarwhals._sql.dataframernarwhals._utilsrrrrrrrrnarwhals.dependenciesrnarwhals.exceptionsrcollections.abcrrr r!ior"pathlibr#rr$pandaspdpyarrowpar%typing_extensionsr&r'narwhals._compliant.typingr(narwhals._duckdb.exprr)rr+rpr-rsr/r0narwhals._typingr1r2narwhals.dataframer3narwhals.dtypesr4r`r6rdnarwhals.typingr7r8r9r;rkrIrGr|s"% !   1   -5EE !.@07:?42/,%;RRn U  nrI