o
    3g>$                     @  s  d Z ddlmZ ddlZddl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 ddlmZ d	d
lmZ d	dlmZmZmZ d	dlmZ d	dlmZmZ eeZeruddlZ e j!Z"e j#Z$ddl%m&Z& edede"f dZ'nddlm(Z( eZ"e(Z$eZ&dDddZ)dEddZ*ed Z+dFd!d"Z,edGdHd&d'Z-d(dd)dId1d2Z.dJd6d7Z/eZ0dKd:d;Z1e-dLdMd>d?Z2ej3G d@dA dAZ4dEdBdCZ5dS )Nz2
Various pandas helpers and convenience functions
    )annotationsN)IterableIterator)datetimetimezone)pformat)TYPE_CHECKINGAnyCallableLiteralTypeVar)	decorator   )warnings)Reserror_to_jsonextract_error_datetime)make_logger)Jsonasdict)S1FuncT.)bound)OptionalsSeriesT[S1]returnIterable[str]c                 #  s    dd l  | j}t|drd S |  } t| dkrd S |  fdd }|s,d S | dd 	 }| |j
 }dttt|| d V  d S )Nr   
datetime64c                   s   t |  jtfS N)
isinstance	Timestampr   xpd (/home/garg/my-data/HPI/my/core/pandas.py<lambda>:   s    z _check_dateish.<locals>.<lambda>c                 S  s   | j S r   tzinfor"   r&   r&   r'   r(   =   s    zj
    All values are timestamp-like, but dtype is not datetime. Most likely, you have mixed timezones:
    z
    )pandasdtypestr
startswithdropnalenapplyallmapdrop_duplicatesindexr   listzipstrip)r   ctypeall_timestampstzsexamplesr&   r$   r'   _check_dateish1   s$   
r=   Nonec                  C  s   dd l } ddlm} tt| g g ksJ tt| g dg ks&J tt| |d|dgg ks9J ttt| |d|dgdksNJ ttt| d|dgdksaJ d S )	Nr   r   fromisoformat)r         z2024-08-19T01:02:03z2024-08-19T03:04:05z2024-08-19T03:04:05Zwhatever)r+   compatr@   r6   r=   Seriesr0   )r%   r@   r&   r&   r'   test_check_dateishF   s,   



rF   )add_if_missingwarnignoredf
DataFrameTpolicyErrorColPolicyc                c  sF    d| v rd S |dkrd S d  }|dkrd | d< |d7 }	 |V  d S )NerrorrI   z
No 'error' column detected. You probably forgot to handle errors defensively, which means a single bad entry might bring the whole dataframe down.
rG   zZ
Adding empty 'error' column (see 'error_col_policy' if you want to change this behaviour))r8   )rJ   rL   wmsgr&   r&   r'   check_error_columns   s   
rP   rG   ferror_col_policyc           
   
   O  s   | |i |}d}z!|   D ]\}}t|D ]}t| d| d|  qqW n tyA }	 zt|	 W Y d }	~	nd }	~	ww zt||dD ]}t| d|  qIW |S  typ }	 zt|	 W Y d }	~	|S d }	~	ww )Nz{f.__module__}:{f.__name__}z
, column 'z': )rL   z, )	reset_indexitemsr=   r   low	Exceptionlogger	exceptionrP   )
rQ   rR   argskwargsrJ   tagcoldatawer&   r&   r'   check_dataframe   s,   r`   dt)dt_coltzr_   rV   rb   r-   rc   timezone | Noner   c                C  sB   t | }|d ur|jd u r|d ur|j|d}t| }|||< |S )Nr)   )r   r*   replacer   )r_   rb   rc   edterr_dictr&   r&   r'   error_to_row   s   rh   itIterable[Res[Any]]Iterable[Json]c                 c  s0    | D ]}t |trt|V  qt|V  qd S r   )r    rV   rh   r   )ri   rr&   r&   r'   	_to_jsons   s   
rm   Schemadict[str, type]c                 C  s(   t | rdd t | D S t| dS )Nc                 S  s   i | ]}|j |jqS r&   )nametype).0rQ   r&   r&   r'   
<dictcomp>   s    z_as_columns.<locals>.<dictcomp>_field_types)dataclassesis_dataclassfieldsgetattr)r   r&   r&   r'   _as_columns   s   

ry   schemaSchema | Nonec                 C  s6   dd l }|d u r
d ntt| }|jt| |dS )Nr   columns)r+   r6   ry   keys	DataFramerm   )ri   rz   r%   r}   r&   r&   r'   as_dataframe   s   	r   c                   @     e Zd ZU ded< dS )_Xintr#   N__name__
__module____qualname____annotations__r&   r&   r&   r'   r      s   
 r   c            
   	     s  dd l } dd l}dd l}ddlm} ddlm dd tdD }|jt	dd	}t
|}W d    n1 s7w   Y  |||g d
g dg dd |t
g |jdgd t
g td}|||jddgd tjG dd d d' fdd}t
| }|||jd| jg| jdg| j| jgddjddid d' fdd }	t
|	 }|||jd!| jd"| jg| jd#| jd$g| j| j| jd%gddjdd&id d S )(Nr   )assert_frame_equalr   r?   c                 s  s     | ]}|d | dV  qdS )r-   )ir   Nr&   )rr   r   r&   r&   r'   	<genexpr>   s    z$test_as_dataframe.<locals>.<genexpr>   zNo 'error' column)match)r   r   rA   rB      )str0str1str2str3str4)NNNNN)r   r   rN   rN   r|   )rz   r#   c                   @  r   )ztest_as_dataframe.<locals>.Sr-   valueNr   r&   r&   r&   r'   S   s   
 r   r   Iterator[Res[S]]c                   3  s     ddV  t dV  d S )Ntestr   zi failedRuntimeErrorr&   )r   r&   r'   it2   s   ztest_as_dataframe.<locals>.it2r   zRuntimeError: i failed
)r   rN   ra   )r]   ra   float)r,   c                   3  s8     ddV  t dV   ddV  t ddV  d S )Nabar   whoopscdezexception with datetimez2024-08-19T22:47:01Zr   r&   r   r@   r&   r'   it3  s
   
ztest_as_dataframe.<locals>.it3r   r   zRuntimeError: whoops
zsRuntimeError: ('exception with datetime', datetime.datetime(2024, 8, 19, 22, 47, 1, tzinfo=datetime.timezone.utc))
z2024-08-19 22:47:01+00:00zdatetime64[ns, UTC])r   r   )numpyr+   pytestpandas.testingr   rD   r@   rangewarnsUserWarningr   r   r   ru   	dataclassnanastype)
npr%   r   r   ri   record_warningsrJ   df2r   r   r&   r   r'   test_as_dataframe   s\   





r   )r   r   r   r   )r   r>   )rJ   rK   rL   rM   r   r   )rG   )rQ   r   rR   rM   r   rK   )r_   rV   rb   r-   rc   rd   r   r   )ri   rj   r   rk   )r   rn   r   ro   r   )ri   rj   rz   r{   r   rK   )6__doc__
__future__r   ru   collections.abcr   r   r   r   pprintr   typingr   r	   r
   r   r   r    r   rN   r   r   r   loggingr   typesr   r   r   rW   r+   r%   r   rK   rE   SeriesTpandas._typingr   r   r   r=   rF   rM   rP   r`   rh   rm   rn   ry   r   r   r   r   r&   r&   r&   r'   <module>   sP    

%

	


