o
    0Gf9                     @   s  d Z ddlZddlmZ ddlmZmZ dd Zd/d
dZ	dd Z
d0ddZd0ddZd0ddZg dZedkred dZeeZdZeg dZeddgddgddgddgddgddgddgddgddgddgddgddggZejede f Zeeeed	d eeeed	d ed d! eeeD  eed"dd	dZeeddd	dZee ee eeee   eeed" ddf eedd#d eeed e d d" df eedd$d eede d" df eeed	d ed% ejede f Zeeed"dd$d eeeed	d eeeed	d eeed" dddf eedd#d eeed e d d" ddf eedd$d eede d" ddf eeed	d eeed" d eed"dd#d eeed e d d"  eed"dd$d eede d"  eeed	d dd&lmZ eejj eeg d'd( dd) eg d*Z!ee!eed+dd	 eg d,Z"ee"eed+dd# eg d-Z#ee#eed+d.d$ dS dS )1a  using scipy signal and numpy correlate to calculate some time series
statistics

original developer notes

see also scikits.timeseries  (movstat is partially inspired by it)
added 2009-08-29
timeseries moving stats are in c, autocorrelation similar to here
I thought I saw moving stats somewhere in python, maybe not)


TODO

moving statistics
- filters do not handle boundary conditions nicely (correctly ?)
e.g. minimum order filter uses 0 for out of bounds value
-> append and prepend with last resp. first value
- enhance for nd arrays, with axis = 0



Note: Equivalence for 1D signals
>>> np.all(signal.correlate(x,[1,1,1],'valid')==np.correlate(x,[1,1,1]))
True
>>> np.all(ndimage.filters.correlate(x,[1,1,1], origin = -1)[:-3+1]==np.correlate(x,[1,1,1]))
True

# multidimensional, but, it looks like it uses common filter across time series, no VAR
ndimage.filters.correlate(np.vstack([x,x]),np.array([[1,1,1],[0,0,0]]), origin = 1)
ndimage.filters.correlate(x,[1,1,1],origin = 1))
ndimage.filters.correlate(np.vstack([x,x]),np.array([[0.5,0.5,0.5],[0.5,0.5,0.5]]), origin = 1)

>>> np.all(ndimage.filters.correlate(np.vstack([x,x]),np.array([[1,1,1],[0,0,0]]), origin = 1)[0]==ndimage.filters.correlate(x,[1,1,1],origin = 1))
True
>>> np.all(ndimage.filters.correlate(np.vstack([x,x]),np.array([[0.5,0.5,0.5],[0.5,0.5,0.5]]), origin = 1)[0]==ndimage.filters.correlate(x,[1,1,1],origin = 1))


update
2009-09-06: cosmetic changes, rearrangements
    N)signal)assert_array_equalassert_array_almost_equalc                 C   sP   |}t | dkr|t | d f}t jt || d  | t || d  f S )N      r   )npndimshapeZr_ones)xkZkadd r   ?lib/python3.10/site-packages/statsmodels/sandbox/tsa/movstat.py	expandarr3   s   ,r   med   laggedc                 C   s   |dkr	|d }n|dkrd}n|dkr| d d }nt t|r&|}n|dkr1|d d }n|dkr8d}n|d	krA|d }nt t| |}t|t|||| ||   S )
an  moving order statistics

    Parameters
    ----------
    x : ndarray
       time series data
    order : float or 'med', 'min', 'max'
       which order statistic to calculate
    windsize : int
       window size
    lag : 'lagged', 'centered', or 'leading'
       location of window relative to current position

    Returns
    -------
    filtered array


    r   r   centeredr   leadingr   r   minmax)
ValueErrorr   Zisfiniter   r   Zorder_filterr   )r   orderwindsizelagleadordxextr   r   r   movorder:   s$   



&r   c                  C   s6  ddl m}  tdd}t|dd}t|| tddd}t|dd}t|| tt|dd	d
dd |dd  tddtj d}t|d }t|dd}| 	  | 
||d||d | d t|dd	d
}| 	  | 
||d||d | d t|ddd
}| 	  | 
||d||d | d dS )zgraphical test for movorderr   Nr   
   r   )r   r   r   r   )r   r   r      z.-zmoving max laggedzmoving max centeredr   zmoving max leading)Zmatplotlib.pylabZpylabr   aranger   r   ZlinspaceZpiZsinZfigureZplottitle)Zpltr   Zxottr   r   r   check_movorderh   s,   

$

r%   c                 C   s   t | d||dS )a  moving window mean


    Parameters
    ----------
    x : ndarray
       time series data
    windsize : int
       window size
    lag : 'lagged', 'centered', or 'leading'
       location of window relative to current position

    Returns
    -------
    mk : ndarray
        moving mean, with same shape as x


    Notes
    -----
    for leading and lagging the data array x is extended by the closest value of the array


    r   
windowsizer   	movmoment)r   r'   r   r   r   r   movmean   s   r*   c                 C   s,   t | d||d}t | d||d}|||  S )aG  moving window variance


    Parameters
    ----------
    x : ndarray
       time series data
    windsize : int
       window size
    lag : 'lagged', 'centered', or 'leading'
       location of window relative to current position

    Returns
    -------
    mk : ndarray
        moving variance, with same shape as x


    r   r&   r   r(   )r   r'   r   m1m2r   r   r   movvar   s   r-   c           	      C   sN  |}|dkrd}t |d pdd|d  pd}nF|dkr8| d }t |d |d  p+d|d  |d  p5d}n&|dkr\| d }t d|d  d | pMdd|d  |  d pYd}ntt|t| }t| |d }t| |jdkrt|| |d	| S t|j	 t|dddf j	 t
|| |dddf d	|ddf S )
a  non-central moment


    Parameters
    ----------
    x : ndarray
       time series data
    windsize : int
       window size
    lag : 'lagged', 'centered', or 'leading'
       location of window relative to current position

    Returns
    -------
    mk : ndarray
        k-th moving non-central moment, with same shape as x


    Notes
    -----
    If data x is 2d, then moving moment is calculated for each
    column.

    r   r   r   Nr   r   r   Zfull)slicer   r   r   floatr   printr	   Z	correlater
   r   )	r   r   r'   r   r   r   slZavgkernr   r   r   r   r)      s&    
.
6

*r)   )r   r*   r-   r)   __main__z!
checkin moving mean and variancer    )        gUUUUUU?      ?g       @      @g      @      @      @      @       @gUUUUUU!@	   r4   g#q?g|
q?gvWUU?gUUU@r   r&   c                 C   s"   g | ]}t t|t | qS r   )r   varr   ws).0ir   r   r   
<listcomp><  s   " r@   r   r   r   z-
checking moving moment for 2d (columns only))ndimage)r   r   r   r6   )Zaxis)dr4   g?333333?333333?r5         ? @ffffff@@      @      @      @      @      !@      #@      %@      '@      )@      +@      -@      /@     0@     1@     2@     3@     4@     5@     6@     7@     8@     9@     :@     ;@     <@     =@     >@     ?@     @@@     @@     @A@     A@     @B@     B@     @C@     C@     @D@     D@     @E@     E@     @F@     F@     @G@     G@     @H@     H@     @I@     I@     @J@     J@     @K@     K@     @L@     L@     @M@     M@     @N@     N@     @O@     O@      P@     `P@     P@     P@      Q@     `Q@     Q@     Q@      R@     `R@     R@     R@      S@     `S@     S@     S@      T@     `T@     T@     T@      U@     `U@     U@     U@      V@     `V@     V@     V@      W@     `W@     W@d   )krB   rC   r5   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   gW@gX@g9X@g     `X@g     X@gX@g̬X@gX@g     X@)dg<b\t?gq袋?gmF]@g.
@g$E]@r7   r8   r9   r:   g      "@g      $@g      &@g      (@g      *@g      ,@g      .@g      0@g      1@g      2@g      3@g      4@g      5@g      6@g      7@g      8@g      9@g      :@g      ;@g      <@g      =@g      >@g      ?@g      @@g     @@g      A@g     A@g      B@g     B@g      C@g     C@g      D@g     D@g      E@g     E@g      F@g     F@g      G@g     G@g      H@g     H@g      I@g     I@g      J@g     J@g      K@g     K@g      L@g     L@g      M@g     M@g      N@g     N@g      O@g     O@g      P@g     @P@g     P@g     P@g      Q@g     @Q@g     Q@g     Q@g      R@g     @R@g     R@g     R@g      S@g     @S@g     S@g     S@g      T@g     @T@g     T@g     T@g      U@g     @U@g     U@g     U@g      V@g     @V@g     V@g     V@g      W@g     @W@g     W@g⣋.W@g٧뢋W@gEX@gb\tEX@gw.hX@   )r   r   r   )r   r   )$__doc__Znumpyr   Zscipyr   Znumpy.testingr   r   r   r   r%   r*   r-   r)   __all____name__r1   Znobsr"   r   r=   ZarrayZaveZvaZc_Zave2dranger+   r,   Zx2drA   filtersZcorrelate1dZxgZxdZxcr   r   r   r   <module>   s    ,
.
5

S


"$