o
    h|D                     @  s:  U 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
 d d	l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rd 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! 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"Z)de*d< dd!d"Z+dd$d%Z,dd'd(Z-dd*d+Z.dd-d.Z/dd0d1Z0d	d	d2dd9d:Z1n*d d;lm1Z1 d d<l2m0Z0 d d=l2m,Z, d d>l2m/Z/ d d?l2m.Z. d d@l2m-Z- d dAl2m+Z+ ej3Z4	 ddCdDZ5		dddIdJZ6ddPdQZ7edRdSddXdYZ8dd[d\Z9ddadbZ:ddddeZ;ddidjZ<ddpdqZ=drZ>dsZ?dtZ@duZAdvZBdwZCdxZDe> e? dye@ dyeD dzZEd{ZFd|ZGd}ZHd~ZIeIdfeFdfeGdfeHdffZJeAdfeBdfeCdffZKd	d	d2dddZLdddZMdddZNdddZOdddZPdddZQG dd ded ZRd	S )    )annotations)	lru_cache)TYPE_CHECKING)Any)Iterable)Iterator)SequencecastN)_SeriesNamespace)
ShapeError)import_dtypes_module)isinstance_or_issubclass)	TypeAlias)TypeIsArrowSeries)ArrayAny)ArrayOrScalarAny)ArrayOrScalarT1)ArrayOrScalarT2)
ArrowArray)ArrowChunkedArray)	ScalarAny)DType)PythonLiteral)Versionr   ChunkedArrayStructArraytr   return"TypeIs[pa.TimestampType[Any, Any]]c                 C     d S N r   r#   r#   I/var/www/vscode/kcb/lib/python3.10/site-packages/narwhals/_arrow/utils.pyis_timestamp'       r&   TypeIs[pa.DurationType[Any]]c                 C  r!   r"   r#   r$   r#   r#   r%   is_duration(   r'   r)   TypeIs[pa.ListType[Any]]c                 C  r!   r"   r#   r$   r#   r#   r%   is_list)   r'   r+   TypeIs[pa.LargeListType[Any]]c                 C  r!   r"   r#   r$   r#   r#   r%   is_large_list*   r'   r-   &TypeIs[pa.FixedSizeListType[Any, Any]]c                 C  r!   r"   r#   r$   r#   r#   r%   is_fixed_size_list+   r'   r/   (TypeIs[pa.DictionaryType[Any, Any, Any]]c                 C  r!   r"   r#   r$   r#   r#   r%   is_dictionary,   s   r1   optionsmemory_poolpatternstrstringsr   r3   r4   c               C  r!   r"   r#   )r7   r5   r3   r4   r#   r#   r%   extract_regex/   s   r8   )r8   )r1   )r)   )r/   )r-   )r+   )r&   valuec                C  s   ddl m} || ddS )Nr   )maybe_extract_py_scalarT)return_py_scalar)narwhals._arrow.seriesr:   )r9   r:   r#   r#   r%   extract_py_scalarD   s   r=   arr*ArrayAny | list[Iterable[Any]] | ScalarAnydtypepa.DataType | Nonec                C  s6   t | tjr| S t | trt| |S t| g| jS r"   )
isinstancepaChunkedArraylistchunked_arraytype)r>   r@   r#   r#   r%   rF   J   s
   
rF   nintseriesr   r   c                 C  s   t | |jjS )z|Create a strongly-typed Array instance with all elements null.

    Uses the type of `series`, without upseting `mypy`.
    )rC   nullsnativerG   )rH   rJ   r#   r#   r%   
nulls_likeU   s   rM      )maxsizepa.DataTypeversionr   r   c                   s6  t tj r S tj r S tj r" S tj	 r,
 S tj r6 S tj r@ S tj rJ S tj rT S tj r^ S tj rh S tj rr S tj stj sttjddd  r S tj r S t rj  j! j"dS t# rj$ j!dS tj% r& S tj' rЈ( fddt) j*D S t+ st, r-t. j/S t0 r1t. j/ j2S tj3 r4 S tj5 stj6 r7 S tj8 r9 S : S )Nis_string_viewc                 S  s   dS )NFr#   )_r#   r#   r%   <lambda>{   r'   z*native_to_narwhals_dtype.<locals>.<lambda>)	time_unit	time_zone)rU   c              	     s.   g | ]}  |jt |jqS r#   )Fieldfieldnamenative_to_narwhals_dtyperG   ).0ir@   dtypesrQ   r#   r%   
<listcomp>   s    
z,native_to_narwhals_dtype.<locals>.<listcomp>);r   rC   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Dater&   Datetimeunittzr)   Durationr1   Categorical	is_structStructrange
num_fieldsr+   r-   ListrZ   
value_typer/   Array	list_size
is_decimalDecimal	is_time32	is_time64Time	is_binaryBinaryUnknown)r@   rQ   r#   r]   r%   rZ   ]   sr   

	rZ   DType | type[DType]c                   s0  t  }t| |jrd}t|t| |jrt S t| |jr$t S t| |j	r.t
 S t| |jr8t S t| |jrBt S t| |jrLt S t| |jrVt S t| |jr`t S t| |jrjt S t| |jrtt S t| |jr~t S t| |jrt S t| |jrtt t S t| |jrtj | j!| j"dS t| |j#rt$| j!S t| |j%rt& S t| |j'rtj(t)| j* ddS t| |j+rt, fdd| j-D S t| |j.rt)| j* d}| j/}tj(||dS t| |j0rt1dS t| |j2rt3 S d	|  }t4|)
Nz(Casting to Decimal is not supported yet.)r   rQ   )r   c                   s    g | ]}|j t|j d fqS )r   )rY   narwhals_to_native_dtyper@   )r[   rX   r   r#   r%   r_      s    z,narwhals_to_native_dtype.<locals>.<listcomp>)r   nszUnknown dtype: )5r   r   r   NotImplementedErrorrt   rC   float64rv   float32rb   int64rd   int32rf   int16rh   int8rj   uint64rl   uint32rn   uint16rp   uint8rz   stringrr   bool_r   
dictionaryr}   	timestamprU   rV   r   durationr|   date32r   list_r   innerr   structfieldsr   sizer   time64r   binaryAssertionError)r@   rQ   r^   msgr   r   r#   r   r%   r      sl   


r   lhsrhs'ArrowSeries | PythonLiteral | ScalarAnyCtuple[ArrowChunkedArray | ScalarAny, ArrowChunkedArray | ScalarAny]c                 C  s   ddl m} ddlm} |du r| jtd| jdfS t||r!tS t||rE| j	r4|j	s4| jd |jfS |j	r?| j|jd fS | j|jfS t|t
rPd}t|| jt|tjr[|fS t|fS )aJ  Extract native objects in binary  operation.

    If the comparison isn't supported, return `NotImplemented` so that the
    "right-hand-side" operation (e.g. `__radd__`) can be tried.

    If one of the two sides has a `_broadcast` flag, then extract the scalar
    underneath it so that PyArrow can do its own broadcasting.
    r   )ArrowDataFramer   NrG   z$Expected Series or scalar, got list.)narwhals._arrow.dataframer   r<   r   rL   lit_typerB   NotImplemented
_broadcastrE   	TypeErrorrC   Scalar)r   r   r   r   r   r#   r#   r%   extract_native   s    


 r   Sequence[ArrowSeries]c               	     s   dd | D }t | t fdd|D }|r| S g }| D ]D}|jrH|jd }|jdk r6t|dr6| }||t	j
|g  |jd qt| } kr]d	  d
| d}t||| q|S )Nc                 S  s   g | ]}t |qS r#   )len)r[   sr#   r#   r%   r_      s    z/align_series_full_broadcast.<locals>.<listcomp>c                 3  s    | ]}| kV  qd S r"   r#   )r[   _len
max_lengthr#   r%   	<genexpr>   s    z.align_series_full_broadcast.<locals>.<genexpr>r   )   as_pyr   zExpected object of length z, got .)maxallr   rL   _backend_versionhasattrr   append_with_nativerC   arrayr   r   r   )rJ   lengths	fast_pathreshapedr   r9   
actual_lenr   r#   r   r%   align_series_full_broadcast   s"   
$r   leftr   rightc              
   C  s   t j| jrSt j|jrSt| |}t j|jrItt||| }t	t
| |td|jd}tt||t|td|jd|}n|}|| j}|S t| |}t|}|S )Nr   r      )rC   r`   
is_integerrG   pcdivide_checkedis_signed_integer	not_equalmultiplylessbit_wise_xorr   if_elseand_subtractr
   dividefloor)r   r   dividedhas_remainderhas_one_negative_operandresultr#   r#   r%   floordiv_compat  s$   

r   arrow_arrayr   	pa_objectr   'tuple[ArrayOrScalarT1, ArrayOrScalarT2]c                 C  sL   t j| jr"t j|jr"tj| t  ddtj|t  ddfS | |fS )NF)safe)rC   r`   r   rG   r   r
   r   )r   r   r#   r#   r%   cast_for_truediv/  s
   
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%Spa.StructArrayc               C  s"   t t| |||dj}td|S )Nr2   r   )rC   concat_arraysr8   chunksr
   )r7   r5   r3   r4   rr#   r#   r%   _extract_regex_concat_arraysZ  s   
r   c           	      C  s   t |  ddtd}t|  sd}t||	d}|	d}t
t| dkr7d}t|t
t| dkrId	}t|ttd
|	d}ttd
|	d}|d  }|d  rkdnd}| | | | S )z.Try to infer datetime format from StringArray.r   
   r5   zUnable to infer datetime format, provided format is not supported. Please report a bug to https://github.com/narwhals-dev/narwhals/issuessepr   r   z@Found multiple separator values while inferring datetime format.z?Found multiple timezone values while inferring datetime format.pc.StringArraydatetimez%z )r   	drop_nullsliceFULL_REr   r   is_validr   r   rX   countunique
ValueError_parse_date_formatr
   _parse_time_format)	r>   matchesr   
separatorsr   
date_value
time_value	sep_valuetz_valuer#   r#   r%   parse_datetime_formath  s$   

r  r   c                 C  s   t D ]]\}}tj| |d}|dkrt|  r|  S t|  r_tt|d } dkr_tt|d } dkr_|d   }|d  kr_|	d|  S qd}t
|)	Nr   r   sep1r   sep2r   -zgUnable to infer datetime format. Please report a bug to https://github.com/narwhals-dev/narwhals/issues)DATE_FORMATSr   r8   r   r   r   r   r  rX   replacer  )r>   date_rgxdate_fmtr  r  r  date_sep_valuer   r#   r#   r%   r    s   ""r  c                 C  s:   t D ]\}}tj| |d}t|  r|  S qdS )Nr   r   )TIME_FORMATSr   r8   r   r   r   )r>   time_rgxtime_fmtr  r#   r#   r%   r    s   r  window_sizecenterbooltuple[ArrowSeries, int]c                C  sz   |s| dfS |d }||d dk }t jdg| | jd}t jdg| | jd}t |g| jj|}| ||| 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      Nr   )rC   r   r   r   rL   r   r   )rJ   r  r  offset_leftoffset_rightpad_left	pad_rightconcatr#   r#   r%   
pad_series  s   r!  chunked_arrays	separator2tuple[Iterator[ArrowChunkedArray], pa.Scalar[Any]]c                   s>   t dd |D st nt   fdd|D t|  fS )Nc                 s  s    | ]
}t j|jV  qd S r"   )rC   r`   rx   rG   r[   car#   r#   r%   r     s    z2cast_to_comparable_string_types.<locals>.<genexpr>c                 3  s    | ]}|  V  qd S r"   r	   r%  r@   r#   r%   r     s    )anyrC   r   large_stringr   )r#  r"  r#   r'  r%   cast_to_comparable_string_types  s
   
r*  c                   @  s   e Zd ZdddZdS )	ArrowSeriesNamespacerJ   r   r   Nonec                C  s
   || _ d S r"   )_compliant_series)selfrJ   r#   r#   r%   __init__  s   
zArrowSeriesNamespace.__init__N)rJ   r   r   r,  )__name__
__module____qualname__r/  r#   r#   r#   r%   r+    s    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   r0   )
r5   r6   r7   r   r3   r   r4   r   r   r   )r9   r   r   r   r"   )r>   r?   r@   rA   r   r   )rH   rI   rJ   r   r   r   )r@   rP   rQ   r   r   r   )r@   r   rQ   r   r   rP   )r   r   r   r   r   r   )rJ   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   )
r5   r6   r7   r   r3   r   r4   r   r   r   )r>   r   r   r6   )r>   r   r   r6   )rJ   r   r  rI   r  r  r   r  )r"  r   r#  r6   r   r$  )S
__future__r   	functoolsr   typingr   r   r   r   r   r
   pyarrowrC   pyarrow.computecomputer   narwhals._compliant.seriesr   narwhals.exceptionsr   narwhals.utilsr   r   typing_extensionsr   r   r<   r   narwhals._arrow.typingr   r   r   r   r   r   r   narwhals.dtypesr   narwhals.typingr   r   r   __annotations__r&   r)   r+   r-   r/   r1   r8   pyarrow.typesscalarr   r=   rF   rM   rZ   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  r  r!  r*  r+  r#   r#   r#   r%   <module>   s    





	


A
;
"






