o
    Lh>                     @  s  U d dl mZ d dlmZ d dlmZmZmZ d dlZ	d dl
mZ d dlmZ d dlmZmZ erd dlmZmZmZ d dlmZmZ d d	lmZ d d
lmZmZmZmZm Z m!Z!m"Z" d dl#m$Z$ d dl%m&Z& d dl'm(Z(m)Z) e Z*de+d< dddZ,dddZ-dddZ.dddZ/dd d!Z0dd#d$Z1ddd%dd,d-Z2nd d.l
m2Z2 d d/l3m1Z1m-Z-m0Z0m/Z/m.Z.m,Z, d0d1d2d3d4d5d6d7d8d9d:
Z4d;e+d<< e	j5Z6	 dd>d?Z7ddBdCZ8	dddHdIZ9ddOdPZ:ddRdSZ;edTdUddZd[Z<ej=j>Z>i e>j?e	@ e>jAe	B e>jCe	D e>jEe	F e>jGe	H e>jIe	Je	K e	F e>jLe	M e>jNe	Od\e>jPe	Q e>jRe	S e>jTe	U e>jVe	W e>jXe	Y e>jZe	[ e>j\e	K e>j]e	^ Z_d]e+d^< e>j`e>jafZbdd`daZcddfdgZdddkdlZeddrdsZfdtZgduZhdvZidwZjdxZkdyZldzZmeg eh d{ei d{em d|Znd}Zod~ZpdZqdZrerdfeodfepdfeqdffZsejdfekdfeldffZtddd%dddZudddZvdddZwdddZxdddZydddZzG dd ded Z{dS )    )annotations)	lru_cache)TYPE_CHECKINGAnycastN)EagerSeriesNamespace)Versionisinstance_or_issubclass)IterableIteratorMapping)	TypeAliasTypeIsArrowSeries)ArrayAnyArrayOrScalarArrayOrScalarT1ArrayOrScalarT2ChunkedArrayAnyNativeIntervalUnit	ScalarAny)IntervalUnit)DType)	IntoDTypePythonLiteralr   ChunkedArrayStructArraytr   return"TypeIs[pa.TimestampType[Any, Any]]c                 C     d S N r   r"   r"   V/var/www/html/Persson_Maskin/env/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(   r&   r0   optionsmemory_poolpatternstrstringsr   r2   r3   c               C  r    r!   r"   )r6   r4   r2   r3   r"   r"   r$   extract_regex)   s   r7   )r7   )r0   r(   r.   r,   r*   r%   yearquartermonthdayhourminutesecondmillisecondmicrosecond
nanosecond)
yqmodhmsmsusnsz)Mapping[IntervalUnit, NativeIntervalUnit]
UNITS_DICTvaluec                C  s   ddl m} || ddS )Nr   )maybe_extract_py_scalarT)return_py_scalar)narwhals._arrow.seriesrN   )rM   rN   r"   r"   r$   extract_py_scalarM   s   rQ   objTypeIs[ArrayOrScalar]c                 C  s   t | tjtjtjfS )z-Return True for any base `pyarrow` container.)
isinstancepaChunkedArrayArrayScalar)rR   r"   r"   r$   is_array_or_scalarS   s   rY   arr#ArrayOrScalar | list[Iterable[Any]]dtypepa.DataType | Nonec                C  s4   t | tjr| S t | trt| |S t| g|S r!   )rT   rU   rV   listchunked_array)rZ   r\   r"   r"   r$   r_   X   s
   
r_   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`.
    )rU   nullsnativetype)r`   rb   r"   r"   r$   
nulls_likeb   s   rf   pa.Int64Arrayc                C  s   t d| S )Nr   )rU   repeat)r`   r"   r"   r$   zerosj   s   ri      )maxsizepa.DataTypeversionr   r   c                   s4  j tj r S tj r S tj r! S tj	 r+
 S tj r5 S tj r? S tj rI S tj rS S tj r] S tj rg S tj rq 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)rq   c              	     s.   g | ]}  |jt |jqS r"   )Fieldfieldnamenative_to_narwhals_dtypere   ).0ir\   dtypesrm   r"   r$   
<listcomp>   s    
z,native_to_narwhals_dtype.<locals>.<listcomp>);rz   rU   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(   Durationr0   Categorical	is_structStructrange
num_fieldsr*   r,   Listrv   
value_typer.   rW   	list_size
is_decimalDecimal	is_time32	is_time64Time	is_binaryBinaryUnknown)r\   rm   r"   ry   r$   rv   n   sr   

	rv   rK   z!Mapping[type[DType], pa.DataType]NW_TO_PA_DTYPESr   c           
        s   j }|  }t| }r|S t| |jr)| j}| j }r$t	||S t	|S t| |j
r5t| jS t| |jrFtjt| j ddS t| |jrYt fdd| jD S t| |jrpt| j d}| j}tj||dS t|trd|j d}	t|	d|  }	t|	)	Nrm   )r   c                   s    g | ]}|j t|j d fqS )r   )ru   narwhals_to_native_dtyper\   )rw   rt   r   r"   r$   r{      s    z,narwhals_to_native_dtype.<locals>.<listcomp>)r   zConverting to z$ dtype is not supported for PyArrow.zUnknown dtype: )rz   	base_typer   getr	   r   rq   rr   rU   	timestampr   durationr   list_r   innerr   structfieldsrW   size
issubclassUNSUPPORTED_DTYPES__name__NotImplementedErrorAssertionError)
r\   rm   rz   r   pa_typer   r   r   r   msgr"   r   r$   r      s4    


r   lhsrhs'ArrowSeries | PythonLiteral | ScalarAny?tuple[ChunkedArrayAny | ScalarAny, ChunkedArrayAny | ScalarAny]c                 C  s   ddl m} |du r| jtd| jdfS t||r8| jr'|js'| jd |jfS |jr2| j|jd fS | j|jfS t|trCd}t|| jt|t	j
rN|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   r   Nre   z$Expected Series or scalar, got list.)rP   r   rd   lit_typerT   
_broadcastr^   	TypeErrorrU   rX   )r   r   r   r   r"   r"   r$   extract_native   s   

 r   leftr   rightc             	   C  s   t j| jrUt j|jrUt| |}t j|jrKtd|j}tt	||| }t
t| |td|}tt||t|td||}n|}|| j}|S t| |}t|}|S )Nzpa._lib.Int64Typer      )rU   r|   
is_integerre   pcdivide_checkedis_signed_integerr   	not_equalmultiplylessbit_wise_xorr   if_elseand_subtractdividefloor)r   r   divideddiv_typehas_remainderhas_one_negative_operandresultr"   r"   r$   floordiv_compat  s&   

r   arrow_arrayr   	pa_objectr   'tuple[ArrayOrScalarT1, ArrayOrScalarT2]c                 C  sH   t j| jr t j|jr | jt  dd|jt  ddfS | |fS )NF)safe)rU   r|   r   re   r   float64)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 )Nr1   r   )rU   concat_arraysr7   chunksr   )r6   r4   r2   r3   rr"   r"   r$   _extract_regex_concat_arraysI  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   
   r4   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   allis_validas_pyr   rt   countunique
ValueError_parse_date_formatr   _parse_time_format)	rZ   matchesr   
separatorsr   
date_value
time_value	sep_valuetz_valuer"   r"   r$   parse_datetime_formatW  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   r7   r   r   r   r   r   rt   replacer   )rZ   date_rgxdate_fmtr   r  r  date_sep_valuer   r"   r"   r$   r   v  s   ""r   c                 C  s:   t D ]\}}tj| |d}t|  r|  S qdS )Nr   r   )TIME_FORMATSr   r7   r   r   r   )rZ   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   )rU   arrayr   r   rd   r   _with_native)rb   r  r  offset_leftoffset_rightpad_left	pad_rightconcatr"   r"   r$   
pad_series  s   r  chunked_arrays	separator+tuple[Iterator[ChunkedArrayAny], ScalarAny]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!   )rU   r|   r   re   rw   car"   r"   r$   	<genexpr>  s    z2cast_to_comparable_string_types.<locals>.<genexpr>c                 3  s    | ]}|  V  qd S r!   )r   r!  r\   r"   r$   r#    s    )anyrU   stringlarge_stringr   )r  r  r"   r$  r$   cast_to_comparable_string_types  s
   
r(  c                   @  s   e Zd ZdS )ArrowSeriesNamespaceN)r   
__module____qualname__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   r/   )
r4   r5   r6   r   r2   r   r3   r   r   r   )rM   r   r   r   )rR   r   r   rS   r!   )rZ   r[   r\   r]   r   r   )r`   ra   rb   r   r   r   )r`   ra   r   rg   )r\   rl   rm   r   r   r   )r\   r   rm   r   r   rl   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   )
r4   r5   r6   r   r2   r   r3   r   r   r   )rZ   r   r   r5   )rZ   r   r   r5   )rb   r   r  ra   r  r  r   r  )r  r   r  r5   r   r   )|
__future__r   	functoolsr   typingr   r   r   pyarrowrU   pyarrow.computecomputer   narwhals._compliantr   narwhals._utilsr   r	   collections.abcr
   r   r   typing_extensionsr   r   rP   r   narwhals._arrow.typingr   r   r   r   r   r   r   narwhals._durationr   narwhals.dtypesr   narwhals.typingr   r   r   __annotations__r%   r(   r*   r,   r.   r0   r7   pyarrow.typesrL   scalarr   rQ   rY   r_   rf   ri   rv   MAINrz   r   r   r   float32r   binaryr   r&  r   bool_r   
dictionaryuint32r   date32r   time64r   int8r   int16r   int32r~   int64r   uint8r   uint16r   r   uint64r   r   Objectr   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






	
















