
    M/Ph9                        d Z ddlZddlmZ ddlmZmZ d Zd(d	Z	d
 Z
d)dZd)dZd)dZg dZedk    r ed           dZ ej        e          ZdZ ej        g d          Z ej        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z  f         Z e eeed                      e eeed                      ed  eee          D                         eeddd          Z eeddd          Z ee            ee            eeeez  z
              eeedz
  ddf          eedd                      eeedz  e dz  dz   df          eedd                      eede dz   df          eeed                      ed           ej        edez  f         Z e eeddd                      e eeed                      e eeed                      eeedz
  dddf          eedd                      eeedz  e dz  dz   ddf          eedd                      eede dz   ddf          eeed                      eeedz
  d          eeddd                      eeedz  e dz  dz             eeddd                      eede dz             eeed                     ddlmZ  eej                             e ej        g d           d!z  d"                      ej        g d#          Z! ee! e ej        d$          dd                      ej        g d%          Z" ee" e ej        d$          dd                      ej        g d&          Z# ee# e ej        d$          d'd                     dS 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                    |}t          j        |           dk    r|t          j        |           d         f}t           j        t          j        |          | d         z  | t          j        |          | d         z  f         S )N      r   )npndimshaper_ones)xkkadds      _/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/statsmodels/sandbox/tsa/movstat.py	expandarrr   3   sd    D	wqzzQbhqkk!n%5qt#AbgdmmAbE&99::    med   laggedc                 l   |dk    r|dz  }n |dk    rd}n|dk    r
| dz  dz   }nt           t          j        |          r|}n+|dk    r	|dz
  dz  }n|dk    rd}n|d	k    r|dz
  }nt           t          | |          }t	          j        |t          j        |          |          ||z
  ||z             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   order_filterr   )r   orderwindsizelagleadordxexts          r   movorderr&   :   s    , h{	
						y!|Q	{5 		%!|Q	%	%l Q!!DtBGH$5$5c::8D=8TX=IY;YZZr   c                     ddl m}  t          j        dd          }t	          |d          }t          ||           t          j        ddd          }t	          |d          }t          ||           t          t	          |dd	
          dd         |dd                    t          j        ddt          j        z  d          }t          j        |          dz   }t	          |d          }| 	                                 | 
                    ||d||d           |                     d           t	          |dd	
          }| 	                                 | 
                    ||d||d           |                     d           t	          |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)matplotlib.pylabpylabr
   aranger&   r   linspacepisinfigureplottitle)pltr   xotts       r   check_movorderr6   h   s   """"""
	!BA	!5	!	!	!Br1
	"QrA	!5	!	!	!Br1xJ???DaeLLL	Qqwr	"	"B
r

QA	!5	!	!	!BJJLLLHHR$r"T"""II!"""	!5j	1	1	1BJJLLLHHR$r"T"""II#$$$	!5i	0	0	0BJJLLLHHR$r"T"""II"#####r   c                 (    t          | 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   r9   r"   s      r   movmeanr<      s    2 Qjc::::r   c                 ^    t          | d||          }t          | d||          }|||z  z
  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   r8   r   r:   )r   r9   r"   m1m2s        r   movvarr@      s>    ( 
1aJC	8	8	8B	1aJC	8	8	8B2:r   c                    |}|dk    r d}t          |dz
  pdd|dz
  z  pd          }nu|dk    r.| dz  }t          |dz
  |dz  z   pd|dz
   |dz  z
  pd          }nA|dk    r4| dz   }t          d|dz
  z  dz   |z   pdd|dz
  z  |z    dz   pd          }nt          t          j        |          t	          |          z  }t          | |dz
            }t          |           |j        dk    rt          j        ||z  |d	          |         S t          |j	                   t          |dddf         j	                   t          j        ||z  |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   full)slicer   r
   r   floatr   printr   	correlater   r   )	r   r   r9   r"   r!   r#   slavgkernr%   s	            r   r;   r;      s   4 H
hHQJ'4XaZ)@DAA	
		y!|HQJ!+3txz]8Q;5N5VRVWW				y!|1hqj>!#D(0DAxzN44G2H2J2RdSSwz""5#4#44GQ
##D 
"IIIyA~~|D!GWf55b99 	djgaaafo#$$$ a4&AA"QQQ$GGr   )r&   r<   r@   r;   __main__z!
checkin moving mean and variancer(   )        gUUUUUU?      ?g       @      @g      @      @      @      @       @gUUUUUU!@	   rK   g#q?g|
q?gvWUU?gUUU@r   r8   c                 `    g | ]+}t          j        t          |t          z
  |                   ,S  )r
   varr   ws).0is     r   
<listcomp>rY   <  s.    
6
6
626!AbDF)
6
6
6r   r   r   r   z-
checking moving moment for 2d (columns only))ndimage)r   r   r   rM   )axis)drK   g?333333?333333?rL         ? @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   )kr\   r]   rL   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   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]@rN   rO   rP   rQ   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__numpyr
   scipyr   numpy.testingr   r   r   r&   r6   r<   r@   r;   __all____name__rF   nobsr,   r   rV   arrayavevac_ave2dranger>   r?   x2drZ   filterscorrelate1dxgxdxcrT   r   r   <module>r      s  * *X           G G G G G G G G; ; ;,[ ,[ ,[ ,[\$ $ $j; ; ; ;6   09H 9H 9H 9Hf 9
8
8z	E
.///D	$A	
B
"(     C	R"-*-*-*-*-*-*-*-*-*-*-"-/ 
0 
0B E#qu*E	E''!
1
1
1222	E&&rx
0
0
0111	E
6
6eeBoo
6
6
6777	1aA8	4	4	4B	1aA8	4	4	4B	E"III	E"III	E"r"u* bAqkF1	:::< < <bQsAvax!12F1
;;;= = =b2#a%lF1:::< < <
 
E
:;;;
%1Q3-C	E))Cqj
9
9
9:::	E''#"(
3
3
3444	E&&
2
2
2333bAqqqkF31)<<<> > >bQsAvax!12F31*===? ? ?b2#a%lF328<<<> > > eBqDEElIc1	BBBD D DeBE2#q&(N3Ic1
CCCE E EeFbSUFmGCBH===? ? ? 	E'/
%
%c828GGG+<+<R+?a
%
H
HIII
 
    
 
B b'')")C.."X"F"FGGG	 G G G 
H 
HB b'')")C.."Y"G"GHHH	 G G G 
H 
HB2 b'')")C.."Z"H"HIIIIIo r   