a
    Ofp                     @  s  d dl mZ d dlmZmZ d dlmZmZmZm	Z	 d dl
Z
d dlZd dlmZ d dl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 d dlm   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/m0Z0 er4d dl1m2Z2m3Z3m4Z4m5Z5 d dl6m7Z7 edee$d ddddddddddej8df
dddddd ddd!d"dZ9dd#dddd ddd!d$d%Z:dKd&dddd'd(d)Z;dLddd*d+d,Z<dMdddd-d.d/Z=dNddddd'd0d1Z>d2d3 Z?edee$d4 ddej8ej8d5dd6d7d7dd8d9d4Z@dOdddd:dd;d<d=ZAdPddddd>d?d@ZBdQdBdCdDdEZCdFdFdGdHdIdJZDdS )R    )annotations)HashableSequence)TYPE_CHECKINGCallableLiteralcastN)lib)AppenderSubstitution)find_stack_level)maybe_downcast_to_dtype)is_list_likeis_nested_list_like	is_scalar)ExtensionDtype)ABCDataFrame	ABCSeries)_shared_docs)Grouper)Index
MultiIndexget_objs_combined_axis)concat)cartesian_product)Series)AggFuncTypeAggFuncTypeBaseAggFuncTypeDict
IndexLabel	DataFramez
data : DataFramepivot_table   )indentsmeanFTAllr!   r   boolr   zbool | lib.NoDefault)dataaggfuncmarginsdropnamargins_nameobservedsortreturnc                 C  s   t |}t |}t|trg }g }|D ]>}t| |||||||||	|
d}|| |t|d| q&t||dd}|j| ddS t| |||||||||	|
}|j| ddS )N)
valuesindexcolumns
fill_valuer)   r*   r+   r,   r-   r.   __name__r#   )keysaxisr"   )method)_convert_by
isinstancelist__internal_pivot_tableappendgetattrr   Z__finalize__)r(   r0   r1   r2   r)   r3   r*   r+   r,   r-   r.   piecesr5   func_tabletable rB   R/var/www/ai-form-bot/venv/lib/python3.9/site-packages/pandas/core/reshape/pivot.pyr"   =   sJ    

z!AggFuncTypeBase | AggFuncTypeDictc                 C  s  || }|du}|rt |r*d}t|}n
d}|g}|D ]}|| vr8t|q8g }|| D ]>}t|trn|j}z|| v r|| W qZ ty   Y qZ0 qZt|t| j	k r| | } n@| j	}|D ],}z|
|}W q tttfy   Y q0 qt|}|	tju rdn|	}| j|||
|d}|	tju rRtdd |jjD rRtjdtt d ||}|rt|trt|j	r|jd	d
}|}|jjdkr|r|jjdt| }g }tt|t|D ]<}|jj| }|du s||v r|| n
|| q|j||d}|st|jtrRtjt |jj!|jjd}|j"|d|d}t|j	trtjt |j	j!|j	jd}|j"|d|d}|
du rt|tr|j#dd}|dur|$|}|tu r|	st%|r|&t'j(}|r"|r| | ) j*dd } t+|| |||||||d	}|rJ|sJ|j	jdkrJ|j	,d|_	t|dkrlt|dkrl|j-}t|tr|r|jd	dd}|S )zL
    Helper of :func:`pandas.pivot_table` for any non-list ``aggfunc``.
    NTF)r-   r.   r+   c                 s  s   | ]}|j V  qd S N)Z_passed_categorical).0ZpingrB   rB   rC   	<genexpr>   s   z)__internal_pivot_table.<locals>.<genexpr>zThe default value of observed=False is deprecated and will change to observed=True in a future version of pandas. Specify observed=False to silence this warning and retain the current behavior)category
stacklevelall)howr#   r3   namesr   )r6   r3   r6   )rowscolsr)   r-   r,   r3   )rJ   r6   ).r   r:   KeyErrorr9   r   keyr<   	TypeErrorlenr2   Zdrop
ValueErrorr	   
no_defaultgroupbyany_grouperZ	groupingswarningswarnFutureWarningr   aggr   r+   r1   nlevelsrM   rangeunstackr   from_arraysr   ZlevelsreindexZ
sort_indexfillna
is_integerZastypenpZint64ZnotnarI   _add_marginsZ	droplevelT)r(   r0   r1   r2   r)   r3   r*   r+   r,   r-   r.   r5   Zvalues_passedZvalues_multiiZ	to_filterxrR   Zobserved_boolgroupedZaggedrA   Zindex_namesZ
to_unstacknamemrB   rB   rC   r;   v   s    







r;   zDataFrame | Series)rA   r(   r-   r,   c	              	   C  s  t |tstdd| d}	| jjD ]}
|| j|
v r&t|	q&t||||}| jdkr| jjdd  D ]}
|| j|
v rlt|	qlt	|dkr|fdt	|d   }n|}|st | t
r| | ||| iS |rt| |||||||}t |ts|S |\}}}n>t | ts J t| ||||||}t |tsD|S |\}}}|j|j|d}|D ]0}t |tr|| ||< n||d  ||< qbdd	lm} ||t|gd
j}|jj}t|jD ]<}t |trڐq||gj}|| jt|fd||< q||}||j_|S )Nz&margins_name argument must be a stringzConflicting name "z" in margins   r#    rK   r   r    )r2   )args)r9   strrU   r1   rM   get_level_values_compute_grand_marginndimr2   rT   r   _append_constructor_generate_marginal_resultstupler   )_generate_marginal_results_without_valuesrb   pandasr!   r   rg   setZdtypesr   Zselect_dtypesapplyr   )rA   r(   r0   rO   rP   r)   r-   r,   r3   msglevelgrand_marginrR   Zmarginal_result_setresultmargin_keys
row_marginkr!   Zmargin_dummyZ	row_namesZdtyperB   rB   rC   rf      s`    





rf   )r(   r,   c              	   C  s   |ri }| |   D ]\}}zlt|tr:t|| ||< nLt|trzt|| trht|||  ||< q|| |||< n||||< W q ty   Y q0 q|S ||| jiS d S rD   )itemsr9   rq   r=   dictrS   r1   )r(   r0   r)   r,   r   r   vrB   rB   rC   rs   U  s    

rs   )r(   r-   r,   c                   s  t  dkr|g }g }	 fdd}
t |dkr|||  j||d|}d}| jjd|dD ]>\}}|j}|
|}| }|| ||< || |	| q`nddlm} d}| jd|dD ]\}}t  dkr|
|}n}|| |||j}t	|j
tr(tj|g|j
jd g d|_
nt|g|j
jd	|_
|| |	| q|s\| S t||d
}t |dkr|S n
| }| j}	t  dkr| |  j |d|jddt  gttt   }fdd|D }j
|_
n|jtj|jd||	fS )Nr   c                   s   | fdt  d   S )Nrn   r#   rT   )rR   rP   r,   rB   rC   _all_key|  s    z,_generate_marginal_results.<locals>._all_keyr-   r#   )r~   r-   r    rL   rk   rN   T)Zfuture_stackc                   s   g | ]} j j| qS rB   )r1   rM   rE   rh   )r   rB   rC   
<listcomp>      z._generate_marginal_results.<locals>.<listcomp>r1   )rT   rW   r]   rg   copyr<   rz   r!   r|   r9   r1   r   from_tuplesrM   r   rk   r   r2   stackr:   r_   Zreorder_levels_constructor_slicedre   nan)rA   r(   r0   rO   rP   r)   r-   r,   Ztable_piecesr   r   marginZcat_axisrR   Zpieceall_keyr!   Ztransformed_piecer   Znew_order_indicesZnew_order_namesrB   )rP   r,   r   rC   rw   l  sX    




rw   c                   s   t  dkrg } fdd}t |dkr`|j||d| |}	| }
|	| |
< | }||
 q|jdd|d|}	| }
|	| |
< | }||
 |S n
| }| j}t  r|j |d  |}nttj|jd}|||fS )Nr   c                     s&   t  dkrS fdt  d   S )Nr#   rn   r   rB   r   rB   rC   r     s    z;_generate_marginal_results_without_values.<locals>._all_keyr   )r~   r6   r-   r   )rT   rW   r|   r<   r2   r   re   r   )rA   r(   rO   rP   r)   r-   r,   r   r   r   r   r   r   rB   r   rC   ry     s*    

ry   c                 C  sF   | d u rg } n4t | s2t| tjtttfs2t| r:| g} nt| } | S rD   )	r   r9   re   Zndarrayr   r   r   callabler:   )ZbyrB   rB   rC   r8     s    r8   pivot)r1   r0   r   zIndexLabel | lib.NoDefault)r(   r2   r1   r0   r/   c                  sv  t |} jdd  j  _dd  jjD  j_|tju rz|tjurXt |}ng }|tju } j|| |d}n|tju rt jt	r fddt
 jjD }q܈ j j jjdg}n fddt |D } fd	d|D }	||	 t	|}
t|r>t|ts>ttt |} j | j|
|d
}n j | j|
d}||}dd |jjD |j_|S )NF)deepc                 S  s   g | ]}|d ur|nt jqS rD   r	   rV   rE   rk   rB   rB   rC   r     s   zpivot.<locals>.<listcomp>)r<   c                   s   g | ]} j |qS rB   )r1   rr   r   r(   rB   rC   r   !  s   r   c                   s   g | ]} | qS rB   rB   )rE   idxr   rB   rC   r   )  r   c                   s   g | ]} | qS rB   rB   )rE   colr   rB   rC   r   +  r   )r1   r2   r   c                 S  s   g | ]}|t jur|nd qS rD   r   r   rB   rB   rC   r   ;  s   )comZconvert_to_list_liker   r1   rM   r	   rV   Z	set_indexr9   r   r_   r^   r   rk   extendra   r   rx   r   r   r   rv   Z_valuesr`   )r(   r2   r1   r0   Zcolumns_listlikerP   r<   ZindexedZ
index_listZdata_columnsZ
multiindexr   rB   r   rC   r     sH    	











z/bool | Literal[0, 1, 'all', 'index', 'columns'])r*   r,   r+   	normalizer/   c
              	   C  s^  |du r|durt d|dur0|du r0t dt| s>| g} t|sL|g}d}
dd | | D }|rtt|ddd}
t| |d	d
}t||dd
}t||\}}}}ddlm} i tt|| tt||}|||
d}|du rd|d< t	dd}n||d< d|i}|j
d|||||dd|}|	dur>t||	||d}|j|dd}|j|dd}|S )a  
    Compute a simple cross tabulation of two (or more) factors.

    By default, computes a frequency table of the factors unless an
    array of values and an aggregation function are passed.

    Parameters
    ----------
    index : array-like, Series, or list of arrays/Series
        Values to group by in the rows.
    columns : array-like, Series, or list of arrays/Series
        Values to group by in the columns.
    values : array-like, optional
        Array of values to aggregate according to the factors.
        Requires `aggfunc` be specified.
    rownames : sequence, default None
        If passed, must match number of row arrays passed.
    colnames : sequence, default None
        If passed, must match number of column arrays passed.
    aggfunc : function, optional
        If specified, requires `values` be specified as well.
    margins : bool, default False
        Add row/column margins (subtotals).
    margins_name : str, default 'All'
        Name of the row/column that will contain the totals
        when margins is True.
    dropna : bool, default True
        Do not include columns whose entries are all NaN.
    normalize : bool, {'all', 'index', 'columns'}, or {0,1}, default False
        Normalize by dividing all values by the sum of values.

        - If passed 'all' or `True`, will normalize over all values.
        - If passed 'index' will normalize over each row.
        - If passed 'columns' will normalize over each column.
        - If margins is `True`, will also normalize margin values.

    Returns
    -------
    DataFrame
        Cross tabulation of the data.

    See Also
    --------
    DataFrame.pivot : Reshape data based on column values.
    pivot_table : Create a pivot table as a DataFrame.

    Notes
    -----
    Any Series passed will have their name attributes used unless row or column
    names for the cross-tabulation are specified.

    Any input passed containing Categorical data will have **all** of its
    categories included in the cross-tabulation, even if the actual data does
    not contain any instances of a particular category.

    In the event that there aren't overlapping indexes an empty DataFrame will
    be returned.

    Reference :ref:`the user guide <reshaping.crosstabulations>` for more examples.

    Examples
    --------
    >>> a = np.array(["foo", "foo", "foo", "foo", "bar", "bar",
    ...               "bar", "bar", "foo", "foo", "foo"], dtype=object)
    >>> b = np.array(["one", "one", "one", "two", "one", "one",
    ...               "one", "two", "two", "two", "one"], dtype=object)
    >>> c = np.array(["dull", "dull", "shiny", "dull", "dull", "shiny",
    ...               "shiny", "dull", "shiny", "shiny", "shiny"],
    ...              dtype=object)
    >>> pd.crosstab(a, [b, c], rownames=['a'], colnames=['b', 'c'])
    b   one        two
    c   dull shiny dull shiny
    a
    bar    1     2    1     0
    foo    2     2    1     2

    Here 'c' and 'f' are not represented in the data and will not be
    shown in the output because dropna is True by default. Set
    dropna=False to preserve categories with no data.

    >>> foo = pd.Categorical(['a', 'b'], categories=['a', 'b', 'c'])
    >>> bar = pd.Categorical(['d', 'e'], categories=['d', 'e', 'f'])
    >>> pd.crosstab(foo, bar)
    col_0  d  e
    row_0
    a      1  0
    b      0  1
    >>> pd.crosstab(foo, bar, dropna=False)
    col_0  d  e  f
    row_0
    a      1  0  0
    b      0  1  0
    c      0  0  0
    Nz&aggfunc cannot be used without values.z)values cannot be used without an aggfunc.c                 S  s   g | ]}t |ttfr|qS rB   )r9   r   r   )rE   ri   rB   rB   rC   r     r   zcrosstab.<locals>.<listcomp>TF)Z	intersectr.   rowprefixr   r   r    r   	__dummy__)r)   r3   r)   )r1   r2   r*   r,   r+   r-   )r   r*   r,   )r1   r6   r#   )r2   r6   )r   )rU   r   r   
_get_names_build_names_mapperrz   r!   r   ziprT   r"   
_normalizeZrename_axis)r1   r2   r0   rownamescolnamesr)   r*   r,   r+   r   Z
common_idxZ	pass_objsrownames_mapperunique_rownamescolnames_mapperunique_colnamesr!   r(   ZdfkwargsrA   rB   rB   rC   crosstabB  sf    j 
r   )rA   r*   r,   r/   c              
   C  sL  t |ttfsTddd}z|| }W n. tyR } ztd|W Y d }~n
d }~0 0 |du rdd dd d	d d
}|d |d< z|| }W n. ty } ztd|W Y d }~n
d }~0 0 || } | d} nv|du r@| j}| j}	| jdd d f j	}
||
v||
k@ rt| d| jd ddf }| jdd df }| jd dd df } t
| |dd} |dkr||  }t| |gdd} | d} |	| _n|dkr||  }| |} | d} || _np|dks|du r6||  }||  }d|j|< t| |gdd} | |} | d} || _|	| _ntdntd| S )Nr1   r2   )r   r#   zNot a valid normalize argumentFc                 S  s   | | j ddj dd S Nr#   rN   r   sumri   rB   rB   rC   <lambda>  r   z_normalize.<locals>.<lambda>c                 S  s   | |    S rD   r   r   rB   rB   rC   r     r   c                 S  s   | j | jddddS r   )divr   r   rB   rB   rC   r     r   )rI   r2   r1   rI   Tr   z not in pivoted DataFrame)r   r*   r#   rN   zNot a valid margins argument)r9   r'   rq   rQ   rU   rc   r1   r2   Zilocrk   r   r   r   ru   loc)rA   r   r*   r,   Z	axis_subserrZnormalizersfZtable_indextable_columnsZlast_ind_or_colZcolumn_marginZindex_marginrB   rB   rC   r     sd    
  









r   r   rq   r   c                 C  s   |d u rVg }t | D ]>\}}t|tr>|jd ur>||j q|| d|  qn*t|t| krntdt|tst|}|S )N_z*arrays and names must have the same length)	enumerater9   r   rk   r<   rT   AssertionErrorr:   )ZarrsrM   r   rh   ZarrrB   rB   rC   r   ?  s    
r   z	list[str]z;tuple[dict[str, str], list[str], dict[str, str], list[str]])r   r   r/   c                   s   dd }t | t |}|| ||B |B   fddt| D } fddt| D } fddt|D } fddt|D }||||fS )	a  
    Given the names of a DataFrame's rows and columns, returns a set of unique row
    and column names and mappers that convert to original names.

    A row or column name is replaced if it is duplicate among the rows of the inputs,
    among the columns of the inputs or between the rows and the columns.

    Parameters
    ----------
    rownames: list[str]
    colnames: list[str]

    Returns
    -------
    Tuple(Dict[str, str], List[str], Dict[str, str], List[str])

    rownames_mapper: dict[str, str]
        a dictionary with new row names as keys and original rownames as values
    unique_rownames: list[str]
        a list of rownames with duplicate names replaced by dummy names
    colnames_mapper: dict[str, str]
        a dictionary with new column names as keys and original column names as values
    unique_colnames: list[str]
        a list of column names with duplicate names replaced by dummy names

    c                   s   t    fdd| D S )Nc                   s   h | ]}| vr|qS rB   rB   r   seenrB   rC   	<setcomp>p  r   z>_build_names_mapper.<locals>.get_duplicates.<locals>.<setcomp>)r{   rL   rB   r   rC   get_duplicatesn  s    z+_build_names_mapper.<locals>.get_duplicatesc                   s$   i | ]\}}| v rd | |qS Zrow_rB   rE   rh   rk   Z	dup_namesrB   rC   
<dictcomp>u  s   z'_build_names_mapper.<locals>.<dictcomp>c                   s&   g | ]\}}| v rd | n|qS r   rB   r   r   rB   rC   r   x  s   z'_build_names_mapper.<locals>.<listcomp>c                   s$   i | ]\}}| v rd | |qS Zcol_rB   r   r   rB   rC   r   |  s   c                   s&   g | ]\}}| v rd | n|qS r   rB   r   r   rB   rC   r     s   )r{   intersectionr   )r   r   r   Zshared_namesr   r   r   r   rB   r   rC   r   P  s     



r   )r&   N)r&   )r&   )r&   )NNNNFr&   TF)r&   )r   )E
__future__r   collections.abcr   r   typingr   r   r   r   rZ   numpyre   Zpandas._libsr	   Zpandas.util._decoratorsr
   r   Zpandas.util._exceptionsr   Zpandas.core.dtypes.castr   Zpandas.core.dtypes.commonr   r   r   Zpandas.core.dtypes.dtypesr   Zpandas.core.dtypes.genericr   r   Zpandas.core.commoncorecommonr   Zpandas.core.framer   Zpandas.core.groupbyr   Zpandas.core.indexes.apir   r   r   Zpandas.core.reshape.concatr   Zpandas.core.reshape.utilr   Zpandas.core.seriesr   Zpandas._typingr   r   r   r   rz   r!   rV   r"   r;   rf   rs   rw   ry   r8   r   r   r   r   r   rB   rB   rB   rC   <module>   s   "7   V  [ -H         / P