
    [if                    d   U d dl mZ d dlZd dlZd dlZd dlmZmZmZm	Z	m
Z
mZ d dl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 d dl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% d d
l&m'Z' d dl(Z)d dl*m+Z, d dl-m.Z. d dl/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9m:Z:m;Z; d dl<m=Z= d dl>m?Z?m@Z@mAZAmBZB  e
de5      ZCeAZDdeEd<   eAZFdeEd<   eeeGgef   ZHdeEd<   eGZIdeEd<   ej                  ej                  ej                  hZMdZN ej                  eNej                        ZQdZR ej                  eRej                        ZSe	d   ZTdeEd<   dd d!ZUd"d#d$d%d&d'd(d)d*d+d,
ZVd-eEd.<   ej                  j                         ZX	 dd0ZY	 	 	 	 	 	 dd2ZZ	 	 	 	 	 	 	 	 dd3Z[	 	 	 	 	 	 	 	 	 	 dd4Z\ ej                  d56      dd7       Z^ ej                  d56      dd8       Z_	 	 	 	 	 	 	 	 dd9Z`	 	 	 	 	 	 	 	 dd:Za	 	 	 	 dd;Zbd<Zcd=d>	 	 	 	 	 	 	 	 	 dd?Zdej                  j                         d@k\  rddAZenddBZeddCZf	 	 	 	 	 	 ddDZg ej                  d56      ddE       Zhej                  j                  Zjejj                  dFejj                  dGiZmdHeEdI<   ejj                  dJdKdLdMejj                  dNdOdPdMejj                  dQdRdSdMejj                  dTdUdVdMejj                  dWdXdYdMejj                  dZd[d\dMejj                  d]d^d_dMejj                  d`dadbdMejj                  dcdddedMejj                  dfdgdhdMejj                  didjd/dMiZydkeEdl<   	 	 	 	 	 	 	 	 	 	 ddmZz	 	 	 	 	 	 	 	 ddnZ{ddoZ|ej                  dpfej                  dqfej                  efej                  dpfej                  efej                  dpfej                  efej                  efej                  efdr	ZdseEdt<   	 	 	 	 	 	 	 	 dduZeeedvdwZdxeEdy<   ddzZ	 	 	 	 	 	 	 	 dd{Zdd|Zdd}Z G d~ ded1ef         ZddZ	 	 	 	 	 	 	 	 	 	 ddZy)    )annotationsN)TYPE_CHECKINGAnyCallableLiteralTypeVarcast)EagerSeriesNamespace)MS_PER_SECONDNS_PER_MICROSECONDNS_PER_MILLISECONDNS_PER_SECONDSECONDS_PER_DAYUS_PER_SECOND)issue_warning)ImplementationVersion_DeferredIterablecheck_columns_existisinstance_or_issubclassrequires)
ShapeError)IterableIteratorMapping)
ModuleType)DtypeBaseMaskedDtype)	TypeAliasTypeIs)IntervalUnit)PandasLikeExprPandasLikeSeries)NativeDataFrameTNativeNDFrameTNativeSeriesT)DType)DTypeBackend	IntoDTypeTimeUnit_1DArrayExprT)boundr    UnitCurrent
UnitTargetBinOpBroadcastIntoRhsa  ^
    datetime64\[
        (?P<time_unit>s|ms|us|ns)                 # Match time unit: s, ms, us, or ns
        (?:,                                      # Begin non-capturing group for optional timezone
            \s*                                   # Optional whitespace after comma
            (?P<time_zone>                        # Start named group for timezone
                [a-zA-Z\/]+                       # Match timezone name, e.g., UTC, America/New_York
                (?:[+-]\d{2}:\d{2})?              # Optional offset in format +HH:MM or -HH:MM
                |                                 # OR
                pytz\.FixedOffset\(\d+\)          # Match pytz.FixedOffset with integer offset in parentheses
            )                                     # End time_zone group
        )?                                        # End optional timezone group
    \]                                            # Closing bracket for datetime64
$z^
    timedelta64\[
        (?P<time_unit>s|ms|us|ns)                 # Match time unit: s, ms, us, or ns
    \]                                            # Closing bracket for timedelta64
$)yearquartermonthweekdayhourminutesecondmillisecondmicrosecond
nanosecondNativeIntervalUnitDmin)dmr4   r5   r6   r8   r9   r:   r;   r<   r=   r>   )
yqmorB   hrC   smsusnsz)Mapping[IntervalUnit, NativeIntervalUnit]
UNITS_DICTboolc                F    | t         j                  t         j                  hv S N)r   PANDASMODINimplementations    l/var/www/html/userprofiledev.eatanceapp.com/venv/lib/python3.12/site-packages/narwhals/_pandas_like/utils.pyis_pandas_or_modinrU   v   s    n33^5I5IJJJ    r%   c                X   ddl m} | j                  j                  }| j                  r=t        ||      r1|j                  s%| j                  j                  d   |j                  fS t        ||      r|j                  r%| j                  |j                  j                  d   fS |j                  j                  |ur.| j                  t        |j                  ||j                        fS | j                  |j                  fS t        |t              rd}t        |      | j                  |fS )zValidate RHS of binary operation.

    If the comparison isn't supported, return `NotImplemented` so that the
    "right-hand-side" operation (e.g. `__radd__`) can be tried.
    r   r$   rR   z$Expected Series or scalar, got list.)narwhals._pandas_like.seriesr%   nativeindex
_broadcast
isinstanceiloc	set_index_implementationlist	TypeError)lhsrhsr%   	lhs_indexmsgs        rT   align_and_extract_nativerf   z   s     >

  I
~~*S*:;CNNzzq!3::--#'(>>JJ

 233::9,

#**i@S@ST  

CJJ''#t4n ::s?rV   c                  t        ||j                         j                        r.t        |      x}t        |       x}k7  rd| d| }t	        |      |t
        j                  u r| j                  d      } || _        | S |t
        j                  u r0d|j                         cxk  rdk  rn n| j                  |dd      S | j                  |d	      S )
z}Wrapper around pandas' set_axis to set object index.

    We can set `copy` / `inplace` based on implementation/version.
    zExpected object of length z, got length: F)deep         r   )axiscopy)rn   )r\   to_native_namespaceIndexlenr   r   CUDFro   rZ   rP   _backend_versionset_axis)objrZ   rS   expected_len
actual_lenre   s         rT   r^   r^      s     %;;=CCDE
"C
 *J" +<.zlSo,,,hhEh"	
....113:d:||E|66<<A<&&rV   c                   |t         j                  u r*|j                         dk\  r | j                  |i |ddi}n | j                  |i |ddd}t	        d|      S )zXWrapper around pandas' rename so that we can set `copy` based on implementation/version.rl   inplaceF)ro   rz   r'   )r   rP   rt   renamer	   )rv   rS   argskwargsresults        rT   r{   r{      sg     ...'')T1T;V;U;TGVG%G &))rV      )maxsizec                T    t        | t        j                        xs t        |       dv S )zR*There is no problem which can't be solved by adding an extra string type* pandas.>   string[python]string[pyarrow_numpy]<StringDtype(na_value=nan)>strstring)r\   pdStringDtyper   native_dtypes    rT   is_dtype_non_pyarrow_stringr      s.    
 lBNN3 s<7H M 8 rV   c                F   t        |       }|j                  }|dv r|j                         S |dv r|j                         S |dv r|j	                         S |dv r|j                         S |dv r|j                         S |dv r|j                         S |dv r|j                         S |dv r|j                         S |d	v r|j                         S |d
v r|j                         S t        |       r|j                         S |dv r|j                         S t        j!                  |      x}r4|j#                  d      }|j#                  d      }|j%                  ||      S t&        j!                  |      x}r"|j#                  d      }|j)                  |      S |j+                         S )N>   Int64int64>   Int32int32>   Int16int16>   Int8int8>   UInt64uint64>   UInt32uint32>   UInt16uint16>   UInt8uint8>   Float64float64>   Float32float32>   rM   boolean	time_unit	time_zone)r   dtypesr   r   r   r   r   r   r   r   r   r   r   StringBooleanPATTERN_PD_DATETIMEmatchgroupDatetimePATTERN_PD_DURATIONDurationUnknown)r   versiondtyper   match_dt_time_unitdt_time_zonedu_time_units           rT   #non_object_native_to_narwhals_dtyper      s   E^^F""||~""||~""||~  {{}$$}}$$}}$$}}""||~&&~~&&~~"<0}}##~~$**511v1!'k!:#)<<#<|\::$**511v1!'k!:|,,>>rV   c                   |j                   }|t        j                  u r|j                         S t        j
                  j                  j                  }| dn || j                  d      d      }|dk(  r|j                         S |dk(  r"|t        j                  ur|j                         S |dk(  r|j                         S |j                         S )Nemptyd   T)skipnar   )r   r   rs   r   r   apitypesinfer_dtypeheadr   V1Object)seriesr   rS   r   inferinferred_dtypes         rT   object_native_to_narwhals_dtyper      s     ^^F,,, }}FFLL$$E &WE&++c:JSW4XN!}} WGJJ%>}} }}==?rV   c                0   |j                   }|t        j                  u r|j                         S | j                  rM|t
        j                  u rt        |       n| j                  j                  }|j                  t        |            S |j                         S rO   )r   r   r   Categoricalorderedr   rs   _cudf_categorical_to_list
categoriesto_listEnumr   )r   r   rS   r   	into_iters        rT   $native_categorical_to_narwhals_dtyper     s     ^^F'**!!## !4!44 &l3((00 	
 {{,Y788rV   c                     d fd}|S )Nc                 T     j                   j                         j                         S rO   )r   to_arrow	to_pylistr   s   rT   fnz%_cudf_categorical_to_list.<locals>.fn!  s!    &&//1;;==rV   )returnz	list[Any] )r   r   s   ` rT   r   r     s    > IrV   )r`   structdecimalF)allow_objectc                  t        |       }t        |       s|j                  t              r8ddlm} t        | d      r| j                         }n| j                  } |||      S |dk(  rt        | ||      S |dk7  rt        | |      S |t        j                  u r|j                  j                         S |rt        d ||      S d}t!        |      )Nr   )native_to_narwhals_dtyper   categoryobjectz;Unreachable code, object dtype should be handled separately)r   is_dtype_pyarrow
startswithCUDF_BASE_DTYPE_PREFIXnarwhals._arrow.utilsr   hasattrr   pyarrow_dtyper   r   r   DASKr   r   r   AssertionError)r   r   rS   r   	str_dtypearrow_native_to_narwhals_dtypepa_dtypere   s           rT   r   r   *  s     L!I%)=)=>T)U	
 <,$0$9$9$;H#11H-h@@J3L'>ZZH2<II,,, ~~$$&&.tWnMME  
rV   )rj      c                    t               }t        | t        j                  j                  j
                        xr t        | d|      du S )z/Return `True` if `dtype` is `"numpy_nullable"`.baseN)r   r\   r   r   
extensionsExtensionDtypegetattr)r   sentinels     rT   is_dtype_numpy_nullabler   O  s@     8ubff//>>? 9vx0D8	
rV   c                    t        | t        j                  j                  j                        rddlm} t        | |      S y)Nr   r   F)r\   r   r   r   r   pandas.core.arrays.maskedr   )r   OldBaseMaskedDtypes     rT   r   r   Z  s6     eRVV..==> e%788rV   c                ^    |t         j                  u ryt        |       ryt        |       rdS dS )zjGet dtype backend for pandas type.

    Matches pandas' `dtype_backend` argument in `convert_dtypes`.
    Npyarrownumpy_nullable)r   rs   r   r   )r   rS   s     rT   get_dtype_backendr   i  s3    
 ,,,6u=G4GrV   c                    fd| D        S )ziYield a `DTypeBackend` per-dtype.

    Matches pandas' `dtype_backend` argument in `convert_dtypes`.
    c              3  6   K   | ]  }t        |        y wrO   )r   ).0r   rS   s     rT   	<genexpr>z&iter_dtype_backends.<locals>.<genexpr>}  s     I&e^4&s   r   )r   rS   s    `rT   iter_dtype_backendsr   v  s     J&IIrV   c                Z    t        t        d      xr t        | t        j                        S )N
ArrowDtype)r   r   r\   r   r   s    rT   r   r     s    2|$IE2==)IIrV   r   r   zMapping[type[DType], str]NW_TO_PD_DTYPES_INVARIANTzFloat64[pyarrow]r   r   )r   r   NzFloat32[pyarrow]r   r   Int64[pyarrow]r   r   zInt32[pyarrow]r   r   zInt16[pyarrow]r   r   zInt8[pyarrow]r   r   zUInt64[pyarrow]r   r   zUInt32[pyarrow]r   r   zUInt16[pyarrow]r   r   zUInt8[pyarrow]r   r   zboolean[pyarrow]r   z<Mapping[type[DType], Mapping[DTypeBackend, str | type[Any]]]NW_TO_PD_DTYPES_BACKENDc           	        |dvrd| d}t        |      |j                  }| j                         }t        j	                  |      x}r|S t
        j	                  |      x}r||   S t        ||j                        r9|dk(  r(dd l}	t        j                   |	j                               S |dk(  ryt        S t        | |j                        rt        |      rxt         dk  rot#        | |j                        rV| j$                  d	k7  rGt'        j(                  t               }
d
|
d}d}d| j$                  d| d| d}t+        |t,               d	}n| j$                  }|dk(  r| j.                  x}rd| nd}d| | dS | j.                  x}rd| nd}d| | dS t        | |j0                        r4t        |      rt         dk  rd	}n| j$                  }|dk(  rd| dS d| dS t        | |j2                        r	 dd l}	yt        | |j6                        ro|t8        j:                  u rd}t=        |      t#        | |j6                        r-|j?                         }|jA                  | jB                  d      S d}t        |      t        ||jD                  |jF                  |jH                  |jJ                  |jL                  |jN                  f      rtQ        | ||      S d |  }tS        |      # t4        $ r}d}t5        |      |d }~ww xY w)!N>   Nr   r   z;Expected one of {None, 'pyarrow', 'numpy_nullable'}, got: ''r   r   r   r   )r   rK   z*available in 'pandas>=2.0', found version .zhttps://pandas.pydata.org/docs/dev/whatsnew/v2.0.0.html#construction-with-datetime64-or-timedelta64-dtype-with-unsupported-resolutionz`nw.Datetime(time_unit=z)` is only z
Narwhals has fallen back to using `time_unit='ns'` to avoid an error.

Hint: to avoid this warning, consider either:
- Upgrading pandas: zA
- Using a bare `nw.Datetime`, if this precision is not importantz, tz= z
timestamp[z
][pyarrow]z, zdatetime64[]z	duration[ztimedelta64[z/'pyarrow>=13.0.0' is required for `Date` dtype.zdate32[pyarrow]z9Converting to Enum is not supported in narwhals.stable.v1T)r   z9Can not cast / initialize Enum without categories presentzUnknown dtype: )*
ValueErrorr   	base_typer   getr   
issubclassr   r   r   r   r   r   r   r   rU   PANDAS_VERSIONr\   r   r   _unparse_versionr   UserWarningr   r   DateModuleNotFoundErrorr   r   r   NotImplementedErrorrp   CategoricalDtyper   StructArrayListTimeBinaryDecimalnarwhals_to_native_arrow_dtyper   )r   dtype_backendrS   r   re   r   r  pd_typeinto_pd_typepafound	availablechangelog_urlr   tztz_partr   excrK   s                      rT   narwhals_to_native_dtyper     sD    ??Mm_\]^o^^F!I+//	::w:.229==|=M**)V]]+I%  ==--,,
v7n-. D
 3
 %1eoo6M 11.AH	QRS	 !h-eoo-@I; W+ ,9/ :WX  c;/L ??LI%-2__'<r'<bTl2G~gYjAA&+oo 5 5Brd)B\N7)155v7n-. D
 3
  L ??L 	) ~Z0	
  ~Q/	

  v{{3	4 
 !v{{3gjj MC%c**eV[[)335B&&u'7'7&FFIoMMLLKKKKMMNN	

 .e^WMME7
#C

7 # 	4CC%c*3	4s   ;K0 0	L9LLc                   t        |      r0t        dk\  r'	 dd l}ddlm} t        j                   || |            S d|  d| d| d	}t        |      # t        $ r#}d|  d|j                   }t        |      |d }~ww xY w)
N)r   r   r   zUnable to convert to z  to to the following exception: )r   zConverting to z+ dtype is not supported for implementation z and version r  )
rU   r  r   ImportErrorre   r   r   r   r   r  )r   rS   r   r  r  re   _to_arrow_dtypes          rT   r  r    s     .)n.F	,  	V}}_UG<==
J
-y	3  c
""  	,)%0PQTQXQXPYZCc"+	,s   A 	A?A::A?c                l    dt        |       v ryt        |       j                         t        |       k7  ryy)Nr   r   r   r   )r   lowerr   s    rT   int_dtype_mapperr&  /  s0    CJ
5zSZ'rV   i  i@B )	)rK   rJ   )rK   rI   )rJ   rK   )rJ   rI   )rI   rK   )rI   rJ   )rH   rK   )rH   rJ   )rH   rI   zGMapping[tuple[UnitCurrent, UnitTarget], tuple[BinOpBroadcast, IntoRhs]]_TIMESTAMP_DATETIME_OP_FACTORc                    ||k(  r| S t         j                  ||f      x}r|\  }} || |      S d| d}t        |      )Nzunexpected time unit zD, please report an issue at https://github.com/narwhals-dev/narwhals)r'  r  r   )rH   currentr   itemr   factorre   s          rT   calculate_timestamp_datetimer,  F  sd     ),00'91EFFtF
F!V}
y )3 	3  
rV   rj   )rK   rJ   rI   rH   zMapping[TimeUnit, int]_TIMESTAMP_DATE_FACTORc                (    | t         z  t        |   z  S rO   )r   r-  )rH   r   s     rT   calculate_timestamp_dater/  ]  s    !7	!BBBrV   c                   t        |      | j                  d   k(  r| j                  |k(  j                         r| S | j                  j                  j
                  dk(  s%|t        j                  u rO|j                         dk  r<t        || j                  j                               x}r|| j                  dd|f   S 	 | |   S # t        $ r0}t        || j                  j                               x}r|| d}~ww xY w)zsSelect columns by name.

    Prefer this over `df.loc[:, column_names]` as it's
    generally more performant.
    rj   bri   )r  N)rr   shapecolumnsallr   kindr   rP   rt   r   tolistlocKeyError)dfcolumn_namesrS   errores        rT   select_columns_by_namer=  a  s     <BHHQK'RZZ<-G,L,L,N	


$.///++-6 (

@Q@Q@STT5TKvvao&&, '

@Q@Q@STT5TQs    C 	C>+C99C>c                    | j                   t        j                  t        j                  t        j                  hv xr | j
                  j                  dk(  S )NrM   )r_   r   rP   rQ   r   rY   r   )rH   s    rT   is_non_nullable_booleanr?  ~  sI     	
!!>#7#79L9LM	N 	%HHNNf$rV   c                   | t         j                  t         j                  hv rddl}|S | t         j                  u rddl}|S d|  }t        |      )zCReturns numpy or cupy module depending on the given implementation.r   Nz!Expected pandas/modin/cudf, got: )r   rP   rQ   numpyrs   cupyr   )rS   npcpre   s       rT   import_array_modulerE    sQ    .//1E1EFF	,,,	-n-=
>C

rV   c                      e Zd Zy)PandasLikeSeriesNamespaceN)__name__
__module____qualname__r   rV   rT   rG  rG    s    rV   rG  c                    dd| ddS )NFT)sortas_indexdropnaobservedr   )drop_null_keyss    rT   make_group_by_kwargsrQ    s    t~SWXXrV   c                   | j                   d   }|rLddlm} t        j                   ||t        |            | j                        } |||| j                        S  |||| j                  | j                        S )a`  Broadcast a scalar value from a (one element) Series to match a target index.

    For nested (arrow-backed) types, we rely on
    [`pandas.array`](https://pandas.pydata.org/docs/reference/api/pandas.array.html).

    Arguments:
        native: The native pandas-like Series containing the scalar value to broadcast.
        index: The target index to broadcast to.
        is_nested: Whether the Series has a nested (arrow-backed) dtype.
        series_class: Series class to use for constructing the result.

    Returns:
        A new Series with the scalar value broadcast to match the target index.
    r   )repeatr   )rZ   name)rZ   r   rT  )r]   r   rS  r   arrayrr   r   rT  )rY   rZ   	is_nestedseries_classvaluerS  pa_arrays          rT   broadcast_series_to_indexrZ    sd    * KKNE0 88F5#e*5V\\JHEDDU&,,V[[QQrV   )rS   r   r   rM   )rb   r%   rc   zPandasLikeSeries | objectr   z.tuple[pd.Series[Any], pd.Series[Any] | object])rv   r'   rZ   r   rS   r   r   r'   )
rv   r'   r|   r   rS   r   r}   r   r   r'   )r   r   r   rM   )r   r   r   r   r   r)   )r   zPandasLikeSeries | Noner   r   rS   r   r   r)   )r   zpd.CategoricalDtyper   r   rS   r   r   r)   )r   r   r   zCallable[[], list[Any]])
r   r   r   r   rS   r   r   rM   r   r)   )r   r   r   zTypeIs[BaseMaskedDtype])r   r   rS   r   r   r*   )r   zIterable[Any]rS   r   r   zIterator[DTypeBackend])r   r   r   zTypeIs[pd.ArrowDtype])
r   r+   r  r*   rS   r   r   r   r   zstr | PandasDtype)r   r+   rS   r   r   r   r   zpd.ArrowDtype)r   r   r   r   )rH   r(   r)  r,   r   r,   r   r(   )rH   r(   r   r,   r   r(   )r9  r&   r:  zlist[str] | _1DArrayrS   r   r   zNativeDataFrameT | Any)rH   r%   r   rM   )rS   r   r   r   )rP  rM   r   zdict[str, bool])
rY   pd.Series[Any]rZ   r   rV  rM   rW  ztype[pd.Series[Any]]r   r[  )
__future__r   	functoolsoperatorretypingr   r   r   r   r   r	   pandasr   narwhals._compliantr
   narwhals._constantsr   r   r   r   r   r   narwhals._exceptionsr   narwhals._utilsr   r   r   r   r   r   narwhals.exceptionsr   collections.abcr   r   r   r   r   r   r  pandas._typingr   PandasDtypepandas.core.dtypes.dtypesr   typing_extensionsr    r!   narwhals._durationr"   narwhals._pandas_like.exprr#   rX   r%   narwhals._pandas_like.typingr&   r'   r(   narwhals.dtypesr)   narwhals.typingr*   r+   r,   r-   r.   r0   __annotations__r1   intr2   r3   rP   rs   rQ   PANDAS_LIKE_IMPLEMENTATIONPD_DATETIME_RGXcompileVERBOSEr   PD_DURATION_RGXr   r?   
ALIAS_DICTrL   rt   r  rU   rf   r^   r{   	lru_cacher   r   r   r   r   r   r   r   r   r   r   MAINr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r&  floordivmulr'  r,  r-  r/  r=  r?  rE  rG  rQ  rZ  r   rV   rT   <module>r}     s3   "   	 G G  4  /  +;; 393/9= 
 &KKG>2E%K%$J	$ (#sS 9NI9GY  
 !bjj"**= 
 !bjj"**=  '
! I  U#
		
				


9
5   &&779K	 93B'	' #'8F''.
*	
* #
*5C
*OR
*
* R 
 !
 R # !#L#.5GU
. % 07 IW 
  			 7      # 
    F ))+v5
	HJJ+9JJ R J !J 
		
 

MM88 4  NN%#
 NN%#
 LL.'QXY
LL.'QXY
LL.'QXY
KK_fU
MM$"
 MM$"
 MM$"
 LL.'QXY
NN%#?$Y U $Neee #e 	e
 eP##&4#?F##& $$e,$$i0<<!34$$e,<<!34<<',,.,,.,,.
    '4<  

	
	2 . C& # 	: T 45G5L M SYRRR 	R
 'R RrV   