
    -Phd                       d dl mZ d dl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Zd dlmZ d dlmZmZmZmZmZ d dlmZmZ  ede	          Zer1d d
lmZ d dlmZ d dl m!Z! d dl"m#Z# d dl$m%Z%m&Z&m'Z'm(Z(  ede	          Z)ej*        ej+        ej,        hZ-dZ. ej/        e.ej0                  Z1dZ2 ej/        e2ej0                  Z3dZ4 ej/        e4ej0                  Z5dZ6 ej/        e6ej0                  Z7dddZ8dUdZ9dVd%Z:dWd(Z; ej<        d)*          dXd/            Z=dYd1Z>	 dZd[d4Z?d\d6Z@d]d7ZAd^d:ZB ej<        d)*          d_d<            ZCd`d@ZDdadBZEdbdDZFdcdIZGdddJZHdedNZIdfdRZJ G dS dTedef                   ZKdS )g    )annotationsN)suppress)TYPE_CHECKINGAnyCallableLiteralSizedTypeVar)EagerSeriesNamespace)ImplementationVersion_DeferredIterablecheck_columns_existisinstance_or_issubclass)DuplicateError
ShapeErrorT)bound)Dtype)PandasLikeExprPandasLikeSeries)DType)DTypeBackend	IntoDTypeTimeUnit_1DArrayExprTa  ^
    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
$a  ^
    timestamp\[
        (?P<time_unit>s|ms|us|ns)                 # Match time unit: s, ms, us, or ns
        (?:,                                      # Begin non-capturing group for optional timezone
            \s?tz=                                # Match "tz=" prefix
            (?P<time_zone>                        # Start named group for timezone
                [a-zA-Z\/]*                       # Match timezone name (e.g., UTC, America/New_York)
                (?:                               # Begin optional non-capturing group for offset
                    [+-]\d{2}:\d{2}               # Match offset in format +HH:MM or -HH:MM
                )?                                # End optional offset group
            )                                     # End time_zone group
        )?                                        # End optional timezone group
    \]                                            # Closing bracket for timestamp
    \[pyarrow\]                                   # Literal string "[pyarrow]"
$z^
    timedelta64\[
        (?P<time_unit>s|ms|us|ns)                 # Match time unit: s, ms, us, or ns
    \]                                            # Closing bracket for timedelta64
$a  ^
    duration\[
        (?P<time_unit>s|ms|us|ns)                 # Match time unit: s, ms, us, or ns
    \]                                            # Closing bracket for duration
    \[pyarrow\]                                   # Literal string "[pyarrow]"
$Dmin)dmlhsr   rhsPandasLikeSeries | objectreturn7tuple[pd.Series[Any] | object, pd.Series[Any] | object]c                   ddl m} ddlm} | j        j        }t          ||          rt          S | j        r0t          ||          r |j        s| j        j	        d         |j        fS t          ||          re|j        r| j        |j        j	        d         fS |j        j        |ur)| j        t          |j        ||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   )PandasLikeDataFramer   implementationbackend_versionz$Expected Series or scalar, got list.)narwhals._pandas_like.dataframer)   narwhals._pandas_like.seriesr   nativeindex
isinstanceNotImplemented
_broadcastiloc	set_index_implementation_backend_versionlist	TypeError)r#   r$   r)   r   	lhs_indexmsgs         [/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/narwhals/_pandas_like/utils.pyalign_and_extract_nativer=   W   s?    DCCCCC======
 I#*++ 
~ .*S*:;; .CN .zq!3:--#'(( (> 	4J
 233:9,,
J#&#6$'$8	    
CJ''#t 4nn:s?    objr0   r   r+   r   r,   tuple[int, ...]c                  t          ||                                j                  r;t          |          x}t          |           x}k    rd| d| }t	          |          |t
          j        u r|                     d          } || _        | S |t
          j	        u r|dk     rddi}ni }|t
          j	        u rd|cxk    rdk     r	n nd|d	<   n	  | j
        |fd
di|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)   inplacerC         copyaxisr   )r1   to_native_namespaceIndexlenr   r   CUDFrI   r0   PANDASset_axis)r?   r0   r+   r,   expected_len
actual_lenr;   kwargss           r<   r5   r5      s%    %;;==CDD E

"C
 *J" J" T<SSzSSoo,,,hhEh""	
...$U#.../((((D(((((v3<00A0000r>   argsrS   c               f    |t           j        u r|dk    r | j        |i |S  | j        |i |ddiS )zXWrapper around pandas' rename so that we can set `copy` based on implementation/version.rG   rI   F)r   rO   rename)r?   r+   r,   rT   rS   s        r<   rV   rV      sV     ...4sz4*6***3:t2v22E2222r>      )maxsizenative_dtypeversionr   r   c                p   t          |           }|j        }|dv r|                                S |dv r|                                S |dv r|                                S |dv r|                                S |dv r|                                S |dv r|                                S |dv r|                                S |dv r|	                                S |d	v r|
                                S |d
v r|                                S |dv r|                                S |dv r|                                S |                    d          r|                                S |dk    rt!          | |          S t"                              |          x}st&                              |          x}r@|                    d          }|                    d          }|                    ||          S t,                              |          x}st.                              |          x}r*|                    d          }|                    |          S |dk    r|                                S |                    d          r)|                    d          r|                                S |                    d          r)|                    d          r|                                S |                    d          r)|                    d          r|                                S |                                S )N>   int64[pyarrow]Int64int64Int64[pyarrow]>   int32[pyarrow]Int32int32Int32[pyarrow]>   int16[pyarrow]Int16int16Int16[pyarrow]>   int8[pyarrow]Int8int8Int8[pyarrow]>   uint64[pyarrow]UInt64uint64UInt64[pyarrow]>   uint32[pyarrow]UInt32uint32UInt32[pyarrow]>   uint16[pyarrow]UInt16uint16UInt16[pyarrow]>   uint8[pyarrow]UInt8uint8UInt8[pyarrow]>   double[pyarrow]float64[pyarrow]Float64float64Float64[pyarrow]>   float[pyarrow]float32[pyarrow]Float32float32Float32[pyarrow]>   string[python]large_string[pyarrow]stringstring[pyarrow]>   bool[pyarrow]boolbooleanboolean[pyarrow]zdictionary<category	time_unit	time_zonezdate32[day][pyarrow]decimalz	[pyarrow]timebinary)strdtypesr]   ra   re   ri   rm   rq   ru   ry   r~   r   StringBoolean
startswithCategorical$native_categorical_to_narwhals_dtypePATTERN_PD_DATETIMEmatchPATTERN_PA_DATETIMEgroupDatetimePATTERN_PD_DURATIONPATTERN_PA_DURATIONDurationDateendswithDecimalTimeBinaryUnknown)rY   rZ   dtyper   match_dt_time_unitdt_time_zonedu_time_units           r<   #non_object_native_to_narwhals_dtyper      sA   E^FFFF||~~FFF||~~FFF||~~BBB{{}}JJJ}}JJJ}}JJJ}}FFF||~~    ~~    ~~XXX}}HHH~~&& $!!###
3L'JJJ%++E222 ;%++E222; "(k!:!:#)<<#<#<|\:::%++E222 -%++E222- "(k!:!:|,,,&&&{{}}	""  u~~k'B'B  ~~ ENN;$?$? {{}}!! enn[&A&A }}>>r>   seriesc                   |j         }|t          j        u r|                                S t          j        j                            |                     d          d          }|dk    r|                                S |dk    r"|t          j
        ur|                                S |dk    r|                                S |                                S )Nd   T)skipnar   empty)r   r   rN   r   pdapitypesinfer_dtypeheadr   V1Object)r   rZ   r+   r   inferred_dtypes        r<   object_native_to_narwhals_dtyper      s     ^F,,, }} V\--fkk#.>.>t-LLN!!}}  WGJ%>%>}}	7	"	"}}==??r>   pd.CategoricalDtype#Literal[Implementation.CUDF] | Nonec                    |j         }|t          j        u r|                                S | j        rK|t
          j        u rt          |           n| j        j	        }|
                    t          |                    S |                                S N)r   r   r   r   orderedr   rN   _cudf_categorical_to_list
categoriesto_listEnumr   )rY   rZ   r+   r   	into_iters        r<   r   r     s    
 ^F'*!!### 9 !444 &l333(0 	
 {{,Y77888r>   Callable[[], list[Any]]c                     d fd}|S )Nr&   	list[Any]c                 Z     j                                                                         S r   )r   to_arrow	to_pylist)rY   s   r<   fnz%_cudf_categorical_to_list.<locals>.fn!  s$    &//11;;===r>   )r&   r    )rY   r   s   ` r<   r   r     s(    > > > > > > Ir>   c                   t          |           }|                    d          rEddlm} t	          | d          r ||                                 |          S  || j        |          S |dk    r/|                                rt          | |t          j
                  S |dk    rt          | |          S |t          j        u r|j                                        S d}t          |          )N)
large_listr8   structfixed_size_listr   )native_to_narwhals_dtyper   r   objectz;Unreachable code, object dtype should be handled separately)r   r   narwhals._arrow.utilsr   hasattrr   pyarrow_dtypeis_cudfr   r   rN   r   DASKr   r   AssertionError)rY   rZ   r+   	str_dtypearrow_native_to_narwhals_dtyper;   s         r<   r   r   '  s$    L!!IOPP S	
 	
 	
 	
 	
 	
 <,, 	T11,2G2G2I2I7SSS--l.H'RRRJ>#9#9#;#; 4'>#6
 
 	
 H2<III	>.	.	. ~$$&&&E  

r>   r   r   c                   |t           j        u rdS t          t          d          rt	          | t          j                  rdS t          t                    5  t                      }t	          | t          j	        j
        j                  rt          | d|          	 ddd           dS ddd           n# 1 swxY w Y   dS )zjGet dtype backend for pandas type.

    Matches pandas' `dtype_backend` argument in `convert_dtypes`.
    N
ArrowDtypepyarrowbasenumpy_nullable)r   rN   r   r   r1   r   r   AttributeErrorr   r   
extensionsExtensionDtypegetattr)r   r+   sentinels      r<   get_dtype_backendr   G  s   
 ,,,tr<   Zr}%E%E y	.	!	! $ $88ubf/>??	$vx008#$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 4s   AB44B8;B8r   c                *    t          | |          dk    S )Nr   )r   )r   r+   s     r<   is_pyarrow_dtype_backendr   Z  s    UN33y@@r>   r   dtype_backendstr | PandasDtypec                   ||dvrd| d}t          |          |j        }t          | |j                  rd}t	          |          t          | |j                  r|dk    rdS |dk    rdS d	S t          | |j                  r|dk    rd
S |dk    rdS dS t          | |j                  r|dk    rdS |dk    rdS dS t          | |j                  r|dk    rdS |dk    rdS dS t          | |j	                  r|dk    rdS |dk    rdS dS t          | |j
                  r|dk    rdS |dk    rdS dS t          | |j                  r|dk    rdS |dk    rdS dS t          | |j                  r|dk    rdS |dk    rdS dS t          | |j                  r|dk    rdS |dk    rd S d!S t          | |j                  r|dk    rd"S |dk    rd#S d$S t          | |j                  r|dk    rd%S |dk    rd&S t           S t          | |j                  r|dk    rd'S |dk    rd(S d)S t          | |j                  rd*S t          | |j                  rT|t(          j        u r	|d+k     rd,}n| j        }|dk    r| j        x}rd-| nd.}	d/| |	 d0S | j        x}rd1| nd.}	d2| |	 d3S t          | |j                  r0|t(          j        u r	|d+k     rd,}
n| j        }
|dk    rd4|
 d0nd5|
 d3S t          | |j                  r	 d6d l}n# t6          $ r d7}Y nw xY wd8S t          | |j                  ru|t:          j        u rd9}t	          |          t?          | |j                  r0|                                 }|!                    | j"        d:;          S d<}t          |          t          | |j#        |j$        |j%        |j&        |j'        f          r|t(          j        u r`|d=k    rZ	 d6d l(}d6d l}n/# tR          $ r"}d>|  d?|j*         }tS          |          |d }~ww xY wd6d@l+m,}  |j-         || |A                    S dB|  dC| dD| dE}t	          |          dF|  }t]          |          )GN>   r   r   z;Expected one of {None, 'pyarrow', 'numpy_nullable'}, got: ''z(Casting to Decimal is not supported yet.r   r   r   r~   r   r   r   r   r_   r]   r^   rc   ra   rb   rg   re   rf   rk   ri   rj   ro   rm   rn   rs   rq   rr   rw   ru   rv   r{   ry   rz   r   r   r   r   r   r   )   nsz, tz= z
timestamp[z
][pyarrow]z, zdatetime64[]z	duration[ztimedelta64[r   z/'pyarrow>=11.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 present)r   r   zUnable to convert to z  to to the following exception: )narwhals_to_native_dtype)rZ   zConverting to z+ dtype is not supported for implementation z and version .zUnknown dtype: )/
ValueErrorr   r   r   NotImplementedErrorr~   r   r]   ra   re   ri   rm   rq   ru   ry   r   r   r   r   r   r   rO   r   r   r   r   r   ModuleNotFoundErrorr   r   r   r1   rK   CategoricalDtyper   StructArrayListr   r   pandasImportErrorr;   r   r   r   r   )r   r   r+   r,   rZ   r;   r   r   tztz_partr   par   r   excarrow_narwhals_to_native_dtypes                   r<   r   r   _  s     ]:W%W%W^m^^^oo^Fv~66 '8!#&&&v~66 I%%%%...9yv~66 I%%%%...9yv|44 I%%##...7wv|44 I%%##...7wv|44 I%%##...7wv{33 I%%"?...6vv}55 I%%$$...8xv}55 I%%$$...8xv}55 I%%$$...8xv|44 I%%##...7wv}55 I%%$$...8
v~66 I%%%%...9vv'9::  zv77 :^222 J
 8
 8
  LL ?LI%%-2_'<rElblll2GAAgAAAA*//$9BBi2iiiG99w9999v77 
^222 J
 8
 8
  LL ?L 	)) 10000////	

  v{33 !	D     " 	D 	D 	DCCCC	D  v{33 gj  MC%c***eV[)) 	G3355B&&u'7&FFFIoov|V[&+v}U  + ^222&7P7P0####$$$$$ 0 0 0^e^^UXU\^^!#&&C/0      !2=!?!?w!W!W!WXXX; ; ;!; ;07; ; ;  &c***
#E
#
#C


s*   =L LL#O, ,
P6PPlist[PandasLikeSeries]c                 t   | d                                          }d | D             }t          |          }| |                    |                   j        j        }g }| D ]}|j        rc|                    |                    |                    |j        j        d         g|z  ||j	        |j        j
                                       l|j        j        |urI|                    |                    t          |j        ||j        |j                                       |                    |           |S )Nr   c                ,    g | ]}t          |          S r   )rM   ).0ss     r<   
<listcomp>z/align_series_full_broadcast.<locals>.<listcomp>  s    &&&!s1vv&&&r>   )r0   namer   r*   )__native_namespace__maxr0   r/   r3   append_with_nativeSeriesr4   r  r   r5   r6   r7   )r   native_namespacelengths
max_lengthidx	reindexedr  s          r<   align_series_full_broadcastr    s_    ay5577&&v&&&GWJ
z**
+
2
8CI    < 	 $++q)*Z7!Vhn	 ,   	 	 	 	 X^3&&'('8()(:	   	 	 	 	 Qr>   r   c                    dt          |           v rdS t          |                                           t          |           k    rdS dS )Nr   r_   r]   r^   )r   lower)r   s    r<   int_dtype_mapperr  (  sF    CJJ
5zzSZZ''w7r>   r  pd.Series[int]original_time_unitr   c                >   |dk    r|dk    r| }n|dk    r| dz  }n| dz  }n{|dk    r|dk    r| dz  }ni|dk    r| }n`| dz  }nZ|dk    r|dk    r| dz  }nH|dk    r| dz  }n<| }n9|dk    r|dk    r| dz  }n'|dk    r| dz  }n| dz  }nd| d	}t          |          |S )
Nr   us  @B msr   ʚ;zunexpected time unit zA, please report a bug at https://github.com/narwhals-dev/narwhals)r   )r  r  r   resultr;   s        r<   calculate_timestamp_datetimer   0  s%    T!!FF$%ZFF)^FF	t	#	#YFF$FF%ZFF	t	#	#]FF$YFFFF	s	"	"&FF$]FFYFF{&8{{{S!!!Mr>   c                J    | dz  } |dk    r| dz  }n|dk    r| dz  }n| dz  }|S )NiQ r   r  r  r  r  r   )r  r   r  s      r<   calculate_timestamp_dater"  U  sF    	F
AD]"	d		YUMr>   dfcolumn_nameslist[str] | _1DArrayc                   t          |          | j        d         k    rt          || j        k              r| S | j        j        j        dk    s|t          j        u rC|dk     r=t          || j        	                                          x}r|| j
        dd|f         S 	 | |         S # t          $ r3}t          || 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.
    rC   brE   )	availableN)rM   shapeallcolumnsr   kindr   rO   r   tolistlocKeyError)r#  r$  r,   r+   errores         r<   select_columns_by_namer2  `  s    <BHQK''C
0J,K,K'	

$$.///Of4L4L (j''))
 
 
 
5 	 Kvaaao&&,   'j''))
 
 
 
5 	 Qs    B( (
C%2.C  C%r+  pd.Index[str]Nonec                ^   	 t          |                                           }n## t          $ r d|  }t          |          d w xY wt          |           |k    rSddlm}  ||           }d}|                                D ]\  }}|dk    r|d| d| dz  }d	| }t          |          d S )
Nz7Expected hashable (e.g. str or int) column names, got: r   )Counterr   rC   z
- 'z' z timesz"Expected unique column names, got:)rM   drop_duplicates	Exceptionr   collectionsr6  itemsr   )r+  len_unique_columnsr;   r6  counterkeyvalues          r<   check_column_names_are_uniquer?    s    ( !8!8!:!:;; ( ( (QQQoo4'( 7||)))''''''''""!--// 	4 	4JCqyy3s33e33338388S!!! *)s	   !$  Ac                  V    e Zd Zed	d            Zed
d            Zedd            ZdS )PandasLikeSeriesNamespacer&   r   c                    | j         j        S r   )	compliantr6   selfs    r<   r+   z(PandasLikeSeriesNamespace.implementation  s    ~--r>   r@   c                    | j         j        S r   )rC  r7   rD  s    r<   r,   z)PandasLikeSeriesNamespace.backend_version  s    ~..r>   r   c                    | j         j        S r   )rC  _versionrD  s    r<   rZ   z!PandasLikeSeriesNamespace.version  s    ~&&r>   N)r&   r   )r&   r@   )r&   r   )__name__
__module____qualname__propertyr+   r,   rZ   r   r>   r<   rA  rA    sr        . . . X. / / / X/ ' ' ' X' ' 'r>   rA  )r#   r   r$   r%   r&   r'   )
r?   r   r0   r   r+   r   r,   r@   r&   r   )r?   r   rT   r   r+   r   r,   r@   rS   r   r&   r   )rY   r   rZ   r   r&   r   )r   r   rZ   r   r+   r   r&   r   r   )rY   r   rZ   r   r+   r   r&   r   )rY   r   r&   r   )rY   r   rZ   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@   rZ   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$  r%  r,   r@   r+   r   r&   r   )r+  r3  r&   r4  )L
__future__r   	functoolsre
contextlibr   typingr   r   r   r   r	   r
   r   r   narwhals._compliant.seriesr   narwhals._utilsr   r   r   r   r   narwhals.exceptionsr   r   r   pandas._typingr   PandasDtypenarwhals._pandas_like.exprr   r.   r   narwhals.dtypesr   narwhals.typingr   r   r   r   r   rO   rN   MODINPANDAS_LIKE_IMPLEMENTATIONPD_DATETIME_RGXcompileVERBOSEr   PA_DATETIME_RGXr   PD_DURATION_RGXr   PA_DURATION_RGXr   	UNIT_DICTr=   r5   rV   	lru_cacher   r   r   r   r   r   r   r   r  r  r   r"  r2  r?  rA  r   r>   r<   <module>rd     s   " " " " " "     				       H H H H H H H H H H H H H H H H     ; ; ; ; ; ;              ; : : : : : : :GCu 3333333999999======%%%%%%KKKKKKKKKKKKGG>222E  
 !bj"*==  !bj"*==  !bj"*==  !bj"*== E""	& & & &R 1  1  1  1F3 3 3 3 R   ? ? ? ! ?D   2 ;?         $      @   & R   A A A ! A\ \ \ \~' ' ' 'T   " " " "J          F" " " "&' ' ' ' ' 45G5L M ' ' ' ' 'r>   