U
    mdW
                    @   sP  d Z ddlmZ ddlZddlZddlZddlZddlm	Z	m
Z
 ddlZddlZddlZddlmZmZ ddlmZmZmZmZmZ ddlmZmZ ddlmZmZmZ ej !ej "e#\Z$Z%ej&ej 'e$d	d
dddZ(e()dZ(dZ*dZ+ddddddddddddddddd d!d"d#d$d%d&d'gZ,d(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?gZ-e.e-Z/ej0e,ej1e/e2e/d@dAZ3ej4dBdCdDdE Z5ddFdGZ6G dHdI dIZ7ej89dJdKdLdM Z:ej89dNe*dOdP Z;ej89dNdQdRdS Z<dTdU Z=dVdW Z>ej89dXe+ej89dNe*dYdZ Z?d[d\ Z@d]d^ ZAd_d` ZBdadb ZCej8jDej89dXe+ej89dNe*dcdd ZEej89dXe+ej89dNe*dedf ZFdgdh ZGdidj ZHdkdl ZIdmdn ZJej4dodp ZKej4dqdr ZLej4dsdt ZMej89dXe+ej89dNe*ej89dudvej89dwdQdxdy ZNdzd{ ZOd|d} ZPej89d~ddddgdd ZQdd ZRdd ZSdd ZTej89ddddddddgdd ZUdd ZVej89ddddgdddgdddggdd ZWej89ddddgdddgdddggdd ZXdd ZYdd ZZdd Z[dd Z\ej89dXddgej89dNddgdd Z]dd Z^dd Z_dd Z`ej89ddddgej89dXddgej89dNddgdd Zadd Zbdd Zcdd Zdej89dddddgddń ZeddǄ Zfej89dddgej89dddgdd̈́ Zgej89dXddgej89dNddgej89dddgddф Zhddӄ ZiddՄ Zjddׄ ZkdS )z4
Author: Terence L van Zyl
Modified: Kevin Sheppard
    )pytest_warnsN)assert_allcloseassert_almost_equal)ConvergenceWarningValueWarning)PY_SMOOTHERS	SMOOTHERSExponentialSmoothingHoltSimpleExpSmoothing)HoltWintersArgs_test_to_restricted)r   to_restrictedto_unrestrictedresultszhousing-data.csvZDATET)Z	index_colZparse_datesMSaddmulNgVWD@gmV}
8@g\sG)@@gB@gHG@g'ҨX=@gt=B@gl%}E@ga+esH@gk".?@gLB@g5[y5D@gP|zI@gr_!?@gӸ7}D@g(.E@gϚK@gV`@@g5|	E@g=ϟ6F@g
%M@gclA@g)[$(F@gĖMG@z2005-03-01 00:00:00z2005-06-01 00:00:00z2005-09-01 00:00:00z2005-12-01 00:00:00z2006-03-01 00:00:00z2006-06-01 00:00:00z2006-09-01 00:00:00z2006-12-01 00:00:00z2007-03-01 00:00:00z2007-06-01 00:00:00z2007-09-01 00:00:00z2007-12-01 00:00:00z2008-03-01 00:00:00z2008-06-01 00:00:00z2008-09-01 00:00:00z2008-12-01 00:00:00z2009-03-01 00:00:00z2009-06-01 00:00:00z2009-09-01 00:00:00z2009-12-01 00:00:00z2010-03-01 00:00:00z2010-06-01 00:00:00z2010-09-01 00:00:00z2010-12-01 00:00:00freqindexmodule)scopec                  C   s   t jd} | d}| }tddD ],}||d  ||  d||d    ||< q(|dd  }tjd|jd dd}tj	||d	d
S )Nr   i     皙?   2000-1-1Mperiodsr   y)r   name)
nprandomRandomStatestandard_normalcopyrangepd
date_rangeshapeSeries)rser"   ir    r1   k/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/statsmodels/tsa/holtwinters/tests/test_holtwinters.pysesg   s    
*r3   c                 C   s\  | j d }t|}t|}t|}	t|}
||d< ||d< || |	d< || d  d| ||   |d< ||d |  d| |  |d< td|D ]d}|| |  d| ||d  ||d     ||< ||| ||d    d| ||d    ||< q|dd |dd  |	dd< |d td|d |d   |
dd< | |	 }|||
||	fS )zQ
    Simple, slow, direct implementation of double exp smoothing for testing
    r   r   N)r,   r$   zerosr)   arange)xalphabetal0b0	nforecastnZlvalsbxhatfterrr1   r1   r2   _simple_dbl_exp_smoothers   s"    




  02 (rC   c                   @   s   e Zd Zedd Zdd Zdd Zejj	ddd	d
d Z
dd Zdd Zejjdd Zdd Zdd Zdd Zdd ZdS )TestHoltWintersc                 C   s  ddddddddd	d
ddg}ddddddddddddg}t ||}t j|jt |jd|_|| _ddddddd d!d"d#d$d%d&d'd(g}d)d*d+d,d-d.dddddddddg}t ||}t j|jt |jd|_|| _d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMg}dNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dad)d*d+d,d-d.dddddg}t ||}t j|jt |jd|_|| _t| _dbdcdddedfdgdhdidjg	| _	d S )kN4	({@g'֩g|@gz|@g2nzz@g[W|@g8h{@g4 Rz@gK/{#dR~@gFEŠ@g#WUv@gF&@g2U`~@z1996-12-31 00:00:00z1997-12-31 00:00:00z1998-12-31 00:00:00z1999-12-31 00:00:00z2000-12-31 00:00:00z2001-12-31 00:00:00z2002-12-31 00:00:00z2003-12-31 00:00:00z2004-12-31 00:00:00z2005-12-31 00:00:00z2006-12-31 00:00:00z2007-12-31 00:00:00r   g=U1@#J{/5@g477@g=,Ԛ:@g~jt:@ga<@g9>@gjt>@g	/>@g}8g?@gzI@@g`@@g*ÂC@g^vD@g.[D@z1990-12-31 00:00:00z1991-12-31 00:00:00z1992-12-31 00:00:00z1993-12-31 00:00:00z1994-12-31 00:00:00z1995-12-31 00:00:00g	pz~p@gʩap@gLQԙJp@gj;p@gn@Xq@gG?Xq@gX$r@gB]PGr@gʅJr@g%Ts@g;5Ls@gu7Ot@g;$.u@g!3u@gL0t@g9s@g($Zs@gX֞t@gt@giƢ)u@gv@g"u@g/z@gDL$z@gkz@guy@g$)&y@g}8'x@gy@g@Sy@g@y@z1970-12-31 00:00:00z1971-12-31 00:00:00z1972-12-31 00:00:00z1973-12-31 00:00:00z1974-12-31 00:00:00z1975-12-31 00:00:00z1976-12-31 00:00:00z1977-12-31 00:00:00z1978-12-31 00:00:00z1979-12-31 00:00:00z1980-12-31 00:00:00z1981-12-31 00:00:00z1982-12-31 00:00:00z1983-12-31 00:00:00z1984-12-31 00:00:00z1985-12-31 00:00:00z1986-12-31 00:00:00z1987-12-31 00:00:00z1988-12-31 00:00:00z1989-12-31 00:00:00g^>g{%j C<g@>g&HI@gV{6?gҏB?g*|	W?gfv?g?)
r*   r-   DatetimeIndexr   
infer_freqoildata_oil
air_ausairlivestock2_livestockauststart_params)clsdatar   rI   rJ   rK   r1   r1   r2   setup_class   s.    
 
"!
zTestHoltWinters.setup_classc                 C   sx   t | jdddddj| jd}t | jdddddj| jd}t|ddd	d
ddgd t|jddd	d
ddgd d S )N   r   r   	estimatedseasonal_periodstrendseasonalinitialization_methodrM   z2011-03-01 00:00:00z2011-12-01 00:00:00笭_vN@9vB@q{G@ڊeI@   )end)r	   rL   fitrM   r   predict)selffit1fit2r1   r1   r2   test_predict8  s8    




zTestHoltWinters.test_predictc                 C   s>   t | jjdddddj| jd}t|dddd	d
gd d S )NrQ   r   r   rR   rS   rX   rY   rZ   r[   r\   r]   )r	   rL   valuesr_   rM   r   forecastra   rb   r1   r1   r2   test_ndarrayY  s     
 zTestHoltWinters.test_ndarrayzOptimizer does not convergeF)reasonstrictc                 C   s<   t | jddddjddd}t|jdddd	d
dgd d S )NrQ   r   )rT   rU   rV   ZbhT)method	use_bruteZstepsg9#zN@g/lB@gaG@gHI@r]   r	   rL   r_   r   rf   rg   r1   r1   r2   test_forecastf  s     
 
 zTestHoltWinters.test_forecastc                 C   s   t | jddjddd}t | jddjddd}t | jdd }t|dd	gd
 t|jddddddddddddgd
 t|ddgd
 t|ddgd
 t|jd dd
 t|jd dd d S )Nlegacy-heuristicrW   r   F	optimized333333?rR   r   gbL~@rQ   rE   gO~|@g>V|@gAV{@g=0{@g{@g9D{@g2\=$|@gV|@gsY}@g@{`4'~@gsL~@gj=f]@gBX@smoothing_levelgc??initial_levelg{@r]   )r   rI   r_   r   rf   levelparamsra   rb   rc   fit3r1   r1   r2   test_simple_exp_smoothingr  sP         
z)TestHoltWinters.test_simple_exp_smoothingc                 C   s  t | jddjdddd}t | jdddjdddd}t | jdd	d
jddd}t|ddddddgd t|jdddddddddddddd d!gd" t|jd#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2gd" t|dd3d4d5d6d7gd t|dd8d9d:d;d<gd d S )=Nrp   rq   皙?r   F)ru   smoothing_trendrs   T)exponentialrW   rR   damped_trendrW   ru   r}      gzGE@gQF@gףp=
G@g(\H@ǧI@   gH@gTHt@g#nЬ
@g)r)	@g涷:@g(j@g{{@gi}Z?gi@[?gx?g3`|?g3&A?gu++l?g @g`Nb?rQ   rF   goDI6@gm|9@ghTc;@g~I>@gRB>@gKH{ʔ?@g]S L@@gA@@gh4?"@@gk@@g6@@gG3ywcA@gD@gYOE@gSWE@gLF@gQG@gQI@gzGJ@g33333L@glE@gHzE@gGzTF@gGzF@gHzG@)r
   rJ   r_   r   rf   rU   fittedfcastry   r1   r1   r2   	test_holt  s                zTestHoltWinters.test_holtc                 C   s  t | jdd }t| jddd}|jddd}t| jdddd}| }t|jd	 d
d t|jd tjd t|jd tjd t|jd dd t|jd tjd t|jdd t	|
  tstt|jd	 dd t|jd dd t|jd dd t|jd dd t|jd dd t|jdd t	|
  tsNtt|jd	 dd t|jd dd t|jd dd t|jd dd t|jd dd t|jdd t	|
  tstd S )NrR   rq   Tr   \(\?least_squares)damping_trendrk   )r~   r   rW   ru         ?r   r}   r   rv   g(\p@r   initial_trendgYi@        g(\p@g(\@g(\@g
ףp=
?g33333/p@gp=
ף?g     ·@r   )r   rK   r_   r
   r   rx   r$   NaNsse
isinstancesummaryas_textstrAssertionError)ra   rb   mod4fit4Zmod5Zfit5r1   r1   r2   test_holt_damp_fit  sL     
z"TestHoltWinters.test_holt_damp_fitc           	       C   sT  t | jddd}dddddd	}|| |jd
d}W 5 Q R X | D ]}t|j| ||  qJ|| |jdd}W 5 Q R X t|j|j t|jd |d  dd | D }|| |jdd}W 5 Q R X t	
|jd |jd rtt|j|j 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/d0d1d2g }tt	j|jd3 |jf | d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSg }tt	j|jd |jf |dd dTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrg}t|j|dd dsdtdudvdwdxdydzd{d|g
}t|d}|d~d d S )NTrR   r   gl9+?gG:?r   g<΍o@g"&R@)ru   r}   r   rv   r   Frr   r   c                 S   s   i | ]\}}d |kr||qS )rw   r1   ).0kvr1   r1   r2   
<dictcomp>"  s       z4TestHoltWinters.test_holt_damp_r.<locals>.<dictcomp>r   gXnh@MbP?ZatolgOύo@g!0|p@gkp@g-2Pp@gpnp@g
MGUVq@g05q@g%v$r@gjOIr@gd?r@gM&fcSs@gs@g۰t@g{U,u@gu%5u@g	hB4t@g yKs@gg#Us@gR}t@g7t@g|a&#u@gv@gnau@gW$y@ge:z@gEz@gZy@gWJ]	y@gxw? x@gAy@gV'dy@g-?y@rv   gկR@g%l@gHGr|@gI0n@gRv@g.[Pn@g"t@gN1@gaq|@gis@g&צ@gLh@g4x`(@gȌW<@gg\Lq@g$"aDc@g@gmȈ@gvi~2.@gDkA@g1P?m@gM@g)H>ı@g<P]@g?đ@gv*"@gbt<7V@gq쳒@g.\@gs@g\' @g&A@gNe5p@gݽ+p@g+R-q@gw3)Yp@g]%{[q@gB'q@gq]r@gHr@gC&0r@gXEz&s@g'ѫs@gZ1x:t@guhՅt@gHu@gzru@gVt@g1s@g1V;s@g`t@gZBt@gN_u@gAHrJv@g|Dv@g!8Bz@gPUz@g7^z@g7Wz@gYEy@g(xx@g;Sy@gKry@gmz@gBuR{Uz@gLz@g'؅z@gA9z@g+O4-{@g2tGw`{@gFXi{@gGP{@g(/{@
   -C6?)r
   rK   
fix_paramsr_   keysr   rx   r   itemsr$   ZallcloserU   r   nobsr_rw   fittedvaluesrf   )	ra   modrx   r_   keyZopt_fitZ
alt_paramsZalt_fitZdesiredr1   r1   r2   test_holt_damp_r  s     "#  !z TestHoltWinters.test_holt_damp_rc              
   C   sD   t | jdddddd}| }t|dddd	d
ddddgd d S )NrQ   additiverR   TrT   rU   rV   rW   
use_boxcox   g{GM@gq=
ףPC@g=
ףpG@gRI@gHzgO@g     D@gHzI@g)\HK@r   rn   )ra   r   rb   r1   r1   r2   test_hw_seasonal  s    z TestHoltWinters.test_hw_seasonalc              
   C   sx   t | jdddddd}| }t|ddd	d
dddddgd t | jdddddd  t | jdddddd  d S )NrQ   r   r   rR   Tr   r   gQN@g(\B@g\(G@gp=
J@gQEP@gQC@g\(H@gQeK@r   r   Zmultiplicativern   )ra   Zmod2rc   r1   r1   r2   test_hw_seasonal_add_mul  s<    
z(TestHoltWinters.test_hw_seasonal_add_mulc              
   C   sx   t | jddddd }t|dddd	d
ddd	d
gd t | jddddd }t|dddddddddgd d S )NrQ   r   rR   T)rT   rV   rW   r   r   gx=\M@g*8 "A@gLF@gl^Y-G@r   r   g{zM@g5A@g6 F@gG@rn   )ra   rz   r   r1   r1   r2   test_hw_seasonal_buggy  sP    



z&TestHoltWinters.test_hw_seasonal_buggyN)__name__
__module____qualname__classmethodrP   rd   rh   pytestmarkZxfailro   r{   r   smoker   r   r   r   r   r1   r1   r1   r2   rD      s    
 *!
"C
+ 0#rD   trend_seasonal))r   N)Nr   )r   r   c              	   C   s>   | \}}t d }tt t|||dd W 5 Q R X d S )Nd   r   )rU   rV   rT   )r$   onesr   raises
ValueErrorr	   )r   rU   rV   r"   r1   r1   r2   test_negative_multipliative  s       r   rV   c              	   C   s,   t t ttd| ddd W 5 Q R X d S )NFTr   )rU   rV   r   rT   )r   r   	TypeErrorr	   housing_data)rV   r1   r1   r2   test_dampen_no_trend  s    r   )r   r   c              	   C   sJ   t jtd t jddddd}tt t|| dd W 5 Q R X d S )Nr   r   r   r    r   r   )rV   rT   )	r*   r-   r$   r   r+   r   r   r   r	   )rV   r"   r1   r1   r2   test_invalid_seasonal*  s    
 r   c                	   C   s4   t t  ttjttgdd  W 5 Q R X d S )Nr   Zaxis)r   r   r   r	   r*   concatr   r_   r1   r1   r1   r2   test_2d_data3  s    r   c               	   C   sr   t  } t| j| _tjdd:}t| dddd}t|dksBtdt	|d ksVtW 5 Q R X |j
d	ksntd S )
NT)recordr   rR   rU   rV   rW   r   r   r      )r   r(   listr   warningscatch_warningsr	   lenr   r   rT   )Zhd2wr   r1   r1   r2   test_infer_freq:  s       r   rU   c                 C   sl   t t| |dd}| }|jddddiid}t|  tsDt|jd|j k sXtt|j	t
shtd S )	NrR   r   basinhoppingminimizer_kwargsrk   SLSQPrk   minimize_kwargsg)\(?)r	   r   r_   r   r   r   r   r   r   rx   dict)rU   rV   r   resres2r1   r1   r2   test_start_paramsF  s    
r   c                  C   s$   t ttjd dd} | jdd d S )Nr   knownrv   rW         ?ru   )r	   r   ilocr_   r   r1   r1   r2   test_no_params_to_optimizeY  s    r   c               	   C   s:   t tdd} tt | jtdgd W 5 Q R X d S )NrR   rq   r   rX   )r	   r   r   r   r   r_   r$   arrayr   r1   r1   r2   test_invalid_start_param_lengthb  s    r   c                 C   s   t tddd}| }|jdd}t|  ts8tt|  tsNtd}|j|j| ksft|jdd}t	|j|jdd d S )	Nr   rR   rU   rW   r   rk   gh㈵>r   )decimal)
r	   r   r_   r   r   r   r   r   r   r   )reset_randomstater   r   r   ZtolZres3r1   r1   r2   test_basin_hoppingh  s      r   c                  C   s   t tddd} |  }| jdd}t|j|jks8ttjd d df |j }t|	 d t
|  tsttt
|  tstd S )Nr   rR   r   T)Zremove_biasr   r   )r	   r   r_   r$   anyr   r   r   r   meanr   r   r   r   )r   r   r   Zerr2r1   r1   r2   test_debiasedw  s      r   c                 C   sN   t t| |ddd }t|jd d t t| |dd }t|jd d d S )NrR   r   )rU   rV   rW   r   r   )rU   rV   r   )r	   r   r_   r   rx   )rU   rV   r   r1   r1   r2   test_float_boxcox  s    

r   c                 C   sx  t t| |dd}| }t|  ts.t|j}tj	d }t
t
t}|rVdnd}t
d| }|d }	|d }
|d }|d	 }t
|rd
n|}|d }|d }|	|
||||f|d d< |r|d |dd < t
|t}| }t
dd
ggd }t|| f }t|| f }t||||||d}t||||||d}|||}|||}t|| |||}t|| d S )NrR   r   r   r      ru   r}   smoothing_seasonalr   r   rv   r   initial_seasonsr   r]   F)r	   r   r_   r   r   r   r   r   rx   r,   r$   squeezeasarrayr5   isnanZ	ones_likeastypeintr(   r   r   r   PyHoltWintersArgsr   r   )rU   rV   r   r   rx   r   r"   mpr8   r9   gammaphir:   r;   xiZp_copyboundsZpy_funcZcy_funcZ
py_hw_argsZ
cy_hw_argsZsse_cyZsse_pyr1   r1   r2   test_equivalence_cython_python  sF    




r   c            
      C   s  t tdd} |  }t|  ts*tt	t
| j}|jd }t||d|jd ddd\}}}}}t||j t||jjd td  t||d ttd	dd
} |  }t	t
| j}|jd }|jd }	t|||	|jd |jd dd\}}}}}t||j t|| |j|j  t||j t||j t||jjd |jjd tdddddg   t||d t|  tstd S )NrR   rq   ru   r   rv   r   )r9   r:   r;   r<   r4   r   r   r}   r   r   r   r]   rQ   )r   r   r_   r   r   r   r   r   r$   r   r   endogrx   rC   r   rw   r   r   rf   r	   r   rU   r   )
r   r   r7   r8   lr>   r@   _r?   r9   r1   r1   r2   test_direct_holt_add  sV    
       

	 *r   c                 C   sv   t jd}d|d }t |d d df }||d d df  }|t}t|ddd }|j	d	 d
ksrt
d S )Ni90  r   )  r   r   r   r   rR   r   ru   r   )r$   r%   r&   r'   cumsumr   r   r	   r_   rx   r   )r   r.   r/   Zy_starr"   r   r1   r1   r2   test_integer_array  s    
  
r   c                  C   s   t d} t| dddd}|jdddd	}|jd
d}t|t jdt df dd |jddd
d	}|jd
d}t|t jdt df dd t||dd d S )Nr   r   TrR   rU   r   rW   r   r   g#B;)ru   r}   r   r   )start	   g|=r   )r$   r6   r	   r_   r`   r   r   )r   r   Zres1Zpred1r   Zpred2r1   r1   r2   test_damping_trend_zero  s    
r   c            
      C   sT  dddddg} t jdt| d}t | |}dd	d
ddg}t jdt|d}t ||}t| dd }t|dd }t|dd }t|dd }	t| dgd t|jddddddgd t| dgd t|jddddddgd t| dgd t|jddddddgd t|	 dgd t|	jddddddgd d S )Nr         (   2   r   )r   r!   r   rQ   r          r   )rU   r   <   r   r      )r   r^   F   P   z2000-1-6z2000-1-8@         )r*   r+   r   r-   r	   r_   r   r`   )
Zarray_input_addZseries_index_addZseries_input_addZarray_input_mulZseries_index_mulZseries_input_mulrb   rc   rz   r   r1   r1   r2   test_different_inputs  s@          r  c               D   C   s   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/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDgD} t jdEdFdGdH}t | |S )INgKq>@gt&3@g(D!TQ9@g֋h;@gp	@@gQ|7@g.4y<@gp=
׏A@g,	PSkB@gj9@g0>@gE_A<@gRB@g^7@g9ѮBO=@g!A	3?@gfNĖA@g v3@g5^I=@gi㈵DA@g&SD@g+p:@gduG<@gPkwA@g5SE@gYO08@gekU@@gDB@gIKF@gY=@gcz,B@gm2D@gl	gH@gQIF?@gqB@gиp $kC@g6<RI@gz6?@goeD@gʡEfE@g\K@g\r)@@gM֨(E@gF@gKM@g"-kA@g@ٔ+kF@gQ|G@gJ5oN@gvӂ/C@g |G@g(]I@gaۢN@gnnLOXC@g_5UJ@gC5v*K@gE|'fP@gMg'oD@göEI@gI)L@g5{PP@gՇE@gol`aK@gM@g-sPR@g*G@gC4N@g3dP@z
1999-03-01
2015-12-01Z3MSr   )r*   r+   r-   )rO   r   r1   r1   r2   austourists/  s    Fr  c                  C   s   ddddgddddgd	d
ddgddddgddddgddddgddddgd} ddd d!gd"d#d$d%gd&d'd(d)gd*d+d,d-gd.d/d0d1gd2d3d4d5gd6d7d8d9gd:d;d<d=gd>d?d@dAgdBdCdDdEgdFdGdHdIgdJdKdLdMgdN}| |dOS )Pa  
    obtained from ets.simulate in the R package forecast, data is from fpp2
    package.

    library(magrittr)
    library(fpp2)
    library(forecast)
    concat <- function(...) {
      return(paste(..., sep=""))
    }
    error <- c("A", "M")
    trend <- c("A", "M", "N")
    seasonal <- c("A", "M", "N")
    models <- outer(error, trend, FUN = "concat") %>%
      outer(seasonal, FUN = "concat") %>% as.vector
    # innov from np.random.seed(0); np.random.randn(4)
    innov <- c(1.76405235, 0.40015721, 0.97873798, 2.2408932)
    params <- expand.grid(models, c(TRUE, FALSE))
    results <- apply(params, 1, FUN = function(p) {
      tryCatch(
        simulate(ets(austourists, model = p[1], damped = as.logical(p[2])),
                 innov = innov),
        error = function(e) c(NA, NA, NA, NA))
    }) %>% t
    rownames(results) <- apply(params, 1, FUN = function(x) paste(x[1], x[2]))
    guS@gS\U]YJ@g('UHuP@g҇Q@g~ƅ!i@g%Ca@grto@glg@gMۿj@gI)_@gJvlp@g@gvT5Ak@guYLl>`@gq@Ȱq@g{@gOIAO@gyuN@gfc]ܒO@g48EGP@g{e@g3dV@g-`@g'm@gGZ*oGd@gx&1V@g"~`@g tm@AAAMAAMAMMMMAANMANMMNgjMFS@g"I@gxP@gkCQ@gui'j@g#bJ$b@g~p@geN@g.!ES@g+j0I@g@H0P@gVCvQ@g'i@gy-e@gqs@g8ψ@gq=
ףj@g_LZ@gzsj@gqq~@gsk@gVyc@gQ3y@gc('U@gQj@g\mŝa@gc]^s@geX@gvöEO@g89@O@ghUP@gEBP@g됛e@g(
<V@g	m9`@g=Ul@g|гY<e@gUMuUX@ga@g=o@gq $DN@gS"^M@glV}N@gpqN@g/$`d@gCR%\@g	e@g됛/u@r  r  ZANAZMNAr  r  ZMNMr  r  r  ZANNZMNNTFr1   dampedZundampedr1   r1   r2   simulate_expected_results_r}  s,    



















r  c                  C   sZ  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+t jd,d-d.t jt jt jt jd
d/d0t jd1d2d3t jt jt jt jd
d4d5t jd6d7d8t jt jt jt jd
d9} d:d;d<t jd=d>d?d@dAdBd
dCdDdEt jdFdGdHdIdJdKd
dLt jdMt jdNt jdOdPdQdRd
dSt jdTt jdUt jdVdWdXdYd
dZd[d\t jd]d^d_d`dadbd
dcdddet jdfdgdhdidjdkd
dlt jdmt jdnt jdodpdqdrd
dsdtt jt jdudvt jt jt jt jd
dwdxt jt jdydzt jt jt jt jd
d{d|t jt jd}d~t jt jt jt jd
dt jt jt jdt jt jt jt jt jd
dt jt jt jdt jt jt jt jt jd
d}| |dS )a  
    The final state from the R model fits to get an exact comparison
    Obtained with this R script:

    library(magrittr)
    library(fpp2)
    library(forecast)

    concat <- function(...) {
      return(paste(..., sep=""))
    }

    as_dict_string <- function(named) {
      string <- '{'
      for (name in names(named)) {
        string <- concat(string, """, name, "": ", named[name], ", ")
      }
      string <- concat(string, '}')
      return(string)
    }

    get_var <- function(named, name) {
      if (name %in% names(named))
        val <- c(named[name])
      else
        val <- c(NaN)
      names(val) <- c(name)
      return(val)
    }

    error <- c("A", "M")
    trend <- c("A", "M", "N")
    seasonal <- c("A", "M", "N")
    models <- outer(error, trend, FUN = "concat") %>%
      outer(seasonal, FUN = "concat") %>% as.vector

    # innov from np.random.seed(0); np.random.randn(4)
    innov <- c(1.76405235, 0.40015721, 0.97873798, 2.2408932)
    n <- length(austourists) + 1

    # print fit parameters and final states
    for (damped in c(TRUE, FALSE)) {
      print(paste("damped =", damped))
      for (model in models) {
        state <- tryCatch((function(){
          fit <- ets(austourists, model = model, damped = damped)
          pars <- c()
          # alpha, beta, gamma, phi
          for (name in c("alpha", "beta", "gamma", "phi")) {
            pars <- c(pars, get_var(fit$par, name))
          }
          # l, b, s1, s2, s3, s4
          states <- c()
          for (name in c("l", "b", "s1", "s2", "s3", "s4"))
            states <- c(states, get_var(fit$states[n,], name))
          c(pars, states)
        })(),
        error = function(e) rep(NA, 10))
        cat(concat(""", model, "": ", as_dict_string(state), ",
"))
      }
    }
    gq`?g7*Ic?g{Z:?gT_(\?gәo O@go[V:ڛ?gP@gxx|}"gV'gptׅ*@)
r8   r9   r   r   r   r>   s1s2s3s4g`M?gjj,?g ?g;ȍS?gse&M@g{(e#?g^Ǚ@gZEI@gQ΁f"g%>.@gaCu?g&{}Fl?g/(ޥ?g(\?gdO@g4P-?g??g<ub?g'p?g{?g6۹?g1N8?g$7?g͖n?gO@g*?g7d?gy4?g$ޮ?gtI@?gt ?g}	?g0([?g3ZFUN@g^!_?gll$?gđ;?g^_(\?gz7ظN@g,kxY?g7\ʸ?gOMȸ?g-V4?gݳN@gp[s(?r  gCaj?gDtA&?g۵º?g.5GO@gZ<?giG@g=Bg	C)gB;i(@g.i֥?g9Nl7?g<$?g"4_O@g l?gn#-@g+U6ޫgtEd'ghOe*@gynY?g3Y?gL@gxa @gE<i@g4g1@ge?g26+?g_uM@grm@g,En@gy{wg*1@g$3?g[7?g'5T:?gUW?4O@g*.m?g2K@?gYt?gDpvA?g-RZ?g躟ey?g+љZ?gg9?gƻmO@g9K?gW_t֕?gl*?gst?gYB?gqE.|?gD%?g}גO@gvu?gO^]@?g2a?g5??gΪ*?g6'?g QN@gQJ?g+-ʿք?g:&ѕք?g(N@gWCs]?gJ]?g檬6?g ?\N@gń2?gT_$?g]bM@gB]?gXɜ}M@r  r  )r$   nanr  r1   r1   r2   simulate_fit_state_r  s   BX  r#  r  r  errorc                 C   s*  dddd}|| ||   ||  }||| krPt || | }	|| | }
ndS t|d| ||dj|
d |
d	 |
d
 |
d dd}|
d |jd< |
d |jd< |
d |jd< |
d |jd< |
d |jd< |
d |jd< t t |j	rdS t ddddggj
}|jdd||d}t|	|jd dS )z
    Test for :meth:``statsmodels.tsa.holtwinters.HoltWintersResults``.

    The tests are using the implementation in the R package ``forecast`` as
    reference, and example data is taken from ``fpp2`` (package and book).
    Ar   Nr   NrQ   )rT   rU   rV   r   r8   r9   r   r   F)ru   r}   r   r   rs   r   r4   r>   r  r  r   r!  g@9?gY,?gOQ?g[iY@r   )repetitionsr$  random_errorsr   )r$   r   r	   r_   _levelZ_trendZ_seasonr   r   r   Tsimulater   re   )rU   rV   r  r$  r  r  r#  Z
short_nameZ
model_nameexpectedstater_   Zinnovsimr1   r1   r2   test_simulate_expected_r  s<    r2  c                 C   s"  t | dddddd }t|jddddj|jddddj t|jdd	ddj|jdd
ddj t|jddddj|jddddj |jddtjjd |jddtj d |jddtj	
ddd |jdddd |jddddj}|jddtj	ddj}t||kstdS )zS
    check whether all keywords are accepted and work without throwing errors.
    rQ   r   TrR   rT   rU   rV   r   rW   r   )anchorrandom_stater   r4   r  r^   z
2016-03-01r   )r*  r+  	bootstrapr*  r5  N)r	   r_   r   r.  re   scipystatsZnormr$   r%   Zrandnr&   allr   )r  r_   r   r   r1   r1   r2   test_simulate_keywords  s>    

  
r;  c              	   C   sf   t | ddddddd }|dj}|jddd	d
j}tj|dd}tt|| dk sbt	dS )zE
    check if simulation results with boxcox fits are reasonable
    rQ   r   r   FrR   T)rT   rU   rV   r   rW   r   r   r   r7  r   r   r   N)
r	   r_   rf   re   r.  r$   r   r:  absr   )r  r_   r/  r   r   r1   r1   r2   test_simulate_boxcoxE  s    
	r=  ixr   r   r     c                 C   s   t jddddddddd	d
g
t| | d d}tt t|ddd }W 5 Q R X |jddj	}|d | d ksvt
|d | d kst
d S )NiaN i>^ iL iI i1 iI i i i i r   r   r   F)rU   r   rm   r   r4      )r*   r-   r)   r   warnsr   r	   r_   rf   r   r   )r>  Zts_1modelr   r1   r1   r2   test_forecast_indexZ  s      rC  c                	   C   s0   t jtdd ttddd W 5 Q R X d S )NzCan only dampen thematchr   T)r   r   r   r   r	   r$   r   r1   r1   r1   r2   test_error_dampenj  s    rG  c               	   C   s   t jd} tjtdd t| ddd W 5 Q R X t| d dd	}t|tsRtt| d dd
d}tjt	dd |j
dd	 W 5 Q R X d S )Nr   zuse_boxcox must be TruerD  ar   r   rW   r   Tr   rp   zuse_boxcox was setF)r$   r%   r'   r   r   r   r	   r   r   r   r_   )r"   r   r1   r1   r2   test_error_boxcoxo  s      rK  c              	   C   s  t jtdd t| dd W 5 Q R X t jtdd t| dddd W 5 Q R X t jtdd t| ddd	d
ddgd W 5 Q R X t t t| dd W 5 Q R X t t t| dd W 5 Q R X t t t| dd	ddgd W 5 Q R X t t t| dddd W 5 Q R X t t t| dddddd W 5 Q R X t| ddd}t t |jdd W 5 Q R X t t |jddd W 5 Q R X d S )Nz+initialization is 'known' but initial_levelrD  r   rq   zinitial_trend set but modelr   )rW   rv   r   zinitial_seasonal set but modelr   333333?皙?r   )rW   rv   initial_seasonal)rv   )r   g?rQ   )rN  r   )rU   rW   rv          @)rU   rV   rW   rv   r   rW   rv   Tr   )Zuse_basinhoppingrk   r   r   r   r	   r_   r3   r   r1   r1   r2   test_error_initialization~  sd     
  rS  rk   r   r   zL-BFGS-BZTNCr   ZPowellztrust-constrc                 C   sp   t ddg}i }t|dd}|j| ||d}t|jd ddd	 t|jd
 ddd	 t|  t	slt
d S )Ngp=
ף?g      &@rR   rq   )rk   rM   r   ru   gʳ?r   Zrtolrv   gnt&@)r$   r   r	   r_   r   rx   r   r   r   r   r   )rk   r3   svr   r   r   r1   r1   r2   test_alternative_minimizers  s      rV  c              	   C   s   t | dd}ddi}tt |j|d W 5 Q R X tt |jd|d W 5 Q R X dddii}tt |jd	|d W 5 Q R X dd
dii}|jd	|d}t|jtstt|	 
 tstd S )NrR   rq   argsZanything)r   r   r   r   r   rk   r   )r	   r   r   r   r_   r   rx   r   r   r   r   r   )r3   r   kwargsr   r1   r1   r2   test_minimizer_kwargs_error  s    rY  rx   r|   rL  ?r   r   rt   c                 C   sR   t | } t dgd }t ddggd }tt| ||t| |t| d S NTr]   r   r   )r$   r   r   r   r   r   r   rx   selr   r1   r1   r2   test_to_restricted_equiv  s    

r^  皙?c                 C   sL   t | } t dgd }t ddggd }t| tt| |||| d S r[  )r$   r   r   r   r   r\  r1   r1   r2   test_restricted_round_tip  s    
r`  c              	   C   s   ddi}t t t| |d W 5 Q R X dddgi}t t t| |d W 5 Q R X ddi}t t t| |d W 5 Q R X ddi}t t t| |d W 5 Q R X dd	i}t t t| |d W 5 Q R X d S )
NZbad_key)r   r   )r   ru   r   r   )r   r   rO  )r   r   )g      rO  )r   r   KeyErrorr	   r   r   r3   r   r1   r1   r2   test_bad_bounds  s    rc  c                 C   sP   ddi}t | |ddjdd}t | ddjdd}t|jd |jd dd	 d S )
Nru   )r_  r   rR   )r   rW   r   r   rq   r   rT  )r	   r_   r   rx   )r3   r   r   r   r1   r1   r2   test_valid_bounds  s       rd  c              	   C   s&  t | dd}|ddi | }W 5 Q R X |jd dks@tt|  tsVtt | dddd}|dd	i | }W 5 Q R X |jd d	kstt|  tstt | dddd
}|ddd | }W 5 Q R X |jd dkst|jd dks
tt|  ts"td S )NrR   rq   ru   rL  r   Tr   r   r   r   r_  r   )r   ru   r   )	r	   r   r_   rx   r   r   r   r   r   r3   r   r   r1   r1   r2   test_fixed_basic  s4          rf  c              
   C   sL  t | dd}tt  |ddi W 5 Q R X W 5 Q R X tt  |ddi W 5 Q R X W 5 Q R X t | ddd}tt" |dd	d
 W 5 Q R X W 5 Q R X t | dddd}tt" |ddd W 5 Q R X W 5 Q R X ddd}t | dd|dd}tjtdd* |ddd |  W 5 Q R X W 5 Q R X d S )NrR   rq   r}   rL  ru   g333333ӿr   r   rM  r   r   r|   ru   r   )rM  r|   )ffffff?rZ  )rU   rV   r   rW   z!After adjusting for user-providedrD  rt   )r}   r   )r	   r   r   ra  r   r   r_   )r3   r   r   r1   r1   r2   test_fixed_errors,  sN         
ri  r   c              	   C   st   t | ||dd}|jdd}|jjs(t|ddi |jdd}W 5 Q R X |jjsZtt|  t	sptd S )NrR   r   T)rl   ru   r_  )
r	   r_   mle_retvalssuccessr   r   r   r   r   r   )r3   rU   rV   r   r   r1   r1   r2   
test_bruteR  s       rl  c              	   C   sz   t t t| ddd W 5 Q R X t t t| dddd W 5 Q R X t t t| dtddd	 W 5 Q R X d S )
Nr   	heuristicr   r   rp   )rU   r   rW   r   rR   )rV   rN  rW   rF  )r3   r1   r1   r2   test_fix_set_parametersa  s(      rn  c              
   C   sP   t | dd}tjtdd, |ddi |jdd W 5 Q R X W 5 Q R X d S )	NrR   rq   zCannot fix a parameterrD  ru   g      ?r   r   )r	   r   r   r   r   r_   rR  r1   r1   r2   test_fix_unfixablev  s    ro  c              	   C   st   ddd}t jtdd t| d|dd  W 5 Q R X d	d
d}t jtdd t| d|dd  W 5 Q R X d S )N)r_  r   )rL  rM  r   zThe bounds for smoothing_trendrD  r   rR   )rU   r   rW   )rL  r   )rh  r|   rg  z!The bounds for smoothing_seasonal)rV   r   rW   rQ  rb  r1   r1   r2   test_infeasible_bounds}  s     
   
rp  rR   rm  rp   c                 C   s>   t | |||d}| }|jjs$tt|  ts:td S )Nr   )	r	   r_   rj  rk  r   r   r   r   r   )r3   rk   rU   rV   r   r   r1   r1   r2   test_initialization_methods  s       rq  c                 C   sR   t | dd }|jdkst|jjd | jd ks8tt|j|jdd   d S )NrR   rq   r   r4   )	r	   r_   r   r   Zresidr,   r   Zfcastvaluesr   )r3   r   r1   r1   r2   test_attributes  s    rr  c              	   C   sv   t | d ddd}tjtdd |jdd W 5 Q R X | }t| }td|s\t	t
|  tsrt	d S )	Nr   Trm  rI  zuse_boxcox was set at modelrD  rJ  zBox-Cox:[\s]*True)r	   r   r   r   r_   r   r   refindallr   r   r   )r3   r   r   Zsummr1   r1   r2   test_summary_boxcox  s      ru  c              	   C   s  t t| dd}| }t|  ts0tt	j
tdd |jddd W 5 Q R X t	j
tdd |jdd	td
d W 5 Q R X |jdd	dd t	j
tdd |jdd	dd W 5 Q R X t	j
tdd |jdd	ddd W 5 Q R X t	j
tdd |jdd	dd W 5 Q R X d S )Nrm  rq   zerror must berD  r   unknown)r$  z	If randomr   )r  r  )r$  r+  r   )r$  r4  zCannot anchorr?  zArgument random_stateZ	bad_value)r$  r4  r5  zArgument random_errorsZ
bad_values)r	   r$   r   r_   r   r   r   r   r   r   r   r   r.  emptyre  r1   r1   r2   test_simulate  s,         rx  	index_typr+   periodr)   	irregularc           
   	   C   s`  | j d }i }d }d }|dkr4tjd|d dd}n|dkrRtjd|d dd}np|dkrrt|d }d	|d
< nP|dkrtjd}tt	|j
dd|d d}t}d	|d
< tjdddd}|d kr|dd  }|  } |d d | _t|" t| fdddd| }W 5 Q R X t| |d}	W 5 Q R X t|	tjsLttj|	j| d S )Nr   rz  r   $   r   r    r+   r)   r   rT   r{  rQ   )sizer   i  r   )r   stopstepir   rm  r   )r,   r*   Zperiod_ranger+   Z
RangeIndexr$   r%   r&   Indexr   randintr   r(   r   r   r	   r_   rf   r   r-   r   testingZassert_index_equal)
r3   ry  r   rX  warningZfcast_indexr   r.   r   fcastr1   r1   r2   test_forecast_index_types  sF    

 

r  c              	   C   s   t | d |   ddd}| }t|  ts8tt	t t
|j|j W 5 Q R X t|drjtt|drxtt|drtd S )Nr   rR   T)rW   r   Z_untransformed_levelZ_untransformed_trendZ_untransformed_seasonal)r	   minr_   r   r   r   r   r   r   r   r   rw   r   hasattrre  r1   r1   r2   test_boxcox_components  s      r  r*  r   r+  r6  c                 C   s   t | dddddd }|jdd||d}|dkr6d	nd|f}|j|ksLt|jd
d||d}|dkrjdnd
|f}|j|kstd S )NrQ   r   TrR   r3  r   r   )r4  r+  r*  )r   r   )r   )r	   r_   r.  r,   r   )r  r+  r*  r_   r1  Zexpected_shaper1   r1   r2   test_forecast_1_simulation  s0    
	      r  r   r   c                 C   s.   t | d | ||ddd }|jjs*td S )NrQ   rR   )rU   rV   rT   rW   )r	   r_   rj  rk  r   )r3   rU   rV   r   r   r1   r1   r2   (test_estimated_initialization_short_data  s    

r  c              	   C   s2  t jd}tj|d}d|j_t|ddddd}|jddd	}|j	d
d}|j
d d
ks^ttjdd|j
d  d}t jj||j
d dd}t|}||_t|jtjst|jjd kst|jjd ksttjtdd t|ddddd}W 5 Q R X |jddd	}tjtdd |j	d
d W 5 Q R X d S )Ni`	  )rO   dr   r   rm  rS   T)rs   rl   if rm   r   z
2020-01-01r   )r!   F)r}  replacezA date index has been providedrD  zNo supported)r$   r%   r'   r*   Z	DataFramer   r   r	   r_   rf   r,   r   r+   choicesortedr   rG   Zinferred_freqr   rA  r   )r   r"   Zdf_yrB  Zfittedr  r   r1   r1   r2   test_invalid_index!  s>    r  c                  C   sB   dddddddg} t | ddd}| }|j t|jd d d S )Nr   g      Y@r   g      4@rP  rv   )r	   r_   rx   r   )ZseriesesZes_fitr1   r1   r2   test_initial_levelG  s      r  c               
   C   s   t tddddd } t| jd }t| jd d}t| jd	 d}t tdddd
|||d }t|jd | t|jd | t|jd	 | d S )NrQ   r   r   rR   rS   rv   r   r   r   r   )rT   rU   rV   rW   rv   r   rN  )r	   rL   r_   r$   roundrx   r   )rb   ZlvlrU   Zseasrc   r1   r1   r2   test_all_initial_valuesR  s.    


r  )r   )l__doc__Zstatsmodels.compat.pytestr   osrs  r   numpyr$   Znumpy.testingr   r   Zpandasr*   r   Zscipy.statsr8  Zstatsmodels.tools.sm_exceptionsr   r   Zstatsmodels.tsa.holtwintersr   r   r	   r
   r   Z2statsmodels.tsa.holtwinters._exponential_smoothersr   r   Z&statsmodels.tsa.holtwinters._smoothersr   r   r   pathsplitabspath__file__baser   Zread_csvjoinr   ZasfreqZ	SEASONALSZTRENDSrO   r   to_datetimeidxr-   rG   rH   rL   Zfixturer3   rC   rD   r   Zparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r#  r2  r;  r=  rC  rG  rK  rS  rV  rY  r^  r`  rc  rd  rf  ri  rl  rn  ro  rp  rq  rr  ru  rx  r  r  r  r  r  r  r  r1   r1   r1   r2   <module>   s~  




     
 
	

	,) 
M
5
  ,9*
2
 

 

& 	 

%&