
    cMh                        d dl mZ d dlmZ d dlZd dlmZ d dlm	Z	m
Z
 d dlmZ erd dlmZ d dlmZ d d	lmZmZ 	 dddZddZddZdS )    )annotations)TYPE_CHECKINGNremove_na_arraylike)
MultiIndexconcat)unpack_single_str_list)Hashable)
IndexLabel)	DataFrameSerieshistdatar   kindstrreturn"dict[Hashable, DataFrame | Series]c                     |dk    rdndt           j        t                    sJ  fd j        j                 D             S )a~  
    Create data for iteration given `by` is assigned or not, and it is only
    used in both hist and boxplot.

    If `by` is assigned, return a dictionary of DataFrames in which the key of
    dictionary is the values in groups.
    If `by` is not assigned, return input as is, and this preserves current
    status of iter_data.

    Parameters
    ----------
    data : reformatted grouped data from `_compute_plot_data` method.
    kind : str, plot kind. This function is only used for `hist` and `box` plots.

    Returns
    -------
    iter_data : DataFrame or Dictionary of DataFrames

    Examples
    --------
    If `by` is assigned:

    >>> import numpy as np
    >>> tuples = [('h1', 'a'), ('h1', 'b'), ('h2', 'a'), ('h2', 'b')]
    >>> mi = pd.MultiIndex.from_tuples(tuples)
    >>> value = [[1, 3, np.nan, np.nan],
    ...          [3, 4, np.nan, np.nan], [np.nan, np.nan, 5, 6]]
    >>> data = pd.DataFrame(value, columns=mi)
    >>> create_iter_data_given_by(data)
    {'h1':     h1
         a    b
    0  1.0  3.0
    1  3.0  4.0
    2  NaN  NaN, 'h2':     h2
         a    b
    0  NaN  NaN
    1  NaN  NaN
    2  5.0  6.0}
    r   r      c                l    i | ]0}|j         d d j                                      |k    f         1S )N)loccolumnsget_level_values).0colr   levels     c/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/pandas/plotting/_matplotlib/groupby.py
<dictcomp>z-create_iter_data_given_by.<locals>.<dictcomp>R   sP        	TXaaa66u==DDE      )
isinstancer   r   levels)r   r   r   s   ` @r   create_iter_data_given_byr"      sp    ^ v~~ dlJ/////    <&u-   r   byr   colsc                    t          |          }|                     |          }g }|D ]@\  }}t          j        |g|g          }||         }	||	_        |                    |	           At          |d          } | S )al  
    Internal function to group data, and reassign multiindex column names onto the
    result in order to let grouped data be used in _compute_plot_data method.

    Parameters
    ----------
    data : Original DataFrame to plot
    by : grouped `by` parameter selected by users
    cols : columns of data set (excluding columns used in `by`)

    Returns
    -------
    Output is the reconstructed DataFrame with MultiIndex columns. The first level
    of MI is unique values of groups, and second level of MI is the columns
    selected by users.

    Examples
    --------
    >>> d = {'h': ['h1', 'h1', 'h2'], 'a': [1, 3, 5], 'b': [3, 4, 6]}
    >>> df = pd.DataFrame(d)
    >>> reconstruct_data_with_by(df, by='h', cols=['a', 'b'])
       h1      h2
       a     b     a     b
    0  1.0   3.0   NaN   NaN
    1  3.0   4.0   NaN   NaN
    2  NaN   NaN   5.0   6.0
    r   )axis)r	   groupbyr   from_productr   appendr   )
r   r#   r$   by_modifiedgrouped	data_listkeygroupr   	sub_groups
             r   reconstruct_data_with_byr0   X   s    < ),,Kll;''GI $ $
U )C5$-88$K	#	####)!$$$DKr   y
np.ndarrayIndexLabel | Nonec                    |@t          | j                  dk    r(t          j        d | j        D                       j        S t          |           S )zInternal function to reformat y given `by` is applied or not for hist plot.

    If by is None, input y is 1-d with NaN removed; and if by is not None, groupby
    will take place and input y is multi-dimensional array.
    Nr   c                ,    g | ]}t          |          S  r   )r   r   s     r   
<listcomp>z,reformat_hist_y_given_by.<locals>.<listcomp>   s!    AAAc,S11AAAr   )lenshapenparrayTr   )r1   r#   s     r   reformat_hist_y_given_byr=      sM     
~#ag,,**xAAQSAAABBDDq!!!r   )r   )r   r   r   r   r   r   )r   r   r#   r   r$   r   r   r   )r1   r2   r#   r3   r   r2   )
__future__r   typingr   numpyr:   pandas.core.dtypes.missingr   pandasr   r    pandas.plotting._matplotlib.miscr	   collections.abcr
   pandas._typingr   r   r   r"   r0   r=   r6   r   r   <module>rF      s*   " " " " " "                 : : : : : :       
 D C C C C C (((((())))))        "(: : : : :z+ + + +\" " " " " "r   