a
    \:b                     @   sl   d dl m  mZ d dlmZmZ d dlZi Z	G dd deZdddZ
dd	 Zd
d Zdd Zdd ZdS )    N)	dmatricesNAActionc                   @   s   e Zd Zdd ZdS )r   c                    sH   t j|d jd td}|D ]}||O }q|  || _ fdd|D S )Nr   )Zdtypec                    s   g | ]}| d f qS ). ).0vZ	good_maskr   ?lib/python3.9/site-packages/statsmodels/formula/formulatools.py
<listcomp>       z,NAAction._handle_NA_drop.<locals>.<listcomp>)npZzerosshapeboolmissing_mask)selfvaluesZis_NAsZoriginsZ
total_maskZis_NAr   r   r   _handle_NA_drop   s    
zNAAction._handle_NA_dropN)__name__
__module____qualname__r   r   r   r   r   r      s   r   dropc           	      C   s   t |tt rtt| S t|d}|durlt| |rTt|| |f|d|d}qt|| |f|d|d}n2t| drt|| |d|d}nt|| |d|d}t	|dd}t
|sd}t|dkr|d j}nd}|||fS )a;  
    Returns endog, exog, and the model specification from arrays and formula.

    Parameters
    ----------
    Y : array_like
        Either endog (the LHS) of a model specification or all of the data.
        Y must define __getitem__ for now.
    X : array_like
        Either exog or None. If all the data for the formula is provided in
        Y then you must explicitly set X to None.
    formula : str or patsy.model_desc
        You can pass a handler by import formula_handler and adding a
        key-value pair where the key is the formula object class and
        the value is a function that returns endog, exog, formula object.

    Returns
    -------
    endog : array_like
        Should preserve the input type of Y,X.
    exog : array_like
        Should preserve the input type of Y,X. Could be None.
    )Zon_NANZ	dataframe)Zreturn_typeZ	NA_actionr      )
isinstancetupleformula_handlerkeystyper   	data_utilZ_is_using_pandasr   getattrr   anylendesign_info)	YXZformulaZdepthZmissingZ	na_actionresultr   r    r   r   r   handle_formula_data   s2    



r$   c                 C   s"   ddl m} || v r| | | S )z,
    Remove intercept from Patsy terms.
    r   	INTERCEPT)
patsy.descr&   remove)termsr&   r   r   r   _remove_intercept_patsyQ   s    
r*   c                 C   s   ddl m} || jv S )Nr   r%   )r'   r&   r)   )r    r&   r   r   r   _has_intercept[   s    r+   c                    s0   ddl m  ddlm} | fdd| jD S )zR
    Returns boolean array index indicating which column holds the intercept.
    r   r%   )arrayc                    s   g | ]} |kqS r   r   )r   ir%   r   r   r	   f   r
   z"_intercept_idx.<locals>.<listcomp>)r'   r&   numpyr,   r)   )r    r,   r   r%   r   _intercept_idx`   s    r/   c                 C   s"   ddl m} | jj}|||}|S )z
    r   )linear_constraint)Zpatsy.constraintr0   Zmodel
exog_names)Zmodel_resultsZtest_formular0   r1   ZLCr   r   r   make_hypotheses_matricesi   s    
r2   )r   r   )Zstatsmodels.tools.dataZtoolsdatar   Zpatsyr   r   r.   r   r   r$   r*   r+   r/   r2   r   r   r   r   <module>   s   
9
	