U
    Kvf
                    @   s\  d Z ddlm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/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@gZ/e0e/Z1ej2e.ej3e1e4e1dAdBZ5ej6dCdDdEdF Z7ddGdHZ8G dIdJ dJZ9ej:;dKdLdMdN Z<ej:;dOe,dPdQ Z=ej:;dOdRdSdT Z>dUdV Z?dWdX Z@ej:;dYe-ej:;dOe,dZd[ ZAd\d] ZBd^d_ ZCd`da ZDdbdc ZEej:jFej:;dYe-ej:;dOe,ddde ZGej:;dYe-ej:;dOe,dfdg ZHdhdi ZIdjdk ZJdldm ZKdndo ZLej6dpdq ZMej6drds ZNej6dtdu ZOej:;dYe-ej:;dOe,ej:;dvdwej:;dxdRdydz ZPd{d| ZQd}d~ ZRej:;dddddgdd ZSdd ZTdd ZUdd ZVej:;ddddddddgdd ZWdd ZXej:;ddddgdddgdddggdd ZYej:;ddddgdddgdddggdd ZZdd Z[dd Z\dd Z]dd Z^ej:;dYddgej:;dOddgdd Z_dd Z`dd Zadd Zbej:;ddddgej:;dYddgej:;dOddgdd Zcdd Zddd Zedd Zfej:;dddddgddƄ ZgddȄ Zhej:;dddgej:;dddgdd΄ Ziej:;dYddgej:;dOddgej:;dddgdd҄ ZjddԄ Zkddք Zldd؄ ZmdS )z4
Author: Terence L van Zyl
Modified: Kevin Sheppard
    )	MONTH_END)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)Zscopec                  C   s   t jd} | d}| }tddD ],}||d  ||  d||d    ||< q(|dd  }tjd|jd t	d}tj
||dd	S )
Nr   i     皙?   2000-1-1periodsr   y)r   name)nprandomRandomStatestandard_normalcopyrangepd
date_rangeshaper   Series)rser!   ir    r0   V/tmp/pip-unpacked-wheel-2v6byqio/statsmodels/tsa/holtwinters/tests/test_holtwinters.pysesh   s    
*r2   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errr0   r0   r1   _simple_dbl_exp_smoothert   s"    




  02 (rB   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   rH   rI   rJ   r0   r0   r1   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rL   z2011-03-01 00:00:00z2011-12-01 00:00:00笭_vN@9vB@q{G@ڊeI@   )end)r
   rK   fitrL   r   predict)selffit1fit2r0   r0   r1   test_predict9  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 )NrP   r   r   rQ   rR   rW   rX   rY   rZ   r[   r\   )r
   rK   valuesr^   rL   r   forecastr`   ra   r0   r0   r1   test_ndarrayZ  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 )NrP   r   )rS   rT   rU   ZbhT)method	use_bruteZstepsg9#zN@g/lB@gaG@gHI@r\   r
   rK   r^   r   re   rf   r0   r0   r1   test_forecastg  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rV   r   F	optimized333333?rQ   r   gbL~@rP   rD   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   rH   r^   r   re   levelparamsr`   ra   rb   fit3r0   r0   r1   test_simple_exp_smoothings  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 )=Nro   rp   皙?r   F)rt   smoothing_trendrr   T)exponentialrV   rQ   damped_trendrV   rt   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?rP   rE   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   rI   r^   r   re   rT   fittedfcastrx   r0   r0   r1   	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 )NrQ   rp   Tr~   \(\?least_squares)damping_trendrj   )r}   r   rV   rt         ?r   r|   r   ru   g(\p@r   initial_trendgYi@        g(\p@g(\@g(\@g
ףp=
?g33333/p@gp=
ף?g     ·@r   )r   rJ   r^   r   r   rw   r#   NaNsse
isinstancesummaryas_textstrAssertionError)r`   ra   Zmod4fit4Zmod5Zfit5r0   r0   r1   test_holt_damp_fit  sL     
z"TestHoltWinters.test_holt_damp_fitc           	       C   sX  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jd |j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 )NTrQ   r~   gl9+?gG:?r   g<΍o@g"&R@)rt   r|   r   ru   r   Frq   r   c                 S   s   i | ]\}}d |kr||qS )rv   r0   ).0kvr0   r0   r1   
<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@ru   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   rJ   
fix_paramsr^   keysr   rw   r   itemsr#   ZallcloserT   ilocr   nobsr_rv   fittedvaluesre   )	r`   modrw   r^   keyZopt_fitZ
alt_paramsZalt_fitZdesiredr0   r0   r1   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 )NrP   additiverQ   TrS   rT   rU   rV   
use_boxcox   g{GM@gq=
ףPC@g=
ףpG@gRI@gHzgO@g     D@gHzI@g)\HK@r   rm   )r`   r   ra   r0   r0   r1   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 )NrP   r   r   rQ   Tr   r   gQN@g(\B@g\(G@gp=
J@gQEP@gQC@g\(H@gQeK@r   r   Zmultiplicativerm   )r`   Zmod2rb   r0   r0   r1   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 )NrP   r   rQ   T)rS   rU   rV   r   r   gx=\M@g*8 "A@gLF@gl^Y-G@r   r   g{zM@g5A@g6 F@gG@rm   )r`   ry   r   r0   r0   r1   test_hw_seasonal_buggy  sP    



z&TestHoltWinters.test_hw_seasonal_buggyN)__name__
__module____qualname__classmethodrO   rc   rg   pytestmarkZxfailrn   rz   r   smoker   r   r   r   r   r0   r0   r0   r1   rC      s    
 *!
"C
+ 0#rC   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   )rT   rU   rS   )r#   onesr   raises
ValueErrorr
   )r   rT   rU   r!   r0   r0   r1   test_negative_multipliative  s       r   rU   c              	   C   s,   t t ttd| ddd W 5 Q R X d S )NFTr   )rT   rU   r   rS   )r   r   	TypeErrorr
   housing_data)rU   r0   r0   r1   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   )rU   rS   )	r)   r,   r#   r   r*   r   r   r   r
   )rU   r!   r0   r0   r1   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^   r0   r0   r0   r1   test_2d_data4  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   rQ   rT   rU   rV   r   r   r      )r   r'   listr   warningscatch_warningsr
   lenr   r   rS   )Zhd2wr   r0   r0   r1   test_infer_freq;  s       r   rT   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 )	NrQ   r   basinhoppingminimizer_kwargsrj   SLSQPrj   minimize_kwargsg)\(?)r
   r   r^   r   r   r   r   r   r   rw   dict)rT   rU   r   resres2r0   r0   r1   test_start_paramsG  s    
r   c                  C   s$   t ttjd dd} | jdd d S )Nr   knownru   rV         ?rt   )r
   r   r   r^   r   r0   r0   r1   test_no_params_to_optimizeZ  s    r   c               	   C   s:   t tdd} tt | jtdgd W 5 Q R X d S )NrQ   rp   r   rW   )r
   r   r   r   r   r^   r#   arrayr   r0   r0   r1   test_invalid_start_param_lengthc  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   rQ   rT   rV   r   rj   gh㈵>r   )decimal)
r
   r   r^   r   r   r   r   r   r   r   )reset_randomstater   r   r   ZtolZres3r0   r0   r1   test_basin_hoppingi  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   rQ   r   T)Zremove_biasr   r   )r
   r   r^   r#   anyr   r   r   r   meanr   r   r   r   )r   r   r   Zerr2r0   r0   r1   test_debiasedx  s      r   c                 C   sN   t t| |ddd }t|jd d t t| |dd }t|jd d d S )NrQ   r   )rT   rU   rV   r   r   )rT   rU   r   )r
   r   r^   r   rw   )rT   rU   r   r0   r0   r1   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 )NrQ   r   r   r      rt   r|   smoothing_seasonalr   r   ru   r   initial_seasonsr   r\   F)r
   r   r^   r   r   r   r   r   rw   r+   r#   squeezeasarrayr4   isnanZ	ones_likeastypeintr'   r   r   r	   PyHoltWintersArgsr   r   )rT   rU   r   r   rw   r   r!   mpr7   r8   gammaphir9   r:   xiZp_copyboundsZpy_funcZcy_funcZ
py_hw_argsZ
cy_hw_argsZsse_cyZsse_pyr0   r0   r1   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 )NrQ   rp   rt   r   ru   r   )r8   r9   r:   r;   r3   r   r   r|   r   r   r   r\   rP   )r   r   r^   r   r   r   r   r   r#   r   r   endogrw   rB   r   rv   r   r   re   r
   r   rT   r   )
r   r   r6   r7   lr=   r?   _r>   r8   r0   r0   r1   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   rQ   r   rt   r   )r#   r$   r%   r&   cumsumr   r   r
   r^   rw   r   )r   r-   r.   Zy_starr!   r   r0   r0   r1   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   TrQ   rT   r   rV   r   r   g#B;)rt   r|   r   r   )start	   g|=r   )r#   r5   r
   r^   r_   r   r   )r   r   Zres1Zpred1r   Zpred2r0   r0   r1   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   rP   r          r   )rT   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_mulra   rb   ry   r   r0   r0   r1   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,   )rN   r   r0   r0   r1   austourists0  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TFr0   dampedZundampedr0   r0   r1   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ׅ*@)
r7   r8   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  r0   r0   r1   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).
    AMNr   NrP   )rS   rT   rU   r   r7   r8   r   r   F)rt   r|   r   r   rr   r   r3   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   rd   )rT   rU   r  r"  r  r  r!  Z
short_nameZ
model_nameexpectedstater^   Zinnovsimr0   r0   r1   test_simulate_expected_r  s<    r1  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.
    rP   r   TrQ   rS   rT   rU   r   rV   r   )anchorrandom_stater   r3   r  r]   z
2016-03-01r   )r)  r*  	bootstrapr)  r4  N)r
   r^   r   r-  rd   scipystatsZnormr#   r$   Zrandnr%   allr   )r  r^   r   r   r0   r0   r1   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
    rP   r   r   FrQ   T)rS   rT   rU   r   rV   r   r   r   r6  r   r   r   N)
r
   r^   re   rd   r-  r#   r   r9  absr   )r  r^   r.  r   r   r0   r0   r1   test_simulate_boxcoxF  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)rT   r   rl   r   r3      )r)   r,   r(   r   warnsr   r
   r^   re   r   r   )r=  Zts_1modelr   r0   r0   r1   test_forecast_index[  s      rB  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   r0   r0   r0   r1   test_error_dampenk  s    rF  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 TruerC  ar   r   rV   r   Tr   ro   zuse_boxcox was setF)r#   r$   r&   r   r   r   r
   r   r   r   r^   )r!   r   r0   r0   r1   test_error_boxcoxp  s      rJ  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_levelrC  r   rp   zinitial_trend set but modelr   )rV   ru   r   zinitial_seasonal set but modelr   333333?皙?r   )rV   ru   initial_seasonal)ru   )r   g?rP   )rM  r   )rT   rV   ru          @)rT   rU   rV   ru   r   rV   ru   Tr   )Zuse_basinhoppingrj   r   r   r   r
   r^   r2   r   r0   r0   r1   test_error_initialization  sd     
  rR  rj   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      &@rQ   rp   )rj   rL   r   rt   gʳ?r   Zrtolru   gnt&@)r#   r   r
   r^   r   rw   r   r   r   r   r   )rj   r2   svr   r   r   r0   r0   r1   test_alternative_minimizers  s      rU  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 )NrQ   rp   argsZanything)r   r   r   r   r   rj   r   )r
   r   r   r   r^   r   rw   r   r   r   r   r   )r2   r   kwargsr   r0   r0   r1   test_minimizer_kwargs_error  s    rX  rw   r{   rK  ?r   r   rs   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   rw   selr   r0   r0   r1   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 rZ  )r#   r   r   r   r   r[  r0   r0   r1   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   rt   r   r   )r   r   rN  )r   r   )g      rN  )r   r   KeyErrorr
   r   r   r2   r   r0   r0   r1   test_bad_bounds  s    rb  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 )
Nrt   )r^  r   rQ   )r   rV   r   r   rp   r   rS  )r
   r^   r   rw   )r2   r   r   r   r0   r0   r1   test_valid_bounds  s       rc  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 )NrQ   rp   rt   rK  r   Tr   r   r   r   r^  r   )r   rt   r   )	r
   r   r^   rw   r   r   r   r   r   r2   r   r   r0   r0   r1   test_fixed_basic  s4          re  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 )NrQ   rp   r|   rK  rt   g333333ӿr   r   rL  r   r   r{   rt   r   )rL  r{   )ffffff?rY  )rT   rU   r   rV   z!After adjusting for user-providedrC  rs   )r|   r   )r
   r   r   r`  r   r   r^   )r2   r   r   r0   r0   r1   test_fixed_errors-  sN         
rh  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 )NrQ   r   T)rk   rt   r^  )
r
   r^   mle_retvalssuccessr   r   r   r   r   r   )r2   rT   rU   r   r   r0   r0   r1   
test_bruteS  s       rk  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   ro   )rT   r   rV   r   rQ   )rU   rM  rV   rE  )r2   r0   r0   r1   test_fix_set_parametersb  s(      rm  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 )	NrQ   rp   zCannot fix a parameterrC  rt   g      ?r   r   )r
   r   r   r   r   r^   rQ  r0   r0   r1   test_fix_unfixablew  s    rn  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   )rK  rL  r   zThe bounds for smoothing_trendrC  r   rQ   )rT   r   rV   )rK  r   )rg  r{   rf  z!The bounds for smoothing_seasonal)rU   r   rV   rP  ra  r0   r0   r1   test_infeasible_bounds~  s     
   
ro  rQ   rl  ro   c                 C   s>   t | |||d}| }|jjs$tt|  ts:td S )Nr   )	r
   r^   ri  rj  r   r   r   r   r   )r2   rj   rT   rU   r   r   r0   r0   r1   test_initialization_methods  s       rp  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 )NrQ   rp   r   r3   )	r
   r^   r   r   Zresidr+   r   Zfcastvaluesr   )r2   r   r0   r0   r1   test_attributes  s    rq  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   Trl  rH  zuse_boxcox was set at modelrC  rI  zBox-Cox:[\s]*True)r
   r   r   r   r^   r   r   refindallr   r   r   )r2   r   r   Zsummr0   r0   r1   test_summary_boxcox  s      rt  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 )Nrl  rp   zerror must berC  r   unknown)r"  z	If randomr   )r   r   )r"  r*  r   )r"  r3  zCannot anchorr>  zArgument random_stateZ	bad_value)r"  r3  r4  zArgument random_errorsZ
bad_values)r
   r#   r   r^   r   r   r   r   r   r   r   r   r-  emptyrd  r0   r0   r1   test_simulate  s,         rw  	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 t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   ry  r   $   r$  r   r*   r(   r   rS   rz  rP   )sizer   i  r   )r   stopstepir   rl  r   )r+   r)   Zperiod_ranger*   r   Z
RangeIndexr#   r$   r%   ZIndexr   randintr   r'   r   r   r
   r^   re   r   r,   r   ZtestingZassert_index_equal)
r2   rx  r   rW  warningZfcast_indexr   r-   r   fcastr0   r0   r1   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   rQ   T)rV   r   Z_untransformed_levelZ_untransformed_trendZ_untransformed_seasonal)r
   minr^   r   r   r   r   r   r   r   r   rv   r   hasattrrd  r0   r0   r1   test_boxcox_components  s      r  r)  r   r*  r5  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 )NrP   r   TrQ   r2  r   r   )r3  r*  r)  )r   r   )r   )r
   r^   r-  r+   r   )r  r*  r)  r^   r0  Zexpected_shaper0   r0   r1   test_forecast_1_simulation  s0    
	      r  r   r   c                 C   s.   t | d | ||ddd }|jjs*td S )NrP   rQ   )rT   rU   rS   rV   )r
   r^   ri  rj  r   )r2   rT   rU   r   r   r0   r0   r1   (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`	  )rN   dr   r   rl  rR   T)rr   rk   if rl   r   z
2020-01-01r   )r    F)r|  replacezA date index has been providedrC  zNo supported)r#   r$   r&   r)   Z	DataFramer   r   r
   r^   re   r+   r   r*   choicesortedr   rF   Zinferred_freqr   r@  r   )r   r!   Zdf_yrA  Zfittedr  r   r0   r0   r1   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@rO  ru   )r
   r^   rw   r   )ZseriesesZes_fitr0   r0   r1   test_initial_levelH  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 )NrP   r   r   rQ   rR   ru   r   r   r   r   )rS   rT   rU   rV   ru   r   rM  )r
   rK   r^   r#   roundrw   r   )ra   ZlvlrT   Zseasrb   r0   r0   r1   test_all_initial_valuesS  s.    


r  )r   )n__doc__Zstatsmodels.compat.pandasr   Zstatsmodels.compat.pytestr   osrr  r   Znumpyr#   Znumpy.testingr   r   Zpandasr)   r   Zscipy.statsr7  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TRENDSrN   r   Zto_datetimeidxr,   rF   rG   rK   Zfixturer2   rB   rC   r   Zparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r!  r1  r:  r<  rB  rF  rJ  rR  rU  rX  r]  r_  rb  rc  re  rh  rk  rm  rn  ro  rp  rq  rt  rw  r  r  r  r  r  r  r  r0   r0   r0   r1   <module>   s  




     
 
	

	,) 
M
5
  ,9*
2
 

 

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