B
    Z;              m   @   sp  d 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 dd ZdddZdd Zd ddZdddZdddZddddgZedkrled dZeeZd	Zeddddddddd d!d"d#g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d0lm#Z# ee#j$j%e"ed,d,d,gd dd1 edd2d3d4dd5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddgdZ&e	e&eeddd
 ed3d4dd5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddgkZ'e	e'eeddd- edddddddd d!dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddgdZ(e	e(eeddd. dS (  a  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 don't 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
    )print_functionN)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.7/site-packages/statsmodels/sandbox/tsa/movstat.py	expandarr6   s    r   med   laggedc             C   s   |dkr|d }n*|dkr d}n|dkr8| d d }nt t|dkrP|}n:|dkrf|d d }n$|d	krtd}n|d
kr|d }nt t| |}t|t|||| ||   S )al  moving order statistics

    Parameters
    ----------
    x : array
       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   Tr   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xoZttr   r   r   check_movorderk   s,    

$

r%   c             C   s   t | d||dS )a  moving window mean


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

    Returns
    -------
    mk : array
        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 )aC  moving window variance


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

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


    r   )r&   r   r   )r'   )r   r&   r   m1m2r   r   r   movvar   s    r+   c       	      C   sT  |}|dkr0d}t |d pdd|d  p*d}n|dkrp| d }t |d |d  pVd|d  |d  pjd}nL|dkr| d }t d|d  d | pdd|d  |  d pd}ntt|t| }t| |d }t| |jdkrt|| |d	| S t|j	 t|dddf j	 t
|| |dddf d	|ddf S dS )
a  non-central moment


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

    Returns
    -------
    mk : array
        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   ZslZavgkernr   r   r   r   r'      s&     
.
6
r'   __main__z!
checkin moving mean and variancer!   g        gUUUUUU?g      ?g       @g      @g      @g      @g      @g      @g       @gUUUUUU!@	   g#q?g|
q?gvWUU?gUUU@r   )r&   r   c             C   s"   g | ]}t t|t | qS r   )r	   varr   ws).0ir   r   r   
<listcomp>?  s    r6   r   r   r   z-
checking moving moment for 2d (columns only))ndimage)Zaxisg?g333333?g333333?g      ?g @gffffff@g@g      @g      @g      @g      @g      !@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@d   gW@gX@g9X@g     `X@g     X@gX@g̬X@gX@g     X@g<b\t?gq袋?gmF]@g.
@g$E]@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   )r   r   )r   r   ))__doc__Z
__future__r   Znumpyr	   Zscipyr   Znumpy.testingr   r   Zstatsmodels.apiZapiZsmr   r    r%   r(   r+   r'   __all____name__r/   Znobsr#   r   r3   ZarrayZaveZvaZc_Zave2dranger)   r*   Zx2dr7   filtersZcorrelate1dZxgZxdZxcr   r   r   r   <module>+   s   
.5S



"&