o
    h                     @  s   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rPd dl
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 G dd dejZdddZG dd dZG dd dZdS )    )annotationsN)TYPE_CHECKING)Any)NoReturn)import_dtypes_module)parse_version)SelfInterchangeSeries)DType)DataFrameLike)Versionc                   @  s(   e Zd ZdZdZdZdZdZdZdZ	dS )		DtypeKindr                     N)
__name__
__module____qualname__INTUINTFLOATBOOLSTRINGDATETIMECATEGORICAL r   r   S/var/www/vscode/kcb/lib/python3.10/site-packages/narwhals/_interchange/dataframe.pyr      s    r   interchange_dtypetuple[DtypeKind, int, Any, Any]versionr   returnr   c                 C  s  t |}| d tjkr9| d dkr| S | d dkr| S | d dkr)| S | d dkr3| S d}t|| d tjkrn| d dkrJ|	 S | d dkrT|
 S | d dkr^| S | d dkrh| S d}t|| d tjkr| d dkr| S | d dkr| S d	}t|| d tjkr| S | d tjkr| S | d tjkr| S | d tjkr| S d
|  }t|)Nr   r   @             zInvalid bit width for INTzInvalid bit width for UINTzInvalid bit width for FLOATzInvalid dtype, got: )r   r   r   Int64Int32Int16Int8AssertionErrorr   UInt64UInt32UInt16UInt8r   Float64Float32r   Booleanr   Stringr   Datetimer   Categorical)r!   r#   dtypesmsgr   r   r    'map_interchange_dtype_to_narwhals_dtype!   sP   
r:   c                   @  s    e Zd Zd
ddZdddZd	S )WrapInterchangeFrameinterchange_frameInterchangeFramer$   Nonec                 C  s
   || _ d S N_interchange_frame)selfr<   r   r   r    __init__P   s   
zWrapInterchangeFrame.__init__c                 C  s   | j S r?   r@   rB   r   r   r    __dataframe__S   s   z"WrapInterchangeFrame.__dataframe__N)r<   r=   r$   r>   )r$   r=   )r   r   r   rC   rE   r   r   r   r    r;   O   s    
r;   c                   @  s   e Zd Zd,ddZd-d
dZd.ddZd/ddZd0ddZd1ddZd2ddZ	e
d3ddZe
d4d d!Zd5d#d$Zd6d&d'Zd7d)d*Zd+S )8r=   dfr   r#   r   r$   r>   c                 C  s   |  | _|| _d S r?   )rE   rA   _version)rB   rF   r#   r   r   r    rC   X   s   

zInterchangeFrame.__init__r   c                 C  s   | j t| j|dS )Nr#   )	__class__r;   rA   )rB   r#   r   r   r    _with_version\   s   
zInterchangeFrame._with_versionc                 C  s   | S r?   r   rD   r   r   r    __narwhals_dataframe__a   s   z'InterchangeFrame.__narwhals_dataframe__r   c                 C  s   d}t |)NzCannot access native namespace for metadata-only dataframes with unknown backend.If you would like to see this kind of object supported in Narwhals, please open a feature request at https://github.com/narwhals-dev/narwhals/issues.NotImplementedError)rB   r9   r   r   r    __native_namespace__d   s   z%InterchangeFrame.__native_namespace__namestrr
   c                 C  s"   ddl m} || j|| jdS )Nr   r	   rH   )narwhals._interchange.seriesr
   rA   get_column_by_namerG   )rB   rO   r
   r   r   r    
get_columnl   s   zInterchangeFrame.get_columnpd.DataFramec                 C  s8   dd l }t|dkr|jj| jS d|j }t|)Nr   )r      r   znConversion to pandas is achieved via interchange protocol which requires pandas>=1.5.0 to be installed, found )pandasr   apiinterchangefrom_dataframerA   __version__rM   )rB   pdr9   r   r   r    	to_pandass   s   zInterchangeFrame.to_pandaspa.Tablec                 C  s   ddl m} || jS )Nr   )rY   )"pyarrow.interchange.from_dataframerY   rA   )rB   rY   r   r   r    to_arrow   s   
zInterchangeFrame.to_arrowdict[str, DType]c                   s    fdd j  D S )Nc                   s$   i | ]}|t  j|j jqS r   )r:   rA   rR   dtyperG   ).0column_namerD   r   r    
<dictcomp>   s    z+InterchangeFrame.schema.<locals>.<dictcomp>)rA   column_namesrD   r   rD   r    schema   s   
zInterchangeFrame.schema	list[str]c                 C  s   t | j S r?   )listrA   re   rD   r   r   r    columns   s   zInterchangeFrame.columnsattrc                 C  s   d| d}t |)Nz
Attribute aG   is not supported for metadata-only dataframes.

Hint: you probably called `nw.from_native` on an object which isn't fully supported by Narwhals, yet implements `__dataframe__`. If you would like to see this kind of object supported in Narwhals, please open a feature request at https://github.com/narwhals-dev/narwhals/issues.rL   )rB   rj   r9   r   r   r    __getattr__   s   
zInterchangeFrame.__getattr__re   c                 G  s8   | j t|}t|dsd}t|| j|j| jdS )N_dfzExpected interchange object to implement `_df` property to allow for recovering original object.
See https://github.com/data-apis/dataframe-api/issues/360.rH   )rA   select_columns_by_namerh   hasattrrM   rI   rl   rG   )rB   re   framer9   r   r   r    simple_select   s   
zInterchangeFrame.simple_selectexprsc                 G  s   d}t |)Nz`select`-ing not by name is not supported for interchange-only level.

If you would like to see this kind of object better supported in Narwhals, please open a feature request at https://github.com/narwhals-dev/narwhals/issues.rL   )rB   rq   r9   r   r   r    select   s   zInterchangeFrame.selectN)rF   r   r#   r   r$   r>   )r#   r   r$   r   )r$   r   )r$   r   )rO   rP   r$   r
   )r$   rT   )r$   r]   )r$   r`   )r$   rg   )rj   rP   r$   r   )re   rP   r$   r   )rq   rP   r$   r   )r   r   r   rC   rJ   rK   rN   rS   r\   r_   propertyrf   ri   rk   rp   rr   r   r   r   r    r=   W   s    






	



r=   )r!   r"   r#   r   r$   r   )
__future__r   enumtypingr   r   r   narwhals.utilsr   r   rV   r[   pyarrowpatyping_extensionsr   rQ   r
   narwhals.dtypesr   narwhals.typingr   r   IntEnumr   r:   r;   r=   r   r   r   r    <module>   s&    
.