o
    ŀgp                     @  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rd dl1m2Z2m3Z3m4Z4m5Z5 d dl6m7Z7 edee$d ddddddddddej8df
dRd)dZ9dSd+d,Z:		dTdUd/d0Z;	dVdWd1d2Z<	dVdXd3d4Z=	dVdYd5d6Z>d7d8 Z?edee$d9 ddej8ej8d:dZd@d9Z@								d[d\dCdDZA	dVd]dEdFZBd^d_dJdKZCd`dPdQZDdS )a    )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Alldatar!   aggfuncr   marginsbooldropnamargins_namer   observedbool | lib.NoDefaultsortreturnc                 C  s   t |}t |}t|trAg }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   __finalize__)r'   r1   r2   r3   r(   r4   r)   r+   r,   r-   r/   piecesr6   func_tabletable rD   M/var/www/html/myenv/lib/python3.10/site-packages/pandas/core/reshape/pivot.pyr"   =   sJ   

!AggFuncTypeBase | AggFuncTypeDictc                 C  sv  || }|du}|rZt |rd}t|}nd}|g}|D ]
}|| vr&t|qg }|| D ]}t|tr7|j}z|| v rA|| W q- tyK   Y q-w t|t| j	k rY| | } n| j	}|D ]}z|
|}W q_ tttfyt   Y q_w t|}|	tju rdn|	}| j|||
|d}|	tju rtdd |jjD rt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|| q|| q|j||d}|s8t|jtrtjt |jj!|jjd}|j"|d|d}t|j	tr8tjt |j	j!|j	jd}|j"|d|d}|
du rIt|trI|j#dd}|durg|$|}|tu rg|	sgt%|rg|&t'j(}|r|rw| | ) j*dd } t+|| |||||||d	}|r|s|j	jdkr|j	,d|_	t|dkrt|dkr|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)_passed_categorical).0pingrD   rD   rE   	<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#   r4   namesr   )r7   r4   r7   )rowscolsr(   r-   r,   r4   )rO   r7   ).r   r;   KeyErrorr:   r   keyr=   	TypeErrorlenr3   drop
ValueErrorr	   
no_defaultgroupbyany_grouper	groupingswarningswarnFutureWarningr   aggr   r+   r2   nlevelsrR   rangeunstackr   from_arraysr   levelsreindex
sort_indexfillna
is_integerastypenpint64notnarN   _add_margins	droplevelT)r'   r1   r2   r3   r(   r4   r)   r+   r,   r-   r/   r6   values_passedvalues_multii	to_filterxrW   observed_boolgroupedaggedrC   index_names
to_unstacknamemrD   rD   rE   r<   v   s   





r<   rC   DataFrame | Seriesc	              	   C  s  t |ts	tdd| d}	| jjD ]}
|| j|
v r!t|	qt||||}| jdkrE| jjdd  D ]}
|| j|
v rDt|	q6t	|dkrW|fdt	|d   }n|}|slt | t
rl| | ||| iS |rt| |||||||}t |ts|S |\}}}nt | tsJ t| ||||||}t |ts|S |\}}}|j|j|d}|D ]}t |tr|| ||< q||d  ||< qdd	lm} ||t|gd
j}|jj}t|jD ]}t |trq||gj}|| jt|fd||< q||}||j_|S )Nz&margins_name argument must be a stringzConflicting name "z" in margins   r#    rP   r   r    )r3   )args)r:   strr[   r2   rR   get_level_values_compute_grand_marginndimr3   rY   r   _append_constructor_generate_marginal_resultstupler   )_generate_marginal_results_without_valuesrj   pandasr!   r   rt   setdtypesr   select_dtypesapplyr   )rC   r'   r1   rT   rU   r(   r-   r,   r4   msglevelgrand_marginrW   marginal_result_setresultmargin_keys
row_marginkr!   margin_dummy	row_namesdtyperD   rD   rE   rr      sd   







rr   c              	   C  s   |rPi }| |   D ]C\}}z6t|trt|| ||< n&t|tr=t|| tr4t|||  ||< n|| |||< n||||< W q
 tyM   Y q
w |S ||| jiS rG   )itemsr:   r   r>   dictrX   r2   )r'   r1   r(   r,   r   r   vrD   rD   rE   r   U  s"   

r   c                   s
  t  dkrg }g }	 fdd}
t |dkrP|||  j||d|}d}| jjd|dD ]\}}|j}|
|}| }|| ||< || |	| q/nWddlm} d}| jd|dD ]G\}}t  dkrn|
|}n}|| |||j}t	|j
trt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 )Nr   r#   rY   )rW   rU   r,   rD   rE   _all_key|  s   z,_generate_marginal_results.<locals>._all_keyr-   r#   )r   r-   r    rQ   r   rS   T)future_stackc                   s   g | ]} j j| qS rD   )r2   rR   rI   rw   )r   rD   rE   
<listcomp>      z._generate_marginal_results.<locals>.<listcomp>r2   )rY   r]   rd   rt   copyr=   r   r!   r   r:   r2   r   from_tuplesrR   r   r   r   r3   stackr;   rf   reorder_levels_constructor_slicedro   nan)rC   r'   r1   rT   rU   r(   r-   r,   table_piecesr   r   margincat_axisrW   pieceall_keyr!   transformed_piecer   new_order_indicesnew_order_namesrD   )rU   r,   r   rE   r   l  s\   





r   c                   s   t  dkrKg } fdd}t |dkr0|j||d| |}	| }
|	| |
< | }||
 n |jdd|d|}	| }
|	| |
< | }||
 |S | }| j}t  ra|j |d  |}nttj|jd}|||fS )Nr   c                     s&   t  dkrS fdt  d   S )Nr#   r   r   rD   r   rD   rE   r     s   z;_generate_marginal_results_without_values.<locals>._all_keyr   )r   r7   r-   r   )rY   r]   r   r=   r3   r   ro   r   )rC   r'   rT   rU   r(   r-   r,   r   r   r   r   r   r   rD   r   rE   r     s*   


r   c                 C  sJ   | d u rg } | S t | st| tjtttfst| r| g} | S t| } | S rG   )	r   r:   ro   ndarrayr   r   r   callabler;   )byrD   rD   rE   r9     s   	r9   pivot)r2   r1   r3   r   r2   IndexLabel | lib.NoDefaultr1   c                  sr  t |} jdd  j  _dd  jjD  j_|tju r=|tjur,t |}ng }|tju } j|| |d}nj|tju rbt jt	rV fddt
 jjD }n j j jjdg}n fddt |D } fd	d|D }	||	 t	|}
t|rt|tst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 rG   r	   r\   rI   r   rD   rD   rE   r         zpivot.<locals>.<listcomp>)r=   c                   s   g | ]} j |qS rD   )r2   r   r   r'   rD   rE   r   !  s    r   c                      g | ]} | qS rD   rD   )rI   idxr   rD   rE   r   )      c                   r   rD   rD   )rI   colr   rD   rE   r   +  r   )r2   r3   r   c                 S  s   g | ]}|t jur|nd qS rG   r   r   rD   rD   rE   r   ;  r   )comconvert_to_list_liker   r2   rR   r	   r\   	set_indexr:   r   rf   re   r   r   extendrh   r   r   r   r   r   r   _valuesrg   )r'   r3   r2   r1   columns_listlikerU   r=   indexed
index_listdata_columns
multiindexr   rD   r   rE   r     sH   
	










	normalize/bool | Literal[0, 1, 'all', 'index', 'columns']c
              	   C  s^  |du r|durt d|dur|du rt dt| s| g} t|s&|g}d}
dd | | D }|r:t|ddd}
t| |d	d
}t||dd
}t||\}}}}ddlm} i tt|| tt||}|||
d}|du r{d|d< t	dd}n||d< d|i}|j
	d|||||dd|}|	durt||	||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 rD   )r:   r   r   )rI   ry   rD   rD   rE   r     s    zcrosstab.<locals>.<listcomp>TF)	intersectr/   row)prefixr   r   r    r   	__dummy__)r(   r4   r(   )r2   r3   r)   r,   r+   r-   )r   r)   r,   )r2   r7   r#   )r3   r7   )r   )r[   r   r   
_get_names_build_names_mapperr   r!   r   ziprY   r"   
_normalizerename_axis)r2   r3   r1   rownamescolnamesr(   r)   r,   r+   r   
common_idx	pass_objsrownames_mapperunique_rownamescolnames_mapperunique_colnamesr!   r'   dfkwargsrC   rD   rD   rE   crosstabB  sf   jr   c              
   C  s,  t |ttfs$ddd}z|| }W n ty# } ztd|d }~ww |du r]dd dd d	d d
}|d |d< z|| }W n tyQ } ztd|d }~ww || } | d} | S |du r| j}| j}	| jdd d f j	}
||
v||
k@ rt| 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} |	| _| S |dkr||  }| |} | d} || _| S |dks|du r||  }||  }d|j|< t| |gdd} | |} | d} || _|	| _| S tdtd)Nr2   r3   )r   r#   zNot a valid normalize argumentFc                 S  s   | | j ddj dd S Nr#   rS   r   sumry   rD   rD   rE   <lambda>  r   z_normalize.<locals>.<lambda>c                 S  s   | |    S rG   r   r   rD   rD   rE   r     s    c                 S  s   | j | jddddS r   )divr   r   rD   rD   rE   r     s    )rN   r3   r2   rN   Tr   z not in pivoted DataFrame)r   r)   r#   rS   zNot a valid margins argument)r:   r*   r   rV   r[   rl   r2   r3   ilocr   r   r   r   r   loc)rC   r   r)   r,   	axis_subserrnormalizersftable_indextable_columnslast_ind_or_colcolumn_marginindex_marginrD   rD   rE   r     sr   



3






r   r   r   r   c                 C  s   |d u r,g }t | D ]\}}t|tr|jd ur||j q
|| d|  q
|S t|t| kr8tdt|tsAt|}|S )N_z*arrays and names must have the same length)	enumerater:   r   r   r=   rY   AssertionErrorr;   )arrsrR   r   rw   arrrD   rD   rE   r   ?  s   
r   r   	list[str]r   ;tuple[dict[str, str], list[str], dict[str, str], list[str]]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 rD   rD   r   seenrD   rE   	<setcomp>p  r   z>_build_names_mapper.<locals>.get_duplicates.<locals>.<setcomp>)r   rQ   rD   r  rE   get_duplicatesn  s   z+_build_names_mapper.<locals>.get_duplicatesc                   $   i | ]\}}| v rd | |qS row_rD   rI   rw   r   	dup_namesrD   rE   
<dictcomp>u      z'_build_names_mapper.<locals>.<dictcomp>c                   &   g | ]\}}| v rd | n|qS r  rD   r  r	  rD   rE   r   x      z'_build_names_mapper.<locals>.<listcomp>c                   r  col_rD   r  r	  rD   rE   r  |  r  c                   r  r  rD   r  r	  rD   rE   r     r  )r   intersectionr   )r   r   r  shared_namesr   r   r   r   rD   r	  rE   r   P  s    



r   )r'   r!   r(   r   r)   r*   r+   r*   r,   r   r-   r.   r/   r*   r0   r!   )r'   r!   r(   rF   r)   r*   r+   r*   r,   r   r-   r.   r/   r*   r0   r!   )r&   N)rC   r   r'   r!   r-   r*   r,   r   )r&   )r'   r!   r,   r   )r'   r!   r-   r*   r,   r   )rC   r!   r'   r!   r-   r*   r,   r   )
r'   r!   r3   r   r2   r   r1   r   r0   r!   )NNNNFr&   TF)
r)   r*   r,   r   r+   r*   r   r   r0   r!   )rC   r!   r)   r*   r,   r   r0   r!   )r   )r   r   )r   r   r   r   r0   r   )E
__future__r   collections.abcr   r   typingr   r   r   r   ra   numpyro   pandas._libsr	   pandas.util._decoratorsr
   r   pandas.util._exceptionsr   pandas.core.dtypes.castr   pandas.core.dtypes.commonr   r   r   pandas.core.dtypes.dtypesr   pandas.core.dtypes.genericr   r   pandas.core.commoncorecommonr   pandas.core.framer   pandas.core.groupbyr   pandas.core.indexes.apir   r   r   pandas.core.reshape.concatr   pandas.core.reshape.utilr   pandas.core.seriesr   pandas._typingr   r   r   r   r   r!   r\   r"   r<   rr   r   r   r   r9   r   r   r   r   r   rD   rD   rD   rE   <module>   s    
7 V[-H /P