L iUdZddlmZddlZddlZddlZddlZddlZddlm Z m Z m Z m Z ddl mZmZmZmZddlmZmZmZddlmZddlmZmZmZmZmZmZmZm Z m!Z!m"Z"dd l#m$Z$m%Z%m&Z&m'Z'dd l(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1erddl2Z3ddl4Z5dd l6m7Z7m8Z8m9Z9dd l:m;Z;dd l<d?Z[deAd@<dAZ\deAdB<dCZ]deAdD<dEZ^deAdF<edGdHIZ_e"GdJdKeZ`GdLdMee_ZaGdNdOeZbGdPdQeZcee_eae_zebzeczZddReAdS<e dTdUdVdWdXdYdZeed[e`ebece)dfZedReAd\<Gd]d^eZfdd_Zgdd`ZhddaZiddbZjddcZkdddZlddeZmddfZnddgZoddhZpddiZqddjZrddkZsddlZtddmZuddnZvddoZwddpZxddqZyddrZzddsZ{ d ddtZ|dduZ}ddvZ~ddwZeBdxf ddyZddzZdd{Zdd|Zdd}ZeBf dd~ZddZ d ddZddZ d ddZddZddZddZ ddZy)z8A bunch of useful utilities for dealing with dataframes.) annotationsN)ChainMapUserDictUserListdeque) ItemsViewIterableMappingSequence)EnumEnumMetaauto)MappingProxyType) TYPE_CHECKINGAnyFinalProtocol TypeAlias TypeGuardTypeVarUnioncastruntime_checkable)configerrorslogger string_util) CustomDicthas_callable_attris_custom_dictis_dataclass_instance is_list_like is_namedtupleis_pydantic_modelis_typeis_version_less_than) DataFrameIndexSeries) _iLocIndexer)Stylerr_LOGGERi'z ^pandas.*$_PANDAS_DATA_OBJECT_TYPE_REz.dask.dataframe.dask_expr._collection.DataFrame_DASK_DATAFRAMEz+dask.dataframe.dask_expr._collection.Series _DASK_SERIESz*dask.dataframe.dask_expr._collection.Index _DASK_INDEXzdask.dataframe.core.DataFrame_DASK_DATAFRAME_LEGACYzdask.dataframe.core.Series_DASK_SERIES_LEGACYzdask.dataframe.core.Index_DASK_INDEX_LEGACYz_duckdb.DuckDBPyRelation_DUCKDB_RELATIONzduckdb.duckdb.DuckDBPyRelation_DUCKDB_RELATION_LEGACYz modin.pandas.dataframe.DataFrame_MODIN_DF_TYPE_STRzmodin.pandas.series.Series_MODIN_SERIES_TYPE_STRzpandas.io.formats.style.Styler_PANDAS_STYLER_TYPE_STRz polars.dataframe.frame.DataFrame_POLARS_DATAFRAMEz polars.lazyframe.frame.LazyFrame_POLARS_LAZYFRAMEzpolars.series.series.Series_POLARS_SERIESzpyspark.sql.dataframe.DataFrame_PYSPARK_DF_TYPE_STRz'pyspark.sql.connect.dataframe.DataFrame_PYSPARK_CONNECT_DF_TYPE_STRzray.data.dataset.Dataset _RAY_DATASETz$ray.data.dataset.MaterializedDataset_RAY_MATERIALIZED_DATASETz3snowflake.snowpark.modin.pandas.dataframe.DataFrame_SNOWPANDAS_DF_TYPE_STRz6snowflake.snowpark.modin.plugin.extensions.index.Index_SNOWPANDAS_INDEX_TYPE_STRz-snowflake.snowpark.modin.pandas.series.Series_SNOWPANDAS_SERIES_TYPE_STRzsnowflake.snowpark.row.Row_SNOWPARK_DF_ROW_TYPE_STRz&snowflake.snowpark.dataframe.DataFrame_SNOWPARK_DF_TYPE_STRzsnowflake.snowpark.table.Table_SNOWPARK_TABLE_TYPE_STRzxarray.core.dataset.Dataset_XARRAY_DATASET_TYPE_STRzxarray.core.dataarray.DataArray_XARRAY_DATA_ARRAY_TYPE_STRV_coT) covariantc8eZdZdZe ddZdddZd dZy) DBAPICursora`Protocol for DBAPI 2.0 Cursor objects (PEP 249). This is a simplified version of the DBAPI Cursor protocol that only contains the methods that are relevant or used for our DB API Integration. Specification: https://peps.python.org/pep-0249/ Inspired by: https://github.com/python/typeshed/blob/main/stdlib/_typeshed/dbapi.pyi cyNselfs ^/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/streamlit/dataframe_util.py descriptionzDBAPICursor.descriptionvs  cyrMrN)rPsizes rQ fetchmanyzDBAPICursor.fetchmanyrScyrMrNrOs rQfetchallzDBAPICursor.fetchallrWrSN)returnzdSequence[tuple[str, Any | None, int | None, int | None, int | None, int | None, bool | None]] | None).)rUintrZSequence[Sequence[Any]])rZr\)__name__ __module__ __qualname____doc__propertyrRrVrYrNrSrQrKrKjs.    L6rSrKc"eZdZdZeddZy)DataFrameGenericAliasatTechnically not a GenericAlias, but serves the same purpose in OptionSequence below, in that it is a type which admits DataFrame, but is generic. This allows OptionSequence to be a fully generic type, significantly increasing its usefulness. We can't use types.GenericAlias, as it is only available from python>=3.9, and isn't easily back-ported. cyrMrNrOs rQiloczDataFrameGenericAlias.ilocs$'rSN)rZr*)r]r^r_r`rarerNrSrQrcrcs''rSrcceZdZdZddZy)PandasCompatiblezFProtocol for Pandas compatible objects that have a `to_pandas` method.cyrMrNrOs rQ to_pandaszPandasCompatible.to_pandasrWrSN)rZzDataFrame | Series)r]r^r_r`rirNrSrQrgrgsP2rSrgceZdZdZddZy)DataframeInterchangeCompatiblezProtocol for objects support the dataframe-interchange protocol. https://data-apis.org/dataframe-protocol/latest/index.html cyrMrN)rP allow_copys rQ __dataframe__z,DataframeInterchangeCompatible.__dataframe__rWrSN)rmboolrZr)r]r^r_r`rnrNrSrQrkrks  :rSrkrOptionSequencer'r)r+r(pa.Tablezpa.Arrayznp.ndarray[Any, np.dtype[Any]]zMapping[Any, Any]DataceZdZdZeZeZeZeZeZ eZ eZ eZ eZ eZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZ eZ!eZ"eZ#eZ$eZ%y) DataFormatz7DataFormat is used to determine the format of the data.N)&r]r^r_r`rUNKNOWNEMPTYCOLUMN_INDEX_MAPPINGCOLUMN_SERIES_MAPPINGCOLUMN_VALUE_MAPPING DASK_OBJECT DBAPI_CURSORDUCKDB_RELATIONKEY_VALUE_DICTLIST_OF_RECORDS LIST_OF_ROWSLIST_OF_VALUES MODIN_OBJECT NUMPY_LIST NUMPY_MATRIX PANDAS_ARRAYPANDAS_DATAFRAME PANDAS_INDEX PANDAS_SERIES PANDAS_STYLERPOLARS_DATAFRAMEPOLARS_LAZYFRAME POLARS_SERIES PYARROW_ARRAY PYARROW_TABLEPYSPARK_OBJECT RAY_DATASET SET_OF_VALUESSNOWPANDAS_OBJECTSNOWPARK_OBJECTTUPLE_OF_VALUESXARRAY_DATASETXARRAY_DATA_ARRAYrNrSrQrtrtsAfG FE6 F6&K6LfOVNfO6LVN6LJ6L6Lv6LFMFMvvFMFMFMVN&KFMfOfOVNrSrtc6ddl}t|j|S)aReturn True if the current Pyarrow version is less than the input version. Parameters ---------- v : str Version string, e.g. "0.25.0" Returns ------- bool Raises ------ InvalidVersion If the version strings are not valid. rN)pyarrowr& __version__)vpas rQis_pyarrow_version_less_thanrs&  22rSc6ddl}t|j|S)aReturn True if the current Pandas version is less than the input version. Parameters ---------- v : str Version string, e.g. "0.25.0" Returns ------- bool Raises ------ InvalidVersion If the version strings are not valid. rN)pandasr&r)rpds rQis_pandas_version_less_thanrs$  22rSc|/t|ttttt t tfryt|tjtjtjtjtjtjtj tj"tj$tj&tj(tj*tj,tj.tj0tj2tj4tj6tj8tj:tj<tj>hvS)zTrue if the object is a dataframe-like object. This does not include basic collection types like list, dict, tuple, etc. F) isinstancetuplesetstrbytesr[floatrodetermine_data_formatrtrxrzr{rrrrrrrrrrrrrrrrrrrobjs rQis_dataframe_likers {juc3sE4&PQ  %((##    ####      !!$$""!!$$-* rSct|xs}t|xspt|xsct|xsVt |xsIt |xs<t |xs/t|xs"t|xstj|S)aTrue if the object is one of the supported unevaluated data objects. Currently supported objects are: - Snowpark DataFrame / Table - PySpark DataFrame - Modin DataFrame / Series - Snowpandas DataFrame / Series / Index - Dask DataFrame / Series / Index - Ray Dataset - Polars LazyFrame - Generator functions - DB API 2.0 Cursor (PEP 249) - DuckDB Relation (Relational API) Unevaluated means that the data is not yet in the local memory. Unevaluated data objects are treated differently from other data objects by only requesting a subset of the data instead of loading all data into th memory ) is_snowpark_data_objectis_pyspark_data_objectis_snowpandas_data_objectis_modin_data_objectis_ray_datasetis_polars_lazyframeis_dask_objectis_duckdb_relationis_dbapi_cursorinspectisgeneratorfunctionrs rQis_unevaluated_data_objectrAs( $ , !# & , $S ) ,  $ , #  , s # , #  , c " , 3  ,  & &s + rSc"t|tS)zLTrue if obj is a Pandas object (e.g. DataFrame, Series, Index, Styler, ...).)r%r-rs rQis_pandas_data_objectrb 33 44rScFt|txst|tS)z-True if obj is a Snowpark DataFrame or Table.)r%rErDrs rQrrgs 30 1 XWSBW5XXrSct|txr4t|dkDxr$t|dtxrt |ddS)z4True if obj is a list of snowflake.snowpark.row.Row.ras_dict)rlistlenr%rCrrs rQis_snowpark_row_listrlsL 3 1 HqL 1 CF5 6 1 c!fi 0 rScbt|txst|txr t|dS)z6True if obj is a PySpark or PySpark Connect dataframe.toPandas)r%r<r=rrs rQrrvs0 )*Xgc;W.X - C ,-rSct|txsXt|txsFt|txs4t|txs"t|t xst|t S)z2True if obj is a Dask DataFrame, Series, or Index.)r%r.r1r/r2r0r3rs rQrr}sg _% , 3. / , 3 % , 3+ , , 3 $  , 3* + rScFt|txst|tS)z,True if obj is of Modin Dataframe or Series.)r%r6r7rs rQrrs 3* + Swsr?rs rQrrs 3 % P6O)PPrSc"t|tS)zTrue if obj is a pandas Styler.)r%r8rs rQis_pandas_stylerrs 3/ 00rSc"t|tS)zWTrue if obj looks like a DB API 2.0 Cursor. https://peps.python.org/pep-0249/ )rrKrs rQrrs c; ''rScFt|txst|tS)z]True if obj is a DuckDB relation. https://duckdb.org/docs/api/python/relational_api )r%r4r5rs rQrrs 3( ) RWS:Q-RRrSc&ddlm}||ddvS)z.Check if the list only contains scalar values.r) infer_dtypeTskipna)mixedz unknown-array)pandas.api.typesr)datars rQ_is_list_of_scalarsrs, tD )1K KKrSc|| t|Sg}t|D]\}}||k\r|S|j| |S)aAConvert an iterable to a list. Parameters ---------- iterable : Iterable The iterable to convert to a list. max_iterations : int or None The maximum number of iterations to perform. If None, all iterations are performed. Returns ------- list The converted list. )r enumerateappend)iterablemax_iterationsresultiitems rQ_iterable_to_listrsV$H~ FX&4    M  d MrSct|jdk(r&|jddk(r|jddi}|S)zRename the first column to "value" if it is not named and if there is only one column in the dataframe. The default name of the first column is 0 if it is not named which is not very descriptive. rvaluecolumns)rrrename)data_dfs rQ_fix_column_namingrs@ 7??q W__Q%71%<..!W.6 NrScVddl}t|jj|dS)zConvert a key-value dict to a Pandas DataFrame. Parameters ---------- data : dict The dict to convert to a Pandas DataFrame. Returns ------- pandas.DataFrame The converted Pandas DataFrame. rNindexorient)rrr' from_dict)rrs rQ_dict_to_pandas_dfrs& bll44T'4J KKrSc:ddlm}t|j|S)z(True if the dataframe has a range index.r) RangeIndex)rrrr)dfrs rQhas_range_indexrs! bhh ++rSFcddl}ddl}ddl}t||jr|r|j St d|St||j|j|jjjfr|j |St|r6t d|r|jj S|jSt||jrCt|j dk(r|j gSt#|j |St%|r$|r|j'n|}|j)St+|r2|r|j'n|}|j)j-St/|rm|j1|j3j)}|j d|k(r"t5dt7j8|dt d|St;|r$|r|j d}|j=St?|r2|r|j d}|jAj-StC|r|jE|d}t||j|jfr|j-}|j d|k(r"t5dt7j8|d t d|StG|r_|j1|j)}|j d|k(r"t5dt7j8|d t d|StI|r|jE|jK}t||j|jfr|j-}|j d|k(r"t5dt7j8|d t d|StM|r_|j1|jO}|j d|k(r"t5dt7j8|d t d|StQ|r|d|j)}t||j|jfr|j-}|j d|k(r"t5dt7j8|d t d|StS|r_|j1|j)}|j d|k(r"t5dt7j8|d t d|StU|rU|j1|jW}|j d|k(r"t5dt7j8|d|StY|r|jZr!|jZDcgc] }|r|dnd c}nd}|j |j]||}|j d|k(r"t5dt7j8|d|St_|r-|j |Dcgc]}|jac}Stc|dr|j |j)Stc|drFteddur9|jjfji|} |r| j S| Stkjl|r`t#|j to||}|j d|k(r"t5dt7j8|d|St|tpr2t#|j |D cgc]} | jrc} St|tttv|jxtzfr#t#|j t}|St|rt|jSt|rt|jSt|rttj|St|tttfs t|rtt|S t#|j |Scc}wcc}wcc} w#t$rz} t|tr?tjt5t|cdddcYd} ~ S#1swYnxYwtjdt|d|d| d} ~ wwxYw)aUTry to convert different formats to a Pandas Dataframe. Parameters ---------- data : dataframe-, array-, or collections-like object The data to convert to a Pandas DataFrame. max_unevaluated_rows: int If unevaluated data is detected this func will evaluate it, taking max_unevaluated_rows, defaults to 10k. ensure_copy: bool If True, make sure to always return a copy of the data. If False, it depends on the type of the data. For example, a Pandas DataFrame will be returned as-is. Returns ------- pandas.DataFrame rNz pd.DataFrameu⚠️ Showing only z6 rows. Call `collect()` on the dataframe to show more.T)deep)computez8 rows. Call `compute()` on the data object to show more.z6 rows. Call `to_pandas()` on the dataset to show more.z; rows. Call `_to_pandas()` on the data object to show more.z9 rows. Call `toPandas()` on the data object to show more.z: rows. Call `to_pandas()` on the data object to show more.z0 rows. Call `df()` on the relation to show more.rz4 rows. Call `fetchall()` on the Cursor to show more.rirnz1.5.0F)rz/ rows. Convert the data to a list to show more.z# Unable to convert object of type `z1` to `pandas.DataFrame`. Offending object: ```py z ```)Rarraynumpyrrr'copyrr)r(api extensionsExtensionArrayrrndarrayrshaperrclonerirto_framerlimitcollect_show_data_informationrsimplify_numberr to_dataframer to_seriesrheadrr _to_pandasrrrrrrrrRrVrrrr interchangefrom_dataframerrrr rrmap ArrayTyperrr rto_dictr#_asdictr! dataclassesasdictrrrr$dict ValueError contextlibsuppressrStreamlitAPIExceptiontype) rmax_unevaluated_rows ensure_copyrnprdrrowrcexs rQconvert_anything_to_pandas_dfr#sn2$ %)tyy{ItND/II$BHHbff.?.?.N.NOP||D!!N DIINN$4SSSS$ #4::!# LL  $BLL$67 4 *tzz|~~*tzz|~~((**4 zz./779CCE ::a=0 0 "&{'B'BCW'X&YZHH ND)) 99$9'D  ""D! 99$9'D~~((**dyy-ty< dRYY1 2==?D ::a=0 0 "&{'B'BCW'X&YZJJ ND))dzz./99; ::a=0 0 "&{'B'BCW'X&YZHH ND))D!yy-.99; dRYY1 2==?D ::a=0 0 "&{'B'BCW'X&YZMM ND))d#zz./88: ::a=0 0 "&{'B'BCW'X&YZKK ND)) &))*446 dRYY1 2==?D ::a=0 0 "&{'B'BCW'X&YZLL ND))t$zz./99; ::a=0 0 "&{'B'BCW'X&YZLL ND))$zz./224 ::a=0 0 "&{'B'BCW'X&YZBB  t>B=M=M(8(8 91QQqTB  9SW ||DNN+?@'|R ::a=0 0 "&{'B'BCW'X&YZFF  D!||d;sS[[];<<{+||DNN,-- $0 ' 0E 9&&$$33D9!,w||~9'9""4(! LL*46BVW X  ::a=0 0 "&{'B'BCW'X&YZAA  $!!",,/FA/F"GHH$U__h?@!",,tDz":;;d!$,,.11T!$,,.11T"!+"4"4T":;;$#3X>?CT D"$t*--!",,t"455I :<<0G8   dD !$$Z0 0)$/ 0 0 0**##':,/     sH<c$c)7c. c33 e6<)e1% d?0 e19e6?e -e11e6cj t|}ddl}|j }|j ||j}|j||jtd|jjS#t$r!}tjd|Yd}~d}~wwxYw)zSerialize pyarrow.Table to Arrow IPC bytes. Parameters ---------- table : pyarrow.Table A table to convert. Returns ------- bytes The serialized Arrow IPC bytes. zMRecursion error while truncating Arrow table. This is not supposed to happen.exc_infoNrr) _maybe_truncate_tableRecursionErrorr,warningrBufferOutputStreamRecordBatchStreamWriterschema write_tableclosergetvalue to_pybytes)tableerrrsinkwriters rQ"convert_arrow_table_to_arrow_bytesr5 s  %e, !2 "D 'R ' 'ell ;F u LLN 335 66%    "    s B B2B--B2cLddl} |jj|}t|S#|j|j|j f$rQ}t jd|t|}|jj|}Yd}~t|Sd}~wwxYw)zSerialize pandas.DataFrame to Arrow IPC bytes. Parameters ---------- df : pandas.DataFrame A dataframe to convert. Returns ------- bytes The serialized Arrow IPC bytes. rNzSerialization of dataframe to Arrow table was unsuccessful. Applying automatic fixes for column types to make the dataframe Arrow-compatible.r%) rTable from_pandasArrowTypeError ArrowInvalidArrowNotImplementedErrorr,info#fix_arrow_incompatible_column_typesr5)rrr1r"s rQ convert_pandas_df_to_arrow_bytesr>-s )$$R( .e 44   r0K0K L)    1 4$$R( -e 44)s,&B#=BB#cNddl}|j|}|jS)aConvert Arrow bytes (IPC format) to pandas.DataFrame. Using this function in production needs to make sure that the pyarrow version >= 14.0.1, because of a critical security vulnerability in pyarrow < 14.0.1. Parameters ---------- source : bytes A bytes object to convert. Returns ------- pandas.DataFrame The converted dataframe. rN)rRecordBatchStreamReader read_pandas)sourcerreaders rQ convert_arrow_bytes_to_pandas_dfrDJs(" 'R ' ' /F    rScPddlm}|jj|y)z[Show a message to the user with important information about the processed dataset. r)get_dg_singleton_instanceN)$streamlit.delta_generator_singletonsrFmain_dgcaption)msgrFs rQrrasO''//4rSczddl}t||jr t|St ||}t |S)adTry to convert different formats to Arrow IPC format (bytes). This method tries to directly convert the input data to Arrow bytes for some supported formats, but falls back to conversion to a Pandas DataFrame and then to Arrow bytes. Parameters ---------- data : dataframe-, array-, or collections-like object The data to convert to Arrow bytes. max_unevaluated_rows: int If unevaluated data is detected this func will evaluate it, taking max_unevaluated_rows, defaults to 10k. Returns ------- bytes The serialized Arrow IPC bytes. rN)rrr7r5r#r>)rrrrs rQconvert_anything_to_arrow_bytesrLjs:2$!1$77 't-A BB +B //rSc>|gSt|ttttfr|gSt|t r,|Dcgc] }t|tr |j n|"c}St|trt|jSt|rt|s t|S t|d}|jrgStdt|jdddfj!Scc}w#t"j$$r|gcYSwxYw)aTry to convert different formats to a list. If the input is a dataframe-like object, we just select the first column to iterate over. Non sequence-like objects and scalar types, will just be wrapped into a list. Parameters ---------- obj : dataframe-, array-, or collections-like object The object to convert to a list. Returns ------- list The converted list. NT)r list[V_co]r)rrr[rror rr rkeysr"rr#emptyrreto_listrr)rmemberrs rQconvert_anything_to_listrSs" { #S%./u #x SVV 63 7 VCVV#wCHHJC!5c!:Cy 0F}}  lDad);)C)C)E$FG 'W0  ' 'u s%C>/D 3DDDc tjdrhttjddz}t|jdz}|j}|dkDr||kDrt j |||z z}t jtt|t j||z dzz ||dzz |dz d}|jd|}t||xsd||z zS|rtj|j}tj|j|z}||k(r-t|j}t|j|z}td |d |d |S) aExperimental feature to automatically truncate tables that are larger than the maximum allowed message size. It needs to be enabled via the server.enableArrowTruncation config option. Parameters ---------- table : pyarrow.Table A table to truncate. truncated_rows : int or None The number of rows that have been truncated so far. This is used by the recursion logic to keep track of the total number of truncated rows. zserver.enableArrowTruncationzserver.maxMessageSizeg.Arg?g{Gz?ru⚠️ Showing z out of z# rows due to data size limitations.)r get_optionr[nbytesnum_rowsmathceilfloormaxminslicer'rr rr) r1truncated_rowsmax_message_size table_size table_rows targeted_rows sliced_tabledisplayed_rows total_rowss rQr'r's&78v001HICOP/0 ^^ >j+;;!IIj4Dz4Q&RSM!JJ& J4NRV3V(WW"j4&78"Q  M!;;q-8L(~2zM7QR  (88HN$44U^^n5TUJ+"%U^^!4 .!@A "!.!1*F55  LrSclddlm}m}m}|jj dvryt |jdvry|jdk(rj||d}|dvry|d k(rVt|dk(s t|d sytd |jd}||r||st|tryy y ) zYReturn True if the column type is known to cause issues during Arrow conversion. r)r is_dict_liker")r!T> period[B] period[N] period[U] period[ns] period[us]geometryobjectr)z mixed-integercomplexrrezDataFrameGenericAlias[Any]F) rrrhr"dtypekindrrhasattrrrer frozenset)columnrrhr" inferred_type first_values rQ is_colum_type_arrow_incompatiblerxsIH || 6<<   ||x$F48    G #6{awvv'>;VDII!LK!- ,k95 rScddl}d}|xs |jD]:}t||s||j}||j d||<<|sgt |j |jsGt|j r2||j}|j j d|_||S|S)aFix column types that are not supported by Arrow table. This includes mixed types (e.g. mix of integers and strings) as well as complex numbers (complex128 type). These types will cause errors during conversion of the dataframe to an Arrow table. It is fixed by converting all values of the column to strings This is sufficient for displaying the data on the frontend. Parameters ---------- df : pandas.DataFrame A dataframe to fix. selected_columns: List[str] or None A list of columns to fix. If None, all columns are evaluated. Returns ------- The fixed dataframe. rNstring)rrrxrastyperr MultiIndex)rselected_columnsrdf_copycols rQr=r=Ps.!%G-2::4 +BsG 4'')c7>>(3GCL 4   HH MM  -RXX 6 ?ggiG1 )71r1rSc ddl}ddl}ddl}|tjSt ||j rtjSt ||jr8t|jdk(rtjStjSt ||jrtjSt ||jrtj St ||j"rtj$St ||j&rtj(St+|rtj,St ||j.j0j2rtj4St7|rtj8St;|rtj<St?|rtj@StC|rtjDStG|rtjHStK|rtjLStO|rtjPStS|rtjTStW|rtjXSt[|rtj\St_|s ta|rtjbSte|rtjfSti|rtjjSt |tltntpfs,ts|s!tu|stw|s ty|rtjzSt |t|t~frtjSt |ttttfrt|rVt |trtjSt |ttfrtjStjStt|}t |trtjSt |ttttfrtjStjSt |ttfr|stjzSt|dkDrtt|j}t |trtjSt |ttfrtjSt ||j"rtjStjzStjSt|rtjStjS)zDetermine the data format of the input data. Parameters ---------- input_data : Any The input data to determine the data format of. Returns ------- DataFormat The data format of the input data. rNr)Trrrrtrvrr'rrrrrrr7rArrayrr)rr(rrrrrrrrrrrrrrrrrrrrrrrrrrrzrrrrr|rr{rrrr!r#r r$r}rrrrrrrtrrrrnextiterrr~r valuesrwryrxr"ru) input_datarrr first_elementrws rQrrs*bll+****bjj) z A %(( (&&&*bhh''''*bhh''''*bii('''*bhh'&&& #'''*bff//>>?&&& #''':&***:&***J'&&& ,+++j)((($(((J'+++j!%%%j!%%%z*.B:.N)))*%)))z"&&&  x!1 2  ! ,  $ * % Z ((((*y)45&&&*tUC;< z **e,!111*sI&67!///,, ,T*-. mT *-- - mdE3 %B C** *&   % Jw 0,, , z?Q tJ$5$5$789K+t,!666+e}5!666+ryy1!777,, ,    j !(((   rScddl}ddl}|j|j|j|j gdj S)a Unify all missing values in a DataFrame to None. Pandas uses a variety of values to represent missing values, including np.nan, NaT, None, and pd.NA. This function replaces all of these values with None, which is the only missing value type that is supported by all data rN)rrreplaceNANaTnan infer_objects)rrrs rQ_unify_missing_valuesrs9 ::ruubffbff-t 4 B B DDrSct|jdk7r"tdt|jd||jdS)zConvert a Pandas DataFrame to a Pandas Series by selecting the first column. Raises ------ ValueError If the DataFrame has more than one column. r6DataFrame is expected to have a single column but has .r)rrr)rs rQ_pandas_df_to_seriesrsL 2::!DS_DUUV W   bjjm rSc |tjtjtjtjtj tj tjtjtjtjtjtjtjh vr|S|tjk(rCddl}|j r|j"dS|j$dddfj'S|tj(k(r2ddl}|j r|j"dS|j'S|tj*k(rddl}|j.j1|S|tj2k(r(ddl}|j4j1t7|S|tj8k(r t7|S|tj:tj<hvrddl}|j1|S|tj@k(rddl}|j1t7|S|tjBk(rddl"}|jFjI|S|tjJk(r(ddl"}|jLjOt7|S|tjPk(rtS|jUdS|tjVk(r'tS|j'jYS|tjZk(rtS|jUdS|tj\k(rtS|jUdS|tj^k(r|jUdS|tj`tjbtjdfvrtS|}g}tg|jhdk(r!||jhdjY}n:tg|jhdk\r"tkd tg|jhd |tjbk(r tm|S|tjdk(r to|S|S|tjpk(r:tS|}|j riS|j$dddfjUStkd |) aConvert a Pandas DataFrame to the specified data format. Parameters ---------- df : pd.DataFrame The dataframe to convert. data_format : DataFormat The data format to convert to. Returns ------- pd.DataFrame, pd.Series, pyarrow.Table, np.ndarray, xarray.Dataset, xarray.DataArray, polars.Dataframe, polars.Series, list, set, tuple, or dict. The converted dataframe. rNrecordsrrrseriesrrrzUnsupported input data format: )9rtrvrzr{r|rrrrrrrrrrrrPrreto_numpyrrrr7r8rrrrrrpolarsrrxarrayDatasetrr DataArray from_seriesr~rrrtolistrwryrxrrrrrrrrr})r data_formatrrplxr return_lists rQ convert_pandas_df_to_data_formatrs<""##  !!$$"" j+++ !#zrzz!}Fbggadm.D.D.FFj--- "zrzz!};bkkm;j...xx##B''j...xx##$8$<==j...#B''z22J4O4OPP~~b!!j...~~22677j///zz((,,j222||''(r?r@rArBrCrDrErFrGrHrKrcrgrkrprrrtrrrrrrrrrrrrrrrrrrrrrrrrrr#r5r>rDrrLrSr'rxr=rrrrrNrSrQrsC?" ;;BB%%"   :9   //1."""8,,!%/RZZ %>U>IIC eCA UA!@?9U97E74%4!AA>E> <