
    gL                    J   d dl mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dl	mZ erd d	lZd d	lZd d
lmZ d dlmZ d dl	mZ  ed      d7d       Zd8dZ	 	 	 	 	 	 	 	 d9dZ	 	 	 	 	 	 	 	 d:dZd;dZd;dZd<dZd=dZ	 	 	 	 	 	 d>dZd?dZed@d       ZedAd       Ze	 	 	 	 	 	 dBd       Z	 	 	 	 	 	 dCdZdDdZ 	 	 	 	 	 	 dEdZ!dZ"d Z#d!Z$d"Z%d#Z&d$Z'd%Z(e" e# d&e$ d&e( d'Z)d(Z*d)Z+d*Z,d+Z-e-d,fe*d-fe+d.fe,d/ffZ.e%d0fe&d1fe'd2ffZ/dFd3Z0dGd4Z1dGd5Z2	 	 	 	 	 	 	 	 dHd6Z3y	)I    )annotations)	lru_cache)TYPE_CHECKING)Any)Sequence)overload)import_dtypes_module)isinstance_or_issubclassNArrowSeries)DType)Version   )maxsizec                6	   dd l }t        |      }|j                  j                  |       r|j	                         S |j                  j                  |       r|j                         S |j                  j                  |       r|j                         S |j                  j                  |       r|j                         S |j                  j                  |       r|j                         S |j                  j                  |       r|j                         S |j                  j                  |       r|j!                         S |j                  j#                  |       r|j%                         S |j                  j'                  |       r|j)                         S |j                  j+                  |       r|j-                         S |j                  j/                  |       r|j1                         S |j                  j3                  |       s9|j                  j5                  |       s t7        |j                  dd       |       r|j9                         S |j                  j;                  |       r|j=                         S |j                  j?                  |       r'|jA                  | jB                  | jD                        S |j                  jG                  |       r|jI                  | jB                        S |j                  jK                  |       r|jM                         S |j                  jO                  |       r~|jQ                  tS        | jT                        D cg c]P  }|jW                  | jY                  |      jZ                  t]        | jY                  |      j^                  |            R c}      S |j                  ja                  |       s|j                  jc                  |       r%|je                  t]        | jf                  |            S |j                  ji                  |       r0|jk                  t]        | jf                  |      | jl                        S |j                  jo                  |       r|jq                         S |js                         S c c}w )Nr   is_string_viewc                     y)NF )_s    J/var/www/openai/venv/lib/python3.12/site-packages/narwhals/_arrow/utils.py<lambda>z*native_to_narwhals_dtype.<locals>.<lambda>5   s        )	time_unit	time_zone)r   ):pyarrowr	   typesis_int64Int64is_int32Int32is_int16Int16is_int8Int8	is_uint64UInt64	is_uint32UInt32	is_uint16UInt16is_uint8UInt8
is_booleanBoolean
is_float64Float64
is_float32Float32	is_stringis_large_stringgetattrString	is_date32Dateis_timestampDatetimeunittzis_durationDurationis_dictionaryCategorical	is_structStructrange
num_fieldsFieldfieldnamenative_to_narwhals_dtypetypeis_listis_large_listList
value_typeis_fixed_size_listArray	list_size
is_decimalDecimalUnknown)dtypeversionpadtypesis        r   rH   rH      sh   !'*F	xx||~	xx||~	xx||~	xx{{}	xx% }}	xx% }}	xx% }}	xx||~	xx5!~~	xx5!~~	xx5!~~ 	5!88##E*?7288-?F}}	xx% {{}	xxU#uxxHH	xxE"44	xxe$!!##	xx% }} u//0
 1A	 KKN'',U[[^-@-@'J 1
 	
 
xx"(("8"8"?{{3E4D4DgNOO	xx""5)||$U%5%5w?
 	
 
xx5!~~>>#s   ARc           
     D   dd l }t        |      }t        | |j                        r |j                         S t        | |j
                        r |j                         S t        | |j                        r |j                         S t        | |j                        r |j                         S t        | |j                        r |j                         S t        | |j                        r |j                         S t        | |j                        r |j                          S t        | |j"                        r |j$                         S t        | |j&                        r |j(                         S t        | |j*                        r |j,                         S t        | |j.                        r |j0                         S t        | |j2                        r |j4                         S t        | |j6                        r1 |j8                   |j$                          |j0                               S t        | |j:                        r.t=        | dd      }t=        | dd       } |j>                  ||      S t        | |j@                        rt=        | dd      } |jB                  |      S t        | |jD                        r |jF                         S t        | |jH                        r( |jJ                  tM        | jN                  |            S t        | |jP                        rK |jR                  | jT                  D cg c]%  }|jV                  tM        |jX                  |      f' c}      S t        | |jZ                        rd}t]        |      S d	|  }t_        |      c c}w )
Nr   r   usr   )r<   )rU   )rM   z.Converting to Array dtype is not supported yetzUnknown dtype: )0r   r	   r
   r0   float64r2   float32r   int64r    int32r"   int16r$   int8r&   uint64r(   uint32r*   uint16r,   uint8r6   stringr.   bool_r@   
dictionaryr:   r5   	timestampr>   durationr8   date32rL   list_narwhals_to_native_dtypeinnerrB   structfieldsrG   rT   rO   NotImplementedErrorAssertionError)rT   rU   rV   rW   r   r   rF   msgs           r   rl   rl   V   s   !'*Fv~~6rzz|v~~6rzz|v||4rxxzv||4rxxzv||4rxxzv{{3rwwyv}}5ryy{v}}5ryy{v}}5ryy{v||4rxxzv}}5ryy{v~~6rxxzv'9'9:r}}YRYY[)"))+66v7E;5	E;5	r||I)44v7E;5	r{{9%%v{{3ryy{v{{3rxx/
 	
  v}}5ryy #\\	 *E JJ, ' *	
 	
  v||4>"3''E7
#C

	s   9*Nc                n   ddl m} ddlm} |8ddl}| j
                   |j                  d| j
                  j                        fS t        |t              rZt        |      dkD  rGt        |d   d      st        |d   d      rd	}t        |      d
t        |d          }t        |      |d   }t        ||      rt        S t        ||      rt        |      dk(  r| j
                  |d   fS t        |       dk(  rddl}ddl}| d   }|dk  rt        |d      r|j                         } |j                    |j"                   |j$                  |j                         |      | j
                  j                        g      }	|	|j
                  fS | j
                  |j
                  fS | j
                  |fS )a  Validate 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.

    If RHS is length 1, return the scalar value, so that the underlying
    library can broadcast it.
    r   ArrowDataFramer   NrI      __narwhals_expr____narwhals_series__zbMulti-output expressions (e.g. `nw.all()` or `nw.col('a', 'b')`) are not supported in this contextz6Expected scalar value, Series, or Expr, got list of :    as_pyshape
fill_value)narwhals._arrow.dataframeru   narwhals._arrow.seriesr   r   _native_seriesscalarrI   
isinstancelistlenhasattr
ValueErrorNotImplementednumpyr|   chunked_arrayarrayfull)
lhsrhsbackend_versionru   r   rV   rr   npr   left_results
             r   broadcast_and_extract_nativer      s    92
{!!9299T8J8J8O8O#PPP
 #ts8a<s1v23wA-8 { o%J4PSTUPV<.YCS/!!f#~&#{#s8q=%%s1v--s8q= QJ&7:w+G'--/
*"**BHHcggiJG //44K  2 222!!3#5#555s""r   c                \   ddl m} t        ||      rvt        |      dk(  r\ddl}ddl}|j                  d   }|dk  rt        |d      r|j                         } |j                   |j                  | |            S |j                  S ddlm} t        ||      rt        S d	}t        |      )
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   rw   Nrz   r|   r}   rt   zPlease report a bug)r   r   r   r   r   r   r   r   r|   r   r   r   ru   r   rq   )	lengthotherr   r   r   rV   valueru   rr   s	            r   validate_dataframe_comparandr      s     3%%u:? ((+E&75'+B288GBGG&UCDD###8%(
C

r   c                *   ddl }| D cg c]  }|j                  D ]  }|  }}}t        t        |            t        |      k  rd}t	        |      | D cg c]  }|D ]  }|  }}}|j
                  j                  ||      S c c}}w c c}}w )zOConcatenate (native) DataFrames horizontally.

    Should be in namespace.
    r   NzExpected unique column names)names)r   column_namesr   setr   Tablefrom_arrays)dfsrV   dfrG   r   rr   aarrayss           r   horizontal_concatr      s    
 <CbBOODTOTCE<
3u:U#,o*#Br!ara#F*88e44 = +s   B	Bc                    | d   j                   }t        | dd d      D ]-  \  }}|j                   }||k7  sd| d| d| d}t        |       ddl} |j                  |       S )	zMConcatenate (native) DataFrames vertically.

    Should be in namespace.
    r   rw   N)startz>unable to vstack, column names don't match:
   - dataframe 0: z
   - dataframe z: 
)r   	enumerate	TypeErrorr   concat_tables)r   cols_0rX   r   cols_currentrr   rV   s          r   vertical_concatr     s    
 V  F3qr7!,26!%%+H -""#B|nB8 
 C.  - 2C  r   c                J    ddl }|dk  rddinddi} |j                  | fi |S )zMConcatenate (native) DataFrames diagonally.

    Should be in namespace.
    r   N)   r   r   promoteTpromote_optionsdefault)r   r   )r   r   rV   kwargss       r   diagonal_concatr     sB    
  Z' 
D+ 
 2C*6**r   c           
        dd l }dd lm} t        | t        t
        f      r |j                  |       } t        |t        t
        f      r |j                  |      }|j                  j                  | j                        r,|j                  j                  |j                        r|j                  | |      }|j                  j                  |j                        r|j                  |j                  ||      |       }|j                  |j                  | |       |j                  d|j                              }|j!                  |j#                  ||      |j%                  | |j                  d|j                              |      }n|}|j'                  | j                        }|S |j)                  | |      }|j+                  |      }|S )Nr   rv   rw   )r   pyarrow.computecomputer   intfloatr   r   
is_integerrI   divide_checkedis_signed_integer	not_equalmultiplylessbit_wise_xorif_elseand_subtractcastdividefloor)leftrightrV   pcdividedhas_remainderhas_one_negative_operandresults           r   floordiv_compatr   )  so     $e%ryy%#u&		% 	xx499%"((*=*=ejj*I##D%088%%gll3LLWe)DdKM')wwe,		!',,/($ ZZ!,
 GYRYYqw||%DEF FTYY' M ))D%('"Mr   c                >   dd l }dd lm} |j                  j	                  | j
                        rk|j                  j	                  |j
                        rF|j                  |  |j                         d      |j                  | |j                         d      fS | |fS )Nr   F)safe)r   r   r   r   r   rI   r   r[   )arrow_array	pa_objectrV   r   s       r   cast_for_truedivr   P  s    
   
xx;++,1D1DY^^1T ww{JBJJLuw=rwwzrzz|% @G @
 
 	
 	!!r   c                  
 | D cg c]  }t        |       }}t        |      
t        
fd|D              }|r| D cg c]  }|j                   c}S dd l}
dkD  }g }t        | |      D ]  \  }}|j                  }|rg|dk(  rb|d   }	|j                  dk  rt        |	d      r|	j                         }	|j                   |j                  |	g
z  |j                               {|j                  |        |S c c}w c c}w )Nc              3  (   K   | ]	  }|k(    y wNr   ).0_len
max_lengths     r   	<genexpr>z#broadcast_series.<locals>.<genexpr>g  s     ;74DJ&7s   r   rw   rz   r|   rv   )r   maxallr   r   zip_backend_versionr   r|   appendr   rI   )seriesslengths	fast_pathrV   is_max_length_gt_1reshapedr   s_nativer   r   s             @r   broadcast_seriesr   d  s    %&v!s1vvG&WJ;7;;I*01&Q  &11#aH)	6##&A+QKE!!E)geW.EOOHBHHeWz%9NOOOH% * O+ '
 2s
   C<Dc                     y r   r   num_rows
rows_slices     r   convert_slice_to_nparrayr   }  s    NQr   c                     y r   r   r   s     r   r   r     s    EHr   c                     y r   r   r   s     r   r   r     s     r   c                X    t        |t              rdd l} |j                  |       |   S |S )Nr   )r   slicer   arange)r   r   r   s      r   r   r     s-     *e$ryy":..r   c                    t        |t              r|t        d       k(  r| }|S t        |t              r|s| j                  dd      }|S t        t	        |       |      }| j                  |      }|S )Nr   r   )r   r   r   r   r   take)tablerowsselected_rowsrange_s       r   select_rowsr     sp    $45;#6  
D(	#DAq)  *3u:$O

6*r   c                    | j                   |j                  | j                         nd }| j                  |j                  | j                        dz   nd }| j                  }|||fS )Nrw   )r   indexstopstep)	str_slicecolumnsr   r   r   s        r   convert_str_slice_to_int_slicer     sZ     /8oo.IGMM)//*tE090J7==(1,PTD>>D4r   z/(?P<date>\d{1,4}[-/.]\d{1,2}[-/.]\d{1,4}|\d{8})z(?P<sep>\s|T)z'(?P<time>\d{2}:\d{2}(?::\d{2})?|\d{6}?)z^(?P<hms>\d{2}:\d{2}:\d{2})$z^(?P<hm>\d{2}:\d{2})$z^(?P<hms_no_sep>\d{6})$z(?P<tz>Z|[+-]\d{2}:?\d{2})?z?$zw^(?P<year>(?:[12][0-9])?[0-9]{2})(?P<sep1>[-/.])(?P<month>0[1-9]|1[0-2])(?P<sep2>[-/.])(?P<day>0[1-9]|[12][0-9]|3[01])$zw^(?P<day>0[1-9]|[12][0-9]|3[01])(?P<sep1>[-/.])(?P<month>0[1-9]|1[0-2])(?P<sep2>[-/.])(?P<year>(?:[12][0-9])?[0-9]{2})$zw^(?P<month>0[1-9]|1[0-2])(?P<sep1>[-/.])(?P<day>0[1-9]|[12][0-9]|3[01])(?P<sep2>[-/.])(?P<year>(?:[12][0-9])?[0-9]{2})$zY^(?P<year>(?:[12][0-9])?[0-9]{2})(?P<month>0[1-9]|1[0-2])(?P<day>0[1-9]|[12][0-9]|3[01])$%Y%m%dz%Y-%m-%dz%d-%m-%Yz%m-%d-%Yz%H:%M:%Sz%H:%Mz%H%M%Sc                >   ddl }ddlm}  |j                  |j	                  |j                  |       j                  dd      t              j                        }|j                  |j                               j                         sd}t        |      |j                  d      }|j                  d      }|j                  d      }|j                  d	      }|j                  |j                  |            j                         d
kD  rd}t!        |      |j                  |j                  |            j                         d
kD  rd}t!        |      t#        |      }	t%        |      }
|d   j                         }|d   j                         rdnd}|	 | |
 | S )z.Try to infer datetime format from StringArray.r   N
   patternzUnable to infer datetime format, provided format is not supported. Please report a bug to https://github.com/narwhals-dev/narwhals/issuesdateseptimer<   rw   z@Found multiple separator values while inferring datetime format.z?Found multiple timezone values while inferring datetime format.z%z )r   r   r   concat_arraysextract_regex	drop_nullr   FULL_REchunksr   is_validr|   rp   rF   countuniquer   _parse_date_format_parse_time_format)arrrV   r   matchesrr   dates
separatorstimesr<   
date_value
time_value	sep_valuetz_values                r   parse_datetime_formatr    sn    b
c*00B7IPPG 66'""$%++-U 	 "#&&MM&!Eu%JMM&!E	t	B 
xx		*%&,,.2Po	xx		"$$&*Oo#E*J#E*J1##%I!u{{}t"H\)ZL
;;r   c                   dd l m} t        D ]A  \  }}|j                  | |      }|dk(  r1|j	                  |j                               j                         r|c S |j	                  |j                               j                         s~|j                  |j                  |j                  d      x}            j                         dk(  s|j                  |j                  |j                  d      x}            j                         dk(  s|d   j                         x}|d   j                         k(  s0|j                  d|      c S  d}t        |      )	Nr   r  r   sep1rw   sep2-zgUnable to infer datetime format. Please report a bug to https://github.com/narwhals-dev/narwhals/issues)r   r   DATE_FORMATSr
  r   r  r|   r  r  rF   replacer   )	r  r   date_rgxdate_fmtr  r  r  date_sep_valuerr   s	            r   r  r    s     *l(""3"9xBFF7+;+;+=$>$D$D$FOFF7##%&,,.7==+@#@4ABHHJaO7==+@#@4ABHHJaO#'7==?2tAw}}F##C88 +	Q  S/r   c                    dd l m} t        D ]I  \  }}|j                  | |      }|j	                  |j                               j                         sG|c S  y)Nr   r  r  )r   r   TIME_FORMATSr
  r   r  r|   )r  r   time_rgxtime_fmtr  s        r   r  r     sQ     *(""3"966'""$%++-O + r   c               P   ddl }|r|dz  }||dz  dk(  z
  }| j                  } |j                  dg|z  |j                        } |j                  dg|z  |j                        }| j	                   |j
                  |g|j                  |            }	||z   }
|	|
fS | }	d}
|	|
fS )au  Pad series with None values on the left and/or right side, depending on the specified parameters.

    Arguments:
        series: The input ArrowSeries to be padded.
        window_size: The desired size of the window.
        center: Specifies whether to center the padding or not.

    Returns:
        A tuple containing the padded ArrowSeries and the offset value.
    r   N   rv   )r   r   r   rI   _from_native_seriesr	  r  )r   window_sizecenterrV   offset_leftoffset_rightnative_seriespad_left	pad_right
padded_arroffsets              r   
pad_seriesr6  
  s     !Q&"!Oq 
 --288TF[0}7I7IJBHHdVl29K9KL	//BhI)=)=IyIJ

 |+
 v 
vr   )rT   pa.DataTyperU   r   returnr   )rT   zDType | type[DType]rU   r   r8  r7  )r   r   r   r   r   tuple[int, ...]r8  ztuple[pa.ChunkedArray, Any])r   r   r   r   r   r9  r8  r   )r   list[pa.Table]r8  pa.Table)r   r:  r   r9  r8  r;  )r   r   r   r   r8  r   )r   pa.ChunkedArray | pa.Scalarr   r<  r8  z?tuple[pa.ChunkedArray | pa.Scalar, pa.ChunkedArray | pa.Scalar])r   zSequence[ArrowSeries]r8  z	list[Any])r   r   r   r   r8  z
np.ndarray)r   r   r   r   r8  r   )r   r   r   Sequence[int]r8  r=  )r   r   r   zslice | int | Sequence[int]r8  z np.ndarray | int | Sequence[int])r   r;  r   r   r8  r;  )r   r   r   z	list[str]r8  z)tuple[int | None, int | None, int | None])r  zpa.StringArrayr8  str)r  zpa.Arrayr8  r>  )r   r   r-  r   r.  boolr8  ztuple[ArrowSeries, int])4
__future__r   	functoolsr   typingr   r   r   r   narwhals.utilsr	   r
   r   r   r   rV   r   r   narwhals.dtypesr   r   rH   rl   r   r   r   r   r   r   r   r   r   r   r   DATE_RESEP_RETIME_REHMS_REHM_REHMS_RE_NO_SEPTZ_REr  YMD_REDMY_REMDY_REYMD_RE_NO_SEPr!  r'  r  r  r  r6  r   r   r   <module>rP     s5   "       / 32%& 2= =@?D;#	;#;#1@;# ;#|.=<5"!*+$N","9T"D"(2 
 Q 
 Q 
 H 
 H 
, 

:%(. =	
4	( *%Yvhay%
3 
D 
D 
Dl HZZZ	 $ug&68QR$<N,!!),!6:!!r   