o
    e1                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZ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 ddlmZ ddlmZmZ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 erhd dl Z!G dd deZ"ee#ej$e"ef Z%ede%dZ&e	e'ee'e#ee# f f Z(e	e'ee#ee# f f Z)G dd deZ*G dd dee* Z+G dd de,Z-ej.dEde&dee/ de&fddZ0ej.	dFde%dee/ dee1 deeej$e	e'e
f df  fdd Z2G d!d" d"eZ3G d#d$ d$eZ4G d%d& d&eZ5G d'd( d(eZ6ej.	)	*	+	,dGde%d-e'd.e'd/e'd0e'de5fd1d2Z7ej.	)	3	+	,dHdee#ej$ef d-e'd.e'd/e'd0e'de6fd4d5Z8ej.de%de)fd6d7Z9de%ddfd8d9Z:d:e'de'fd;d<Z;de%de'fd=d>Z<dee#ej$ef de'fd?d@Z=dAdB Z>dCdD Z.dS )I    N)UnionMutableMappingOptionalDictSequenceTYPE_CHECKINGList)curried)TypeVar   )import_pyarrow_interchange)sanitize_dataframesanitize_arrow_table_DataFrameLike)sanitize_geo_interface)AltairDeprecationWarning)PluginRegistry)Protocol	TypedDictLiteralc                   @   s   e Zd ZU eed< dS )_SupportsGeoInterface__geo_interface__N)__name__
__module____qualname__r   __annotations__ r   r   AD:\Projects\ConvertPro\env\Lib\site-packages\altair/utils/data.pyr      s   
 r   
_TDataType)boundc                   @   s   e Zd ZdedefddZdS )DataTransformerTypedatareturnc                 K   s   d S Nr   )selfr!   kwargsr   r   r   __call__1   s   zDataTransformerType.__call__N)r   r   r   	_DataType_VegaLiteDataDictr&   r   r   r   r   r    0   s    r    c                   @   s>   e Zd ZddiZedefddZejdeddfddZdS )	DataTransformerRegistryconsolidate_datasetsTr"   c                 C   s
   | j d S Nr*   _global_settings)r$   r   r   r   r*   8   s   
z,DataTransformerRegistry.consolidate_datasetsvalueNc                 C   s   || j d< d S r+   r,   )r$   r.   r   r   r   r*   <   s   )r   r   r   r-   propertyboolr*   setterr   r   r   r   r)   5   s    r)   c                   @   s   e Zd ZdZdS )MaxRowsErrorz+Raised when a data model has too many rows.N)r   r   r   __doc__r   r   r   r   r2   B   s    r2     r!   max_rowsr"   c                    s   t |   fdd}t| dr | jd dkr| jd }n8| j}n4t| tjr)| }n+t| tr9d| v r7| d }n| S t| drTt }|| } d	urR|j	 krR|  |S  d	urat
| kra|  | S )
zzRaise MaxRowsError if the data model has more than max_rows.

    If max_rows is None, then do not perform any check.
    c                      s   t d  d)NzHThe number of rows in your dataset is greater than the maximum allowed (aG  ).

Try enabling the VegaFusion data transformer which raises this limit by pre-evaluating data
transformations in Python.
    >> import altair as alt
    >> alt.data_transformers.enable("vegafusion")

Or, see https://altair-viz.github.io/user_guide/large_datasets.html for additional information
on how to plot large datasets.)r2   r   r5   r   r   raise_max_rows_errorP   s
   z(limit_rows.<locals>.raise_max_rows_errorr   typeZFeatureCollectionfeaturesvalues__dataframe__N)check_data_typehasattrr   
isinstancepd	DataFramedictr   from_dataframeZnum_rowslen)r!   r5   r7   r:   pipa_tabler   r6   r   
limit_rowsH   s*   




rF   nfraczpyarrow.lib.Tablec                 C   s   t |  t| tjr| j||dS t| tr<d| v r:| d }|s0|du r(tdt|t| }t	||}d|iS dS t
| drjt }|| }|s[|du rStdt|t| }t	tt||}||S dS )zBReduce the size of the data model by sampling without replacement.)rG   rH   r:   Nz9frac cannot be None if n is None and data is a dictionaryr;   z:frac cannot be None if n is None with this data input type)r<   r>   r?   r@   samplerA   
ValueErrorintrC   randomr=   r   rB   rangeZtake)r!   rG   rH   r:   rD   rE   indicesr   r   r   rI   {   s6   



rI   c                   @      e Zd ZU ed ed< dS )_JsonFormatDictjsonr8   Nr   r   r   r   r   r   r   r   r   rP         
 rP   c                   @   rO   )_CsvFormatDictcsvr8   NrR   r   r   r   r   rT      rS   rT   c                   @      e Zd ZU eed< eed< dS )_ToJsonReturnUrlDicturlformatN)r   r   r   strr   rP   r   r   r   r   rW         
 rW   c                   @   rV   )_ToCsvReturnUrlDictrX   rY   N)r   r   r   rZ   r   rT   r   r   r   r   r\      r[   r\   altair-datarQ   {prefix}-{hash}.{extension} prefix	extensionfilenameurlpathc                 C   l   t | }t|}|j|||d}t|d}|| W d   n1 s%w   Y  tj||ddidS )zQ
    Write the data model to a .json file and return a url based data model.
    r`   hashra   wNr8   rQ   rX   rY   )_data_to_json_string_compute_data_hashrY   openwriteospathjoin)r!   r`   ra   rb   rc   Z	data_json	data_hashfr   r   r   to_json   s   rr   rU   c                 C   rd   )zFWrite the data model to a .csv file and return a url based data model.re   rg   Nr8   rU   rh   )_data_to_csv_stringrj   rY   rk   rl   rm   rn   ro   )r!   r`   ra   rb   rc   Zdata_csvrp   rq   r   r   r   to_csv   s   	rt   c                 C   s   t |  t| drt| tjrt| } t| j}d|iS t| tjr.t| } d| jddiS t| t	r=d| vr;t
d| S t| drRt }t|| }d| iS tdt| )z0Replace a DataFrame by a data model with values.r   r:   records)orient.values expected in data dict, but not present.r;   zUnrecognized data type: {})r<   r=   r>   r?   r@   r   r   r   to_dictrA   KeyErrorr   r   rB   	to_pylistrJ   rY   r8   )r!   Zdata_sanitizedrD   rE   r   r   r   	to_values   s$   



r{   c                    s@   t  ttjfst fdddD stdt d S d S )Nc                 3   s    | ]}t  |V  qd S r#   )r=   ).0attrr!   r   r   	<genexpr>   s    

z"check_data_type.<locals>.<genexpr>)r   r;   zBExpected dict, DataFrame or a __geo_interface__ attribute, got: {})r>   rA   r?   r@   any	TypeErrorrY   r8   r~   r   r~   r   r<      s   r<   data_strc                 C   s   t |   S r#   )hashlibmd5encode	hexdigest)r   r   r   r   rj     s   rj   c                 C   s   t |  t| drt| tjrt| } t| j} t	| S t| tjr.t| } | j
dddS t| trDd| vr;tdtj	| d ddS t| d	rXt }|| }t	| S td
)z5Return a JSON string representation of the input datar   ru      )rv   Zdouble_precisionr:   rw   T)	sort_keysr;   zBto_json only works with data expressed as a DataFrame or as a dict)r<   r=   r>   r?   r@   r   r   r   rQ   dumpsrr   rA   ry   r   rB   rz   NotImplementedError)r!   rD   rE   r   r   r   ri     s(   





ri   c                 C   s   t |  t| drtdt| tjrt| } | jddS t| tr6d| vr*t	dtj
| d jddS t| dr_t }dd	l}dd	lm} || }| }||| |   S td
)z4return a CSV string representation of the input datar   zLto_csv does not work with data that contains the __geo_interface__ attributeF)indexr:   z-values expected in data dict, but not presentr;   r   NzAto_csv only works with data expressed as a DataFrame or as a dict)r<   r=   r   r>   r?   r@   r   rt   rA   ry   	from_dictr   pyarrowZpyarrow.csvrU   rB   ZBufferOutputStreamZ	write_csvgetvalueZ
to_pybytesdecode)r!   rD   paZpa_csvrE   Z
csv_bufferr   r   r   rs   #  s.   



rs   c                 G   s"   t jdtdd tj| g|R  S )zi
    Pipe a value through a sequence of functions

    Deprecated: use toolz.curried.pipe() instead.
    zdalt.pipe() is deprecated, and will be removed in a future release. Use toolz.curried.pipe() instead.r   
stacklevel)warningswarnr   r	   pipe)r!   funcsr   r   r   r   B  s   r   c                  O   s    t jdtdd tj| i |S )zRCurry a callable function

    Deprecated: use toolz.curried.curry() instead.
    zfalt.curry() is deprecated, and will be removed in a future release. Use toolz.curried.curry() instead.r   r   )r   r   r   r	   curry)argsr%   r   r   r   r   Q  s   r   )r4   )NN)r]   rQ   r^   r_   )r]   rU   r^   r_   )?rQ   rm   rL   r   r   typingr   r   r   r   r   r   r   Zpandasr?   Ztoolzr	   r
   Z
_importersr   corer   r   r   r   deprecationr   Zplugin_registryr   r   r   r   Zpyarrow.libr   r   rA   r@   r'   r   rZ   r(   Z_ToValuesReturnTyper    r)   	Exceptionr2   r   rK   rF   floatrI   rP   rT   rW   r\   rr   rt   r{   r<   rj   ri   rs   r   r   r   r   r   <module>   s    $2'