U
    ÃmœdÚ9  ã                m   @   sV  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
dÿdd„Z�d dd„Z�ddd„ZddddgZedk�rRe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d/lmZ eejj ee d+d+d+g¡d dd0�ƒ e dd1d2d3dd4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd€d�d‚dƒd„d…d†d‡dˆd‰dŠd‹dŒd�dŽd�d�d‘d’gd¡Z!ee!ee d“¡dd	ƒƒ e d2d3dd4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd€d�d‚dƒd„d…d†d‡dˆd‰dŠd‹dŒd�dŽd�d�d‘d’d”d•d–d—d˜d™dšd›dœgk¡Z"ee"ee d“¡dd,ƒƒ e d�dždŸd d¡dddd d¢d£d¤d¥d¦d§d¨d©dªd«d¬d­d®d¯d°d±d²d³d´dµd¶d·d¸d¹dºd»d¼d½d¾d¿dÀdÁdÂdÃdÄdÅdÆdÇdÈdÉdÊdËdÌdÍdÎdÏdÐdÑdÒdÓdÔdÕdÖd×dØdÙdÚdÛdÜdÝdÞdßdàdádâdãdädådædçdèdédêdëdìdídîdïdðdñdòdódôdõdöd÷dødùdúdûdügd¡Z#ee#ee d“¡dýd-ƒƒ 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 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   úX/home/sam/Atlas/atlas_env/lib/python3.8/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r8| d d }nt ‚t |¡rL|}n:|dkrb|d d }n$|dkrpd}n|d	kr‚|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   Ú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linspaceÚpiÚ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    r0   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 | pšdd|d  |  d p²dƒ}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 : 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   Néþÿÿÿr   r   r   Úfull)Úslicer   r   r   Úfloatr   Úprintr	   Z	correlater
   r   )	r   r   r*   r   r   r   Ú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ì?g“vWUUå?g¥ÝÇUUU@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)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   gš™™™™ÙW@gÍÌÌÌÌX@gš™™™™9X@g     `X@g     €X@gš™™™™™X@gÍÌÌÌÌ¬X@gš™™™™¹X@g     ÀX@g<b\tÑõ?gq§øè¢‹þ?g›¢mF]@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@gë’ÌEX@gb\tÑEX@gwŠ�.ºhX@é   )r   r   r   )r   r   )r   r   )r   r   )$Ú__doc__Únumpyr   Zscipyr   Znumpy.testingr   r   r   r    r(   r-   r0   r,   Ú__all__Ú__name__r5   Znobsr#   r   r:   ÚarrayZaveÚvaZc_Zave2dÚranger.   r/   Zx2dr>   ÚfiltersZcorrelate1dZxgZxdZxcr   r   r   r   Ú<module>   sâ  ,
.5
S

 ÿ
õÿÿÿÿ"ÿÿÿÿÿ&                                                                                õ                                                                                       õ                                                                        è