
    !g_                        d Z ddlmZ ddlmZ ddlmZ ddlZddl	m
Z
mZmZmZ ddlmc mZ ddlmZmZ ddlmZ d	 Zd
 Zd Z G d d      Z G d de      Z G d de      Zd Zd ZddZd Z ddZ!y)zr
Base tools for handling various kinds of data structures, attaching metadata to
results, and doing data cleaning
    )annotations)lmap)reduceN)	DataFrameSeriesisnull
MultiIndex)cache_readonlycache_writable)MissingDataErrorc                    t        j                  |       j                  dkD  r2t        j                  |       j                         j                  dk(  ry y y N   )npasarrayndimsqueezexs    R/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/statsmodels/base/data.py_asarray_2dcolumnsr      sB    	zz!}A"**Q-"7"7"9">">!"C #D    c                    t        j                  |       } | j                  dk(  r	| dddf   } t        j                  t	        |       d      dddf   S )zy
    Makes sure input is an array and is 2d. Makes sure output is 2d. True
    indicates a null in the rows of 2d x.
    r   Naxis)r   r   r   anyr   r   s    r   _asarray_2d_null_rowsr      sG     	

1Avv{agJ66&)!$QW--r   c                 h    t        |       dk(  r| dggfz  } d }t        ||       j                         S )z
    Returns a boolean array which is True where any of the rows in any
    of the _2d_ arrays in arrs are NaNs. Inputs can be any mixture of Series,
    DataFrames or array_like.
    r   Fc                    t        | d      xr | j                  t        k(  xr | }t        j                  t        |       |t        |      z        S )Ndtype)hasattrr    boolr   
logical_orr   )r   yx_is_boolean_arrays      r   _nan_row_maybe_two_inputsz,_nan_rows.<locals>._nan_row_maybe_two_inputs.   sJ    $Q0JQWW_J}}21503H3KKN 	Nr   )lenr   r   )arrsr&   s     r   	_nan_rowsr)   %   s>     4yA~5'N
 +T2::<<r   c                  x   e Zd ZdZdZdZd"dZd Zd Zd Z	e
d        Ze
d        Ze
d	        Zd
 Z e       d        Z e       d#d       Zed        Zej(                  d        Zed        Zej(                  d        Zed        Zd Zd Zd Zd Zd Zd$dZd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d  Z&d! Z'y)%	ModelDatazi
    Class responsible for handling input data and extracting metadata into the
    appropriate form
    Nc                   t        j                  |      st        j                  |      rddlm} t	        |      d|v r|j                  d      | _        d|v r|j                  d      | _        |dk7  r | j                  |||fi |\  }}|| _	        | j                  j                  |       | j                  | _        | j                  | _        | j!                  | j                  | j                        \  | _        | _        nH| j                  j                  |       || _        || _        | j!                  ||      \  | _        | _        d | _        d| _        | j'                  |       | j)                          i | _        y )Nr   )recarray_exceptiondesign_infoformulanone)	data_util_is_recarraystatsmodels.tools.sm_exceptionsr-   NotImplementedErrorpopr.   r/   handle_missingmissing_row_idx__dict__updateendog
orig_endogexog	orig_exog_convert_endog_exog	const_idx
k_constant_handle_constant_check_integrity_cache)	selfr:   r<   missinghasconstkwargsr-   arraysnan_idxs	            r   __init__zModelData.__init__>   sL   !!%(I,B,B4,HJ%&899F"%zz-8D!::i0DLf1d11%w <4:<OFG#*D MM  ("jjDO!YYDN$($<$<TZZ=AYY%H!DJ	 MM  (#DO!DN$($<$<UD$I!DJ	h'r   c                N    ddl m }  || j                        }d|v r|d= d|d<   |S )Nr   )copyr.   Trestore_design_info)rL   r8   )rD   rL   ds      r   __getstate__zModelData.__getstate__\   s3    A- '+A#$r   c                h   d|v rDddl m}m} g }	 |d   }dD ]  }	  ||d   ||d	
      \  }} n |d   |j                  | _        |d= | j                  j                  |       y # t        $ r |d   j	                  |d         }Y rw xY w# t
        |f$ r}	|j                  |	       Y d }	~	d }	~	ww xY w)NrM   r   )	dmatrices
PatsyErrorframer;   r=   )      r   r      r/   	dataframe)eval_envreturn_type)
patsyrQ   rR   KeyErrorjoin	NameErrorappendr.   r8   r9   )
rD   rN   rQ   rR   excdatadepth_designes
             r   __setstate__zModelData.__setstate__d   s     A%3C<z ) 	 )!I,u6A!CIAv		 "g%11D'(Q!  <++AkN;< ":. JJqMs(   A% B% BBB1B,,B1c                >   |du s| j                   d| _        d | _        y d}t        j                  | j                   d      }t        j
                  |      j                         st        d      t        j                  | j                   d      }t        j                  ||k(        d   j                         }|j                  | _        | j                  dk(  r8| j                   d d |f   j                         dk7  rt        |      | _        nd}n| j                  dkD  rg }|D ]R  }| j                   d d |f   j                         }|dk(  rd| _        t        |      | _         nz|j                  |       T t        j                  |      dk7  }	|	j!                         r)d| _        t        ||	j#                                  | _        nd}n| j                  dk(  rd}n	 |r|st        j$                  t        j&                  | j                   j(                  d         | j                   f      }
t        j*                  j-                  |
      }t        j*                  j-                  | j                         }t        ||k(        | _        d | _        y |rd| _        y y )NFr   r   zexog contains inf or nansr   T)r<   r@   r?   r   maxisfiniteallr   minwherer   sizemeanintr_   arrayr   argmaxcolumn_stackonesshapelinalgmatrix_rank)rD   rF   check_implicitexog_maxexog_minr?   valuesidxvalueposaugmented_exog	rank_augm	rank_origs                r   rA   zModelData._handle_constant}   s$   u		 1DO!DN #Nvvdiia0H;;x(,,.&'BCCvvdiia0HX!56q9AACI'nnDO!#99Q	\*//1Q6%(^DN &*N1$ $ .C IIaf-224Ez*+),SMM%(. 88F+q0Cwwy*+),Yszz|-D)E *.A%!% h "$WWTYY__Q%78$))D"FII11.A	II11$))<	"%i9&<"=!% #$ r   c                    ||   S N clsr   nan_masks      r   
_drop_nanszModelData._drop_nans   s    {r   c                    ||   d d |f   S r   r   r   s      r   _drop_nans_2dzModelData._drop_nans_2d   s    {1h;''r   c                    g }|j                  dd      }|d}g }||dgz  }n|	||f}ddg}n|f}dg}|dgz  }d}	g }
t        |      r|j                         D ]  \  }}|t        j                  |      dk(  r||gz  }'|j                  dk(  r |t        j
                  |      fz  }||gz  }V|j                         j                  dk(  r |t        j
                  |      fz  }||gz  }|j                  dk(  r |	t        j
                  |      fz  }	|
|gz  }
t        d	       ||d}|r=t        | }|j                  d   j                  d   k7  rt        d
      |    }|z  |	rjt        |	      }|j                  d   j                  d   k7  rt        d      |
||    z  }n|    }|z  nt        | |	rt        dddf   f|	z    t        j                        st        t        ||            }|	r$|j                  t        t        |
|	                   |r0|j                  |D ci c]  }||j                  |d       c}       |(|j                  d|i       ||j                  d|i       |g fS |dk(  rt        d      |dk(  r  fd} fd}t        t        |t!        ||                  }|S)| } j#                  ||      }| j#                  ||      }|j                  d|i       ||j                  d|i       |	r.|j                  t        t        |
t!        ||	                         |r0|j                  |D ci c]  }||j                  |d       c}       |t        j$                         d   j'                         fS t        d|z        c c}w c c}w )zu
        This returns a dictionary with keys endog, exog and the keys of
        kwargs. It preserves Nones.
        missing_idxNr   r<   r:   r   r   rT   z6Arrays with more than 2 dimensions are not yet handledzBShape mismatch between endog/exog and extra arrays given to model.zEShape mismatch between endog/exog and extra 2d arrays given to model.raisez!NaNs were encountered in the datadropc                (    j                  |       S r   )r   r   r   r   s    r   <lambda>z*ModelData.handle_missing.<locals>.<lambda>"  s    #..H"= r   c                (    j                  |       S r   )r   r   s    r   r   z*ModelData.handle_missing.<locals>.<lambda>#  s    S%6%6q(%C r   z missing option %s not understood)r5   r'   itemsr   r   r   r   
ValueErrorr)   rt   r   dictzipr9   getr   r   r   rl   tolist)r   r:   r<   rE   rG   none_array_namesr   combinedcombined_namescombined_2dcombined_2d_nameskeyvalue_arrayupdated_row_maskcombined_nanscombined_2d_nansk	drop_nansdrop_nans_2dr   s   `                  @r   r6   zModelData.handle_missing   sn     jj5"HN| VH, t}H%v.NxH%YN( v;$*LLN < [&"''+*>!*C$-$##q(K!8 ::H"se+N ((*//14K!8 ::H"se+N !%%*BJJ{$;#==K%#.%$ &; < <#<( ""H# )8 4 &&q)X^^A->>$ &H I I $1(#; M)#,[#9 #))!,q0AA$ &K L L#/$(8((CC$'7	'B$,, !(+H$x4'8&:[&HIvvhC9:HS):K%H IJ*:!<%& "#FJJq$$7!7 !< = &% 01#OOVTN3R<"#FGG yH=ICLCY0IJKH&#/(8'8$NN52BCE'"~~d4DE% 01#OOVTN3S):)-lK)H&J !K L*:!<%& "#FJJq$$7!7 !< = RXXxi03::<<<?'IJJQ!<F!<s   <N=%Oc                    | j                  |      }d }|C| j                  |      }|j                  dk(  r	|d d d f   }|j                  dk7  rt        d      ||fS )Nr   rT   zexog is not 1d or 2d)	_get_yarr	_get_xarrr   r   )rD   r:   r<   yarrxarrs        r   r>   zModelData._convert_endog_exog=  sd     ~~e$>>$'DyyA~AtG}yyA~ !788Tzr   c                    | j                   }| j                  |      }|st        | j                        }t	        |      dk(  r|d   S t        |      S )Nr   r   )r;   
_get_names_make_endog_namesr:   r'   list)rD   r:   ynamess      r   r   zModelData.ynamesK  sJ    '&tzz2Fv;!!9<r   c                    | j                   }|3| j                  |      }|st        | j                        }t	        |      S y r   )r=   r   _make_exog_namesr<   r   )rD   r<   xnamess      r   r   zModelData.xnamesW  s=    ~~__T*F)$))4<r   c                6    | j                   xs | j                  S r   )_param_namesr   rD   s    r   param_nameszModelData.param_namesa  s       /DKK/r   c                    || _         y r   )r   )rD   rz   s     r   r   zModelData.param_namesf  s
    "r   c                J    | j                   | j                   S | j                  S )z
        Labels for covariance matrices

        In multidimensional models, each dimension of a covariance matrix
        differs from the number of param_names.

        If not set, returns param_names
        )
_cov_namesr   r   s    r   	cov_nameszModelData.cov_namesj  s$     ??&??"r   c                    || _         y r   )r   )rD   r|   s     r   r   zModelData.cov_namesy  s      r   c                    | j                   }|| j                  |      }|S | j                  }| j                  |      }|S r   )r=   _get_row_labelsr;   )rD   r<   
row_labelsr:   s       r   r   zModelData.row_labels~  sJ    ~~--d3J  OOE--e4Jr   c                     y r   r   rD   arrs     r   r   zModelData._get_row_labels  s    r   c                   t        |t              r_t        |j                  t              r0|j                  D cg c]  }dj	                  d |D               c}S t        |j                        S t        |t              r|j                  r|j                  gS y 	 |j                  j                  S c c}w # t        $ r Y y w xY w)Nrc   c              3  &   K   | ]	  }|s|  y wr   r   ).0levels     r   	<genexpr>z'ModelData._get_names.<locals>.<genexpr>  s      ?5 ?s   )
isinstancer   columnsr	   r]   r   r   namer    namesAttributeError)rD   r   cs      r   r   zModelData._get_names  s    c9%#++z2 "%.  ?A ?? . . CKK((V$xxz!yy&. " s   B1B6 6	CCc                D   t        j                  |      rt        j                  |      }t        j                  |      }t        |      dk(  rD|j                  dk(  r|S |j                  dkD  r$t        j                  |j                         g      S |j                         S r   )r1   _is_structured_ndarraystruct_to_ndarrayr   r   r'   r   r   )rD   r:   s     r   r   zModelData._get_yarr  sx    ++E2//6E

5!u:?zzQazz5==?"344}}r   c                    t        j                  |      rt        j                  |      }t        j                  |      S r   )r1   r   r   r   r   )rD   r<   s     r   r   zModelData._get_xarr  s/    ++D1..t4Dzz$r   c                    | j                   7t        | j                         t        | j                        k7  rt        d      y y )Nz+endog and exog matrices are different sizes)r<   r'   r:   r   r   s    r   rB   zModelData._check_integrity  s:    99 499~TZZ0 !NOO 1 !r   c                   |dk(  r| j                  |      S |dk(  r| j                  |      S |dk(  r| j                  |      S |dk(  r| j                  |      S |dk(  r| j	                  |      S |dk(  r| j                  |      S |dk(  r| j                  ||      S |dk(  r| j                  ||      S |d	k(  r| j                  |      S |d
k(  r| j                  |      S |S )Nr   rowscovdates
columns_eqcov_eqgeneric_columnsgeneric_columns_2dr   multivariate_confint)
attach_columnsattach_rows
attach_covattach_datesattach_columns_eqattach_cov_eqattach_generic_columnsattach_generic_columns_2dattach_ynamesattach_mv_confint)rD   objhowr   s       r   wrap_outputzModelData.wrap_output  s   )&&s++F]##C((E\??3''G^$$S))L ))#..H_%%c**%%..sE::((11#u==H_%%c****))#..Jr   c                    |S r   r   rD   results     r   r   zModelData.attach_columns      r   c                    |S r   r   r   s     r   r   zModelData.attach_columns_eq  r   r   c                    |S r   r   r   s     r   r   zModelData.attach_cov  r   r   c                    |S r   r   r   s     r   r   zModelData.attach_cov_eq  r   r   c                    |S r   r   r   s     r   r   zModelData.attach_rows  r   r   c                    |S r   r   r   s     r   r   zModelData.attach_dates  r   r   c                    |S r   r   r   s     r   r   zModelData.attach_mv_confint  r   r   c                    |S r   r   rD   r   argsrG   s       r   r   z ModelData.attach_generic_columns  r   r   c                    |S r   r   r   s       r   r   z#ModelData.attach_generic_columns_2d  r   r   c                    |S r   r   r   s     r   r   zModelData.attach_ynames  r   r   )Nr0   N)returnzlist[str] | None)r   N)(__name__
__module____qualname____doc__r   r   rJ   rO   rf   rA   classmethodr   r   r6   r>   r   r   r   propertyr   setterr   r
   r   r   r   r   r   rB   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r+   r+   6   s]    LJ< 2;$z   ( ( xK xKt 	  	    0 0 # #          *
 
P
0r   r+   c                      e Zd Zd Zy)	PatsyDatac                .    |j                   j                  S r   )r.   column_namesr   s     r   r   zPatsyData._get_names  s    +++r   N)r   r   r   r   r   r   r   r   r     s    ,r   r   c                       e Zd ZdZd fd	Ze fd       Ze fd       Z fdZd Z	d Z
ddZd	 Zd
 Zd Zd Zd Zd Zd Zd Z xZS )
PandasDataz^
    Data handling class which knows how to reattach pandas metadata to model
    results
    c                    t        j                  |      }||nt        j                  |      }|j                  t        k(  s||j                  t        k(  rt	        d      t
        |   ||      S )NzRPandas data cast to numpy dtype of object. Check input data with np.asarray(data).)r   r   r    objectr   superr>   rD   r:   r<   	__class__s      r   r>   zPandasData._convert_endog_exog  sh    

5!|tD)9;;& D$4v9M G H Hw*5$77r   c                n    t        |t        t        f      r|j                  |   S t        |   ||      S r   )r   r   r   locr  r   r   r   r   r  s      r   r   zPandasData._drop_nans  s2    a&),-55?"7%a22r   c                    t        |t        t        f      r |j                  |   j                  d d |f   S t        |   ||      S r   )r   r   r   r
  r  r   r  s      r   r   zPandasData._drop_nans_2d  sA    a&),-55?&&q({337(H55r   c                   | j                   | j                  }}|\t        |d      rPt        |d      rD| j                   j                  j	                  | j                  j                        st        d      t        |           y )Nindexz.The indices for endog and exog are not aligned)r;   r=   r!   r  equalsr   r  rB   r  s      r   rB   zPandasData._check_integrity  sf    oot~~t(WT7-COO))001E1EFMNN "r   c                f    	 |j                   S # t        $ r | j                  j                   cY S w xY wr   )r  r   r;   r   s     r   r   zPandasData._get_row_labels  s2    	)99 	) ??(((	)s    00c                6    t        | |d       }t        ||      S )Nr  )getattrr   )rD   r   r   r  s       r   r   z!PandasData.attach_generic_columns   s    tUD1fL11r   c                ^    |xs |}t        | |d       }t        | |d       }t        |||      S Nr  r   )r  r   )rD   r   rownamescolnamess       r   r   z$PandasData.attach_generic_columns_2d%  s7    'x440440xBBr   c                |    |j                   dk  rt        || j                        S t        || j                        S )Nr   r  )r   r   r   r   r   s     r   r   zPandasData.attach_columns+  s6     ;;!&(8(899V4+;+;<<r   c                F    t        || j                  | j                        S r  )r   r   r   r   s     r   r   zPandasData.attach_columns_eq4      t{{DKKHHr   c                F    t        || j                  | j                        S r  )r   r   r   s     r   r   zPandasData.attach_cov7  s    t~~t~~NNr   c                F    t        || j                  | j                        S r  )r   r   r   s     r   r   zPandasData.attach_cov_eq:  r  r   c                h   |j                         }t        j                  | j                  d      j                  d   }|dkD  r|j                  |fk(  r	|d d d f   }|j
                  dk  rt        |      }nt        |      }| j                  |_        | j                  t        |       d  |_        |S )Nr   ndminr   rT   )r   r   rp   r   rt   r   r   r   r   r   r'   r  )rD   r   squeezedk_endogouts        r   r   zPandasData.attach_rows=  s     >>#((4;;a066q9Q;8>>gZ7a(H==1"CF#C++CKOOS[LM2	
r   c                   |j                         }t        j                  | j                  d      j                  d   }|dkD  r,|j                  |fk(  rt        j
                  |      d d d f   }|j                  dk  rt        || j                        S t        t        j
                  |      | j                  | j                        S )Nr   r  r   rT   r  r  )
r   r   rp   r   rt   r   r   r   predict_datesr   )rD   r   r!  r"  s       r   r   zPandasData.attach_datesM  s    >>#((4;;a066q9Q;8>>gZ7zz(+D!G4H==1($*<*<==RZZ/#'#5#5%)[[2 2r   c                T    t        |j                  d      | j                  ddg      S )N)rZ   rT   lowerupperr  )r   reshaper   r   s     r   r   zPandasData.attach_mv_confintZ  s)    0#~~")7!35 	5r   c                    |j                         }|j                  dk  rt        || j                        S t	        || j                        S )NrT   )r   )r   )r   r   r   r   r   )rD   r   r!  s      r   r   zPandasData.attach_ynames_  s<    >>#==1(55VT[[99r   r   )r   r   r   r   r>   r   r   r   rB   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r  s   @r   r  r    su    
8 3 3 6 6#)2
C=IOI 25
:r   r  c                    | j                   dk(  s| j                  d   dk(  rdg}|S t        | j                  d         D cg c]
  }d|dz   z   }}|S c c}w )Nr   r$   zy%d)r   rt   range)r:   r   is      r   r   r   h  s_    zzQ%++a.A- M */u{{1~)>?A%1Q3-??M @s   Ac                T   | j                  d      }|dk(  j                         rM|j                         }t        d| j                  d         D cg c]  }d|z  	 }}|j                  |d       |S t        d| j                  d   dz         D cg c]  }d|z  	 }}|S c c}w c c}w )Nr   r   zx%dconst)varr   argminr-  rt   insert)r<   exog_varr?   r.  
exog_namess        r   r   r   q  s    xx{HA OO%	).q$**Q-)@AAeaiA
A)W-  */q$**Q-/)BCAeaiC
C B Ds   B B%c                    t        | |      }|dk(  r"t        | |      }|j                  |       |d fS  |j                  | |fd|i|S )Nr0   )r:   r<   rE   )handle_data_class_factoryr   r9   r6   )r:   r<   rE   rG   klassret_dicts         r   r6   r6     sW    %eT2E&e$/~5tGWGGGr   c                8   t        j                  | |      rt        }|S t        j                  | |      rt        }|S t        j
                  | |      rt        }|S t        j                  | |      rt        }|S t        dt        |       dt        |            )z
    Given inputs
    zunrecognized data structures: z / )
r1   _is_using_ndarray_typer+   _is_using_pandasr  _is_using_patsyr   _is_using_ndarrayr   type)r:   r<   r8  s      r   r7  r7    s     ''t4 L 
	#	#E4	0 L 
	"	"5$	/ L 
	$	$UD	1 L u+tDz3 4 	4r   c                    t        | t        t        f      rt        j                  |       } t        |t        t        f      rt        j                  |      }t        | |      } || f|||d|S )N)r<   rE   rF   )r   r   tupler   r   r7  )r:   r<   rE   rF   rG   r8  s         r   handle_datarB    sh    %$'

5!$u&zz$%eT2E T7X  r   )Nr0   )r0   N)"r   
__future__r   statsmodels.compat.pythonr   	functoolsr   numpyr   pandasr   r   r   r	   statsmodels.tools.datatoolsra   r1   statsmodels.tools.decoratorsr
   r   r3   r   r   r   r)   r+   r   r  r   r   r6   r7  rB  r   r   r   <module>rK     s{    # *   8 8 * * G <

.="t tn,	 ,
s: s:lH&	r   