
    ]hrf                       d Z ddlZddlZddlmZ ddlZddlmZ ddlmZm	Z	 ddl
mZmZ ddlmZmZmZ ddlmZ ddlmZ dd	lmZmZmZ dd
lmZ ddlZddlmZ ddlm Z!  G d de"          Z# G d de"          Z$ G d de"          Z% G d de"          Z& G d de"          Z'd Z(d Z) G d de"          Z* G d de"          Z+ G d de"          Z, G d de"          Z-d Z. G d  d!e"          Z/ G d" d#          Z0 G d$ d%          Z1 G d& d'          Z2 G d( d)          Z3 G d* d+          Z4 G d, d-          Z5 G d. d/          Z6 G d0 d1          Z7 G d2 d3          Z8 G d4 d5          Z9 G d6 d7          Z: G d8 d9          Z; G d: d;          Z< G d< d=          Z= G d> d?          Z> G d@ dA          Z? G dB dC          Z@ G dD dE          ZA G dF dG          ZB G dH dI          ZCdS )Jz5
Created on Sat Mar 29 13:33:09 2025

@author: atdou
    N)pyplot)MSELossL1LossSGDAdam)TensorDataset
DataLoaderSubset)ARIMA)SARIMAX)LinearRegressionLassoRidge)ExponentialSmoothingc                   ,    e Zd Zd Zd Zd Zd Zd ZdS )unit_scalerc                     d S N selfs    pC:\Users\atdou\OneDrive\Desktop\Files\Coding\Python\Programs\Data Science\Climate Project\Time_Series_PyTorch.py__init__zunit_scaler.__init__           c                     d S r   r   r   xs     r   fitzunit_scaler.fit   r   r   c                     |S r   r   r   s     r   	transformzunit_scaler.transform       r   c                     |S r   r   r   s     r   fit_transformzunit_scaler.fit_transform   r#   r   c                     |S r   r   r   ys     r   invertzunit_scaler.invert!   r#   r   N__name__
__module____qualname__r   r    r"   r%   r)   r   r   r   r   r      s_                    r   r   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )	ab_scalerc                 >    || _         || _        d | _        d | _        d S r   abminmaxr   r2   r3   s      r   r   zab_scaler.__init__&   s"    r   c                 j    |                                 | _         |                                | _        d S r   r4   r5   r   s     r   r    zab_scaler.fit+   $    55775577r   c                 f    | j         | j        | j         z
  || j        z
  z  | j        | j        z
  z  z   S r   r1   r   s     r   r"   zab_scaler.transform.   s0    v$&1tx<8$(TX:MNNNr   c                     |                                 | _         |                                | _        | j        | j        | j        z
  || j         z
  z  | j        | j         z
  z  z   S r   r4   r5   r2   r3   r   s     r   r%   zab_scaler.fit_transform0   sN    55775577v$&1tx<8$(TX:MNNNr   c                 f    | j         | j        | j         z
  || j        z
  z  | j        | j        z
  z  z   S r   r<   r'   s     r   r)   zab_scaler.invert4   s0    x48dh.TV<dftvoNNNr   Nr*   r   r   r   r/   r/   %   sj          
  O O OO O OO O O O Or   r/   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )ln_ab_scalerc                 >    || _         || _        d | _        d | _        d S r   r2   r3   f_minf_maxr6   s      r   r   zln_ab_scaler.__init__9   s"    



r   c                 b   |                                 }|                                }t          j        |          t          j        dt          j        |          z             z  | _        t          j        |          t          j        dt          j        |          z             z  | _        d S N   r4   r5   numpysignlogabsrB   rC   r   r   minimaxis       r   r    zln_ab_scaler.fit>   z    uuwwuuwwZ%%ei%)D//0A&B&BB
Z%%ei%)D//0A&B&BB


r   c                     t          j        |          t          j        dt          j        |          z             z  }| j        | j        | j        z
  || j        z
  z  | j        | j        z
  z  z   S rE   )rH   rI   rJ   rK   r2   r3   rB   rC   )r   r   fs      r   r"   zln_ab_scaler.transformC   sX    JqMM%)AeillN333v$&1tz>:DJ<STTTr   c                 >   |                                 }|                                }t          j        |          t          j        dt          j        |          z             z  | _        t          j        |          t          j        dt          j        |          z             z  | _        t          j        |          t          j        dt          j        |          z             z  }| j        | j	        | j        z
  || j        z
  z  | j        | j        z
  z  z   S rE   
r4   r5   rH   rI   rJ   rK   rB   rC   r2   r3   r   r   rM   rN   rQ   s        r   r%   zln_ab_scaler.fit_transformF       uuwwuuwwZ%%ei%)D//0A&B&BB
Z%%ei%)D//0A&B&BB
JqMM%)AeillN333v$&1tz>:DJ<STTTr   c                     | j         | j        | j         z
  | j        | j        z
  z  || j        z
  z  z   }t	          j        |          t          j        |z  dz
  z  S rE   rB   rC   r3   r2   rH   rI   er   zr(   s      r   r)   zln_ab_scaler.invertM   L    J$*TZ/$&-@!df*MMz!}}egqjl++r   Nr*   r   r   r   r?   r?   8   sh          
C C C
U U UU U U, , , , ,r   r?   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )symmetric_scalerc                 "    d | _         d | _        d S r   r8   r   s    r   r   zsymmetric_scaler.__init__S   s    r   c                 j    |                                 | _         |                                | _        d S r   r8   r   s     r   r    zsymmetric_scaler.fitV   r9   r   c                 B    d|| j         z
  z  | j        | j         z
  z  dz
  S N   rF   r8   r   s     r   r"   zsymmetric_scaler.transformY   s%    !DH*~tx01!33r   c                     |                                 | _         |                                | _        d|| j         z
  z  | j        | j         z
  z  dz
  S ra   r8   r   s     r   r%   zsymmetric_scaler.fit_transform[   sC    55775577!DH*~tx01!33r   c                 B    |dz   | j         | j        z
  z  dz  | j        z   S )NrF   rb   )r5   r4   r'   s     r   r)   zsymmetric_scaler.invert_   s&    !dhtx'(*4833r   Nr*   r   r   r   r]   r]   R   s_            4 4 44 4 44 4 4 4 4r   r]   c                   &    e Zd Zd Zd Zd Zd ZdS )	ln_scalerc                 >    d| _         d| _        d | _        d | _        d S )NrF   rA   r   s    r   r   zln_scaler.__init__d   s"    



r   c                 b   |                                 }|                                }t          j        |          t          j        dt          j        |          z             z  | _        t          j        |          t          j        dt          j        |          z             z  | _        d S rE   rG   rL   s       r   r    zln_scaler.fiti   rO   r   c                 >   |                                 }|                                }t          j        |          t          j        dt          j        |          z             z  | _        t          j        |          t          j        dt          j        |          z             z  | _        t          j        |          t          j        dt          j        |          z             z  }| j        | j	        | j        z
  || j        z
  z  | j        | j        z
  z  z   S rE   rS   rT   s        r   r"   zln_scaler.transformn   rU   r   c                     | j         | j        | j         z
  | j        | j        z
  z  || j        z
  z  z   }t	          j        |          t          j        |z  dz
  z  S rE   rW   rY   s      r   r)   zln_scaler.invertu   r[   r   N)r+   r,   r-   r   r    r"   r)   r   r   r   rf   rf   c   sV          
C C C
U U U, , , , ,r   rf   c                 v    |                                  }fd}|j        D ]} |||                   ||<   |S )Nc                 P   t          |           t          k    st          |           t          k    rLg }t          t	          |                     D ]+}|                    t          | |                              ,|S t          |           t          k    rt          |           S | S r   typelisttuplerangelenappendroundfloatr   	x_roundedkds      r   rQ   zse_rounder.<locals>.f|       77d??d1gg..I3q66]] 1 1  qtQ0000!WWA;;Hr   )copyindex)seriesrz   
series_newrQ   rows    `   r   
se_rounderr   z   s\    J	 	 	 	 	  1 1a
300JsOOr   c                     |                                  }fd}| D ] }| |                             |          ||<   !|S )Nc                 P   t          |           t          k    st          |           t          k    rLg }t          t	          |                     D ]+}|                    t          | |                              ,|S t          |           t          k    rt          |           S | S r   rn   rw   s      r   rQ   zdf_rounder.<locals>.f   r{   r   )r|   apply)dframerz   
dframe_newrQ   cols    `   r   
df_rounderr      s]    J	 	 	 	 	  3 3$Sk//22JsOOr   c                   &    e Zd Zd Zd Zd Zd ZdS )my_ARMAc                    || _         || _        || _        || _        || _        |dgz  | _        |dgz  | _        |dgz  | _        || _        t          j
                            d|dz  |          | _        t          t          |          |          D ]}||                     |          z   }t          t          |                    D ]!}	|||	         | j        |dz
  |	z
           z  z  }"| j        |         }
t          t          |                    D ]!}	|
||	         | j        |dz
  |	z
           z  z  }
"|
| j        |<   || j        |<   |
|z   | j        |<   dS )z 
        phi is list of phis, theta is list of thetas, beta is constant, 
        D is variance of white noise, N is number of points
        f is an inhomogeneity that I could add.
        initial conditions are all zeros
        r   g      ?rF   N)phir3   rQ   DthetaARAMXNrH   randomnormalWrr   rs   )r   r   betarQ   r   r   r   jarry   ams              r   r   zmy_ARMA.__init__   sa    
QC%QC%A3$$Qq#va00s3xx"" 		 		Aq		!B3s88__ * *SVDF1Q3q5M))rrB3u::&& , ,U1XdfQqSUm++rrDGAJDGAJ2DF1II		 		r   c                     i }t          |dz             D ]-}| j        |dz   |z
  dz
  d|z
           |t          |          <   .t          j        |          }|S )NrF   rh   )rr   r   strpandas	DataFrame)r   ry   dfr   s       r   df_lagszmy_ARMA.df_lags   sa    qs 	. 	.A!Aa1-Bs1vvJJb!!	r   c                 >   t          j                     t          | j                  }| j        }t          j        ||           t          j        d| j                   t          j        dt          | j	                  z   dz   t          | j
                  z   dz   t          | j                  z   dz   t          | j                  z              t          j        d           t          j        d           t          j                     t          j                     d S )Nr   zphi = z	, beta = z, D = z
, theta = Tr   )r   figurerr   r   r   plotxlimtitler   r   r3   r   r   xlabelylabelgridshow)r   r   Rs      r   plot_Xzmy_ARMA.plot_X   s    $&MMFAaAdfXDH-;c$&kkIHTWZ[_[aWbWbb!"$'
OO4 	5 	5 	5ccr   c                    t          j                     | j        d | j        |z
           }| j        || j                 }t          j        ||           t          j        dt          |          z              t          j        dt          |          z              t          j        d           t          j	                     t          j
                     d S )NzX_n vs. X_n-zX_n-X_n)r   r   r   r   scatterr   r   r   r   r   r   )r   ry   r   r   s       r   plot_lagzmy_ARMA.plot_lag   s    F9DF1H9F1TV8q^SVV+,,,fSVVm$$$er   N)r+   r,   r-   r   r   r   r   r   r   r   r   r      sP          6        r   r   c                   &    e Zd Zd Zd Zd Zd ZdS )create_seriesc                     d | _         d S r   r   r   s    r   r   zcreate_series.__init__   s    r   c                 8    t          j        |          | _        d S r   )r   Seriesr   r   datas     r   r    zcreate_series.fit   s    t$$r   c                 d    t          t          |           }t          j        |          | _        d S r   )rp   zipr   r   r   r   s     r   fit_veczcreate_series.fit_vec   s(    CJt$$r   c                 p    t          j        | j        j                                                  | _        d S r   )rH   arrayr~   valuestolistr   r   s    r   to_arrayzcreate_series.to_array   s(    T[/668899r   N)r+   r,   r-   r   r    r   r   r   r   r   r   r      sP          % % %% % %: : : : :r   r   c                   \    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd ZdS )create_dataframec                 L    d | _         d | _        d | _        || _        || _        d S r   )r   r(   r   X_seq_lengthy_seq_length)r   r   r   s      r   r   zcreate_dataframe.__init__   s-    ((r   c           	      ~   g g g }}}t          | j        t          |          | j        z
  dz             D ]o}|                    |           d ||| j        z
  |         D             }|||| j        z            }|                    |           |                    |           pt          j        |d t          | j        dd          D             |          | _        t          j        |d t          | j                  D             |          | _        t          j	        | j        | j        gd          | _
        d S )	NrF   c                     g | ]}|S r   r   .0is     r   
<listcomp>z(create_dataframe.fit.<locals>.<listcomp>       ===Aa===r   c                 8    g | ]}d t          |          z   dz   S X_(n-)r   r   r   s     r   r   z(create_dataframe.fit.<locals>.<listcomp>   '    -h-h-hQgc!ffnS.@-h-h-hr   r   rh   columnsr}   c                 2    g | ]}d t          |          z   S r(   r   r   s     r   r   z(create_dataframe.fit.<locals>.<listcomp>   "    -[-[-[Qc#a&&j-[-[-[r   axis)rr   r   rs   r   rt   r   r   r   r(   concatr   r   r   indicesr   r(   r   X_tempy_temps           r   r    zcreate_dataframe.fit   sE   BAt(#d))D4E*Ea*GHH 	 	ANN1==a(9&9!&;!<===F!Ad///0FHHVHHV!!-h-h%PTPabcdfJgJg-h-h-hryzzz!!-[-[%HYBZBZ-[-[-[elmmm- 0q999r   c           	         t          t          |           }g g g }}}t          | j        t	          |          | j        z
  dz             D ]o}|                    |           d ||| j        z
  |         D             }|||| j        z            }|                    |           |                    |           pt          j        |d t          | j        dd          D             |          | _	        t          j        |d t          | j                  D             |          | _
        t          j        | j	        | j
        gd          | _        d S )	NrF   c                     g | ]}|S r   r   r   s     r   r   z,create_dataframe.fit_vec.<locals>.<listcomp>   r   r   c                 8    g | ]}d t          |          z   dz   S r   r   r   s     r   r   z,create_dataframe.fit_vec.<locals>.<listcomp>   r   r   r   rh   r   c                 2    g | ]}d t          |          z   S r   r   r   s     r   r   z,create_dataframe.fit_vec.<locals>.<listcomp>  r   r   r   )rp   r   rr   r   rs   r   rt   r   r   r   r(   r   r   r   s           r   r   zcreate_dataframe.fit_vec   sV   CJBAt(#d))D4E*Ea*GHH 	 	ANN1==a(9&9!&;!<===F!Ad///0FHHVHHV!!-h-h%PTPabcdfJgJg-h-h-hryzzz!!-[-[%HYBZBZ-[-[-[elmmm- 0q999r   c                    g }|                                 }|D ]e}t          | j        | j                  }|                    ||                    t          j        |j                  }|                    |           ft          j	        |          }t          j        |          }|j        d d d| j        f         | _        d t          | j        dd          D             | j        _        |j        d d | j        | j        | j        z   f         | _        d t          | j                  D             | j        _        t          j        | j        | j        gd          | _        d S )Nr   c                 8    g | ]}d t          |          z   dz   S r   r   r   s     r   r   z1create_dataframe.fit_datasets.<locals>.<listcomp>  '    TTT'#a&&.,TTTr   rh   c                 2    g | ]}d t          |          z   S r   r   r   s     r   r   z1create_dataframe.fit_datasets.<locals>.<listcomp>  "    GGG#c!ff*GGGr   rF   r   )r|   r   r   r   r    rH   r   r   rt   vstackr   r   ilocr   rr   r   r(   r   r   	data_sets	np_arraysval_setskeyr   np_arraynp_arrays_stackeds           r   fit_datasetszcreate_dataframe.fit_datasets  sN   	>>## 	' 	'C!$"3T5FGGBFF8C=!!!{25))HX&&&&!L33/001T.../TTeD<MaPR6S6STTT4,T->AR-RRRSGGeD4E.F.FGGG- 0q999r   c                 P   g }|                                 }|D ]}t          ||                   t          j        k    r'||         j        j                                        ||<   t          | j        | j	                  } |j
        ||           t          j        |j                  }|                    |           t          j        |          }t          j        |          }|j        d d d| j        f         | _        d t%          | j        dd          D             | j        _        |j        d d | j        | j        | j	        z   f         | _        d t%          | j	                  D             | j        _        t          j        | j        | j        gd          | _        d S )Nr   c                 8    g | ]}d t          |          z   dz   S r   r   r   s     r   r   z5create_dataframe.fit_vec_datasets.<locals>.<listcomp>  r   r   rh   c                 2    g | ]}d t          |          z   S r   r   r   s     r   r   z5create_dataframe.fit_vec_datasets.<locals>.<listcomp>!  r   r   rF   r   )r|   ro   r   r   r   r   r   r   r   r   r   rH   r   r   rt   r   r   r   rr   r   r(   r   r   s           r   fit_vec_datasetsz!create_dataframe.fit_vec_datasets  s   	>>## 	' 	'CHSM""f&666 ( 6 = = ? ?!$"3T5FGGBBJ&&{25))HX&&&&!L33/001T.../TTeD<MaPR6S6STTT4,T->AR-RRRSGGeD4E.F.FGGG- 0q999r   c                 @    d fd | j         ||           d S )Nc                 H    d| vr| S | d|                      d                   S )N*r   )find)strings    r   
first_wordz.create_dataframe.augment_X.<locals>.first_word$  s.    &  aC 0 0011r   c                 \   |dk    r|S  | ||dz
            }g }|D ]}|D ]}|                     |          |                      |                    k    rQ|                    d                    ||                     | |         | |         z  | d                    ||          <   |S )NrF   z	{:s}*{:s})r}   rt   format)	r   r   degreeprevious_powers_columns
new_powerselem_celem_tr   powers_columnss	          r   r  z2create_dataframe.augment_X.<locals>.powers_columns)  s    {{*8.GVAX*N*N'
% X XF"9 X X"==00GMM**VBTBT4U4UUU&--k.@.@.P.PQQQDEfIaPViDWAk00@@AX "!r   r   )r   poly_columnsr   r   r  s      @@r   	augment_Xzcreate_dataframe.augment_X#  sO    	2 	2 	2
	" 	" 	" 	" 	" 	" 	tv|V44444r   c                 T    fd}| j                             |          | _         d S )Nc                     t          |           }t          |           }D ]+}D ]&}|                    ||         ||         z             ',t          |          S r   )rp   rt   rq   )tl_copylchexpandhuess        r   rQ   z$create_dataframe.expand_X.<locals>.f8  si    !WWFQA 2 2 2 2AHHVAYvay01111288Or   )r   applymap)r   r  r  rQ   s    `` r   expand_Xzcreate_dataframe.expand_X7  s=    	 	 	 	 	 	 ##r   c                 L    | j                             fd          | _         d S )Nc                 T    t          fdt          |           D                       S )Nc              3   .   K   | ]\  }}|k    |V  d S r   r   )r   r   v	components      r   	<genexpr>z>create_dataframe.remove_y.<locals>.<lambda>.<locals>.<genexpr>A  s,      0^0^tq!qT]~~~~~~0^0^r   )rq   	enumerate)r  r  s    r   <lambda>z+create_dataframe.remove_y.<locals>.<lambda>A  s*    50^0^0^0^y||0^0^0^+^+^ r   )r(   r  )r   r  s    `r   remove_yzcreate_dataframe.remove_y@  s&    !^!^!^!^__r   c                     t          | j                  |gz  | j        d<   t          j        | j        | j        gd          | _        d S )Nr   rF   r   )rs   r   r   r   r(   r   )r   ps     r   insert_constantz create_dataframe.insert_constantB  s>    TVaSv- 0q999r   c                     t          |          D ]2}t          | j                  |gz  | j        dt          |          z   <   3t	          j        | j        | j        gd          | _        d S )Nr   rF   r   )rr   rs   r   r   r   r   r(   r   )r   nr  r   s       r   insert_placeholdersz$create_dataframe.insert_placeholdersE  sa    q 	1 	1A!$TVaSDF3s1vv:- 0q999r   c                    t          | j        j                  D ]\  }}| j        |                                         }t	          |          }t          t          |           }g }t          t	          |                    D ]^}||         dk    rt          ||                   ||<   '|                    t          ||                              ||         g|z  ||<   _t          t          |           | j	        dt          |          z   <   	 t          t          |           | j        |<   #  Y xY wt          j        | j	        | j        gd          | _        d S )N_r   rF   r   )r  r(   r   r   rs   rp   r   rr   rt   r   r   r   r   r   )	r   r  r  r   r   r~   sequences_Xsequences_yry   s	            r   insert_placeholders_vecz(create_dataframe.insert_placeholders_vecI  s@   // 	 	FAsVC[''))FFAsF|,,KK3q66]] . .Q43;;%)+a.%9%9KNN&&tKN';';<<<&'dVAXKNN!%c;&7!8!8DF3s1vv:"3#455s- 0q999s   D00D5c                     || j         _        d S r   )r   r   )r   new_columnss     r   rename_Xzcreate_dataframe.rename_X[  s    $r   c                     t          j        | j        j                                                  | _        t          j        | j        j                                                  | _        d S r   )rH   r   r   r   r   r(   r   s    r   r   zcreate_dataframe.to_array]  sH    TV]113344TV]113344r   N)r+   r,   r-   r   r    r   r   r   r  r  r  r  r  r$  r'  r   r   r   r   r   r      s        ) ) )
: 
: 
:: : :: : :: : :"5 5 5($ $ $` ` `: : :: : :: : :$% % %5 5 5 5 5r   r   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )tfoldc                     d S r   r   r   s    r   r   ztfold.__init__c  s    tr   c              #      K   |D ]H}t          t          ||z
  |                    }t          t          |||z                       }||fV  Id S r   rp   rr   )r   test_indicesr   r   ry   train_indicess         r   split_rolling_stochztfold.split_rolling_stoche  si       - -!eAlNA6677U1an5566|,	,	,	,	,- -r   c              #      K   |D ]E}t          t          ||                    }t          t          |||z                       }||fV  Fd S r   r-  r   r.  startr   ry   r/  s         r   split_expanding_stochztfold.split_expanding_stochj  sc       - -!eE1oo..U1an5566|,	,	,	,	,- -r   c              #   ~   K   |D ]7}t          t          ||z
  |z
  dz   ||z
  dz                       }|g}||fV  8d S rE   r-  )r   r.  windowr   ry   r/  s         r   split_rolling_nnztfold.split_rolling_nno  sh       - -!eAlN6$9!$;Q|^A=MNNOO|,	,	,	,	,- -r   c              #   l   K   |D ].}t          t          |||z
  dz                       }|g}||fV  /d S rE   r-  r2  s         r   split_expanding_nnztfold.split_expanding_nnt  sZ       - -!eE1\>!+;<<==|,	,	,	,	,- -r   N)r+   r,   r-   r   r0  r4  r7  r9  r   r   r   r*  r*  b  s_          - - -
- - -
- - -
- - - - -r   r*  c                    ddl m}  |t          |           |z            }g }t          |dz
            D ](}|                    | ||z  |dz   |z                      )| |dz
  |z  d         }|                    |           |S )Nr   )ceilrF   rh   )mathr;  rs   rr   rt   )	sequences
batch_sizer;  num_batchesbatchesr   
last_batchs          r   create_batchesrB  {  s    $s9~~j011KG;q=!! A Ay:qsJ.>!>?@@@@KM:5b89JNN:Nr   c                   "    e Zd Zd Zd ZddZdS )rolling_averagec                 0    || _         || _        d | _        d S r   )seqr   seq_roll)r   rF  r   s      r   r   zrolling_average.__init__  s    r   c                     t          | j                  }t          t          || j        dz  ||z
                      }t          j        | j        ||z
  ||z                                                      S )Nrb   )rs   rF  intr4   r   rH   r   mean)r   r   Lhalf_Ts       r   fit_predictzrolling_average.fit_predict  sb    MMSDF1Hac**++{48AfHQvX$5677<<>>>r   Nc                     |}t          j                     |!t          t           j                            n|} j        } fdt          t           j                            D             }| _        t          j        ||           t          j        ||           t          j        dt           j	                  z              t          j
        |           t          j        |           t          j                     d S )Nc                 :    g | ]}                     |          S r   )rM  )r   r   r   s     r   r   z(rolling_average.plot.<locals>.<listcomp>  s'    @@@adq!!@@@r   z	Window = )r   r   rr   rs   rF  rG  r   r   r   r   r   ylimr   )r   r   rP  Domainr   R1R2s   `      r   r   zrolling_average.plot  s    $*NE#dh--   X@@@@5TX+?+?@@@AbAb[3tv;;.///DDr   )NNN)r+   r,   r-   r   rM  r   r   r   r   rD  rD    sF          ? ? ?     r   rD  c                   >    e Zd ZdZd Zd Zd Zd Zd Zd
dZ	d	 Z
dS )lmfit_Forecaster%
    Description
    -----------
    c                     d | _         d | _        d | _        || _        || _        d | _        || _        || _        d | _        d S r   )	r   r   X_seq_startmodelparams
new_params	residuals	minimizer
cv_results)r   rZ  rY  r\  r]  s        r   r   zlmfit_Forecaster.__init__  sH      
""r   c                     |                      | j        | j        |j        |j        f          }|                    d          }|j        | _        d S )N)fcn_argsleastsq)method)r]  r\  rZ  r   minimizer[  )r   X_trainy_trainrM   results        r   r    zlmfit_Forecaster.fit  sH    ~~dndkw~W^WeFf~gg	22 -r   c                 B    |                      | j        |j                  S r   )rY  r[  r   )r   X_tests     r   predictzlmfit_Forecaster.predict  s    zz$/6=999r   c           	      r   || _         || _        g }g }g }g }	g }
t                      }|                    || j         |          }|D ]\  }}|j        |         }|j        |         }|                     ||           t          t          |d         |d         | j        z                       }|j        |         }|j        |         j        	                                }t          j        |                     |                    	                                }|                    |           |                    |                                           |                    |                                           |	                    ||z
                                             |
                    d t          |d         |d         | j        z   dz
            D             t          j        ||z
  dz            gz              t!          j        ||||	|
d                              d          | _        d S )Nr   c                 &    g | ]}t           j        S r   rH   nanr   ry   s     r   r   z3lmfit_Forecaster.cross_val_roll.<locals>.<listcomp>      hhhQuyhhhr   rF   rb   r   targetspredictionsr\  mse_foldr   )r   r   r*  r0  locr    rp   rr   r   ravelrH   r   ri  extendr   rJ  r   r   	set_indexr^  )r   r   r(   r   r   r.  r   rq  rr  r\  msetffoldsr/  rd  re  new_indicesrh  y_testy_preds                       r   cross_val_rollzlmfit_Forecaster.cross_val_roll  s   ((	WW&&|T5FUU+0 	5 	5'M<U=)7U=)788GW%%%eLO\!_tGX5XYYZZ;E+&6E+&-33556KV 4 455;;==6>>+&&&>>&--//***fmmoo...Vf_4466777::hh%QaSWSdAdefAf*g*ghhh*fvo12234 5 5 5 5 *g`k8As,T ,T U UU^U^_hUiUi 	r   c           	      D   g }g }g }g }	g }
t                      }|                    |||          }|| _        || _        |D ]\  }}|j        |         }|j        |         }|                     ||           t          t          |d         |d         | j        z                       }|j        |         }|j        |         j        	                                }t          j        |                     |                    }|                    |           |                    |                                           |                    |                                           |	                    ||z
                                             |
                    d t          |d         |d         | j        z   dz
            D             t          j        ||z
  dz            gz              t!          j        ||||	|
d                              d          | _        d S )Nr   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z2lmfit_Forecaster.cross_val_exp.<locals>.<listcomp>  ro  r   rF   rb   rp  r   )r*  r4  rX  r   rt  r    rp   rr   r   ru  rH   r   ri  rv  r   rJ  r   r   rw  r^  )r   r   r(   rX  r   r.  r   rq  rr  r\  rx  ry  rz  r/  rd  re  r{  rh  r|  r}  s                       r   cross_val_expzlmfit_Forecaster.cross_val_exp  s   	WW(({LQQ&(+0 	5 	5'M<U=)7U=)788GW%%%eLO\!_tGX5XYYZZ;E,'6E+&-33556KV 4 4556>>+&&&>>&--//***fmmoo...Vf_4466777::hh%QaSWSdAdefAf*g*ghhh*fvo12234 5 5 5 5 *g`k7@c,S ,S T TT]T]^gThTh 	r   Nc                    dt          | j                  fdt          | j                  fd}t          j                     t          | j        j                  }| j        d         }| j        d         }t          j                     t          j        ||d           t          j        ||dd	
           t          t          | j                  | j        z            }| j        }t          |          D ];}	t          j        ||	|z  |	dz   |z           ||	|z  |	dz   |z           d           <t          j                     t          j                     |d k    rKt          j        ||         d         dz   ||         d         z   dz   t          | j                  z              nt          j        |           t          j                     d S Nr   rX  rolling	expandingrq  rr  targetlabel
prediction--r  	linestylerF   blackcolorr    = z, y_seq_length = r   r   rX  r   r   rp   r^  r}   r   rI  rs   r   rr   legendr   r   r   
r   kindr   	kind_dictr   rR  rS  rdeltary   s
             r   plot_targets_predictionsz)lmfit_Forecaster.plot_targets_predictions     !/T5F1G1G HXegjkok{g|g|W}~~	&''_Y'_]+Abx((((Ab|>>>>DO$$T%6677!q 	Z 	ZAK!E'1Q3+-.1U7AaC;3F0GQXYYYYYD==L4+e3ioa6HHK^^adeievawawwxxxxLr   c                    t          j                     t          j        | j        d         |           t          j        d           t          j        d           t          j        d           t          j                     d S Nr\  )binscountresiduezResidue Histogramr   r   histr^  r   r   r   r   r   n_binss     r   plot_res_histzlmfit_Forecaster.plot_res_hist  i    DOK0@@@@gi   ()))r   r   r+   r,   r-   __doc__r   r    ri  r~  r  r  r  r   r   r   rU  rU    s         	 	 	( ( (: : :j j j4i i i4   (    r   rU  c                   >    e Zd ZdZ	 	 d
dZd Zd Zd ZddZd	 Z	dS )exps_Forecaster
    Description
    -----------
    This class enfolds some useful features within Statsmodel's ARIMA models.  
    Trying to make it have the same methods and things as the other classes above.
    TNc                     || _         || _        || _        || _        || _        || _        || _        d | _        d | _        d | _	        d | _
        d | _        d S r   )	optimizedalphar   gamma
trend_typeseasonal_typeseasonal_periodsrX  r   r   rY  r^  )r   r  r  r   r  r  r  r  s           r   r   zexps_Forecaster.__init__  s_    "
	
$* 0  
r   c                 0   |j         }t          || j        | j        | j                  | _        | j        dk    r| j                            d          }n,| j                            | j        | j	        | j
                  }|                    |          S )N)trendseasonalr  T)r  )smoothing_levelsmoothing_slopesmoothing_seasonalsteps)r   r   r  r  r  rY  r  r    r  r   r  forecast)r   rh  r   fitted_models       r   rM  zexps_Forecaster.fit_predict  s    )&$/VZVh=A=RT T T
>T!!:>>d>;;LL:>>DJZ^Zc?Cz * K KL$$\$:::r   c                    || _         || _        g }g }g }g }g }	t                      }
|
                    || j         | j                  }|D ]\  }}||         }||         }|                     ||          }|                    |           |                    |                                           |                    |                                           |                    ||z
                                             |	                    d |d d         D             t          j        ||z
  dz            gz              t          j
        |||||	d                              d          | _        d S )Nc                 &    g | ]}t           j        S r   rl  rn  s     r   r   z2exps_Forecaster.cross_val_roll.<locals>.<listcomp>6      <<<Quy<<<r   rh   rb   rp  r   r   r   r*  r0  rM  rv  r   rH   rJ  r   r   rw  r^  r   Seqr   r   r.  r   rq  rr  r\  rx  ry  rz  r/  rh  r|  r}  s                   r   r~  zexps_Forecaster.cross_val_roll$     ((	WW&&|T5FHYZZ+0 	a 	a'M<&6%6$$V\::6>>,'''>>&--//***fmmoo...Vf_4466777::<<,ss*;<<<ej&SY/\]I]>^>^=__```` *g`k9BPS,U ,U V VV_V_`iVjVj 	r   c                    || _         || _        g }g }g }g }g }	t                      }
|
                    |||          }|D ]\  }}||         }||         }|                     ||          }|                    |           |                    |                                           |                    |                                           |                    ||z
                                             |	                    d |d d         D             t          j        ||z
  dz            gz              t          j
        |||||	d                              d          | _        d S )Nc                 &    g | ]}t           j        S r   rl  rn  s     r   r   z1exps_Forecaster.cross_val_exp.<locals>.<listcomp>K  r  r   rh   rb   rp  r   rX  r   r*  r4  rM  rv  r   rH   rJ  r   r   rw  r^  r   r  rX  r   r.  r   rq  rr  r\  rx  ry  rz  r/  rh  r|  r}  s                   r   r  zexps_Forecaster.cross_val_exp9     &(	WW(({LQQ+0 	a 	a'M<&6%6$$V\::6>>,'''>>&--//***fmmoo...Vf_4466777::<<,ss*;<<<ej&SY/\]I]>^>^=__```` *g`k9BPS,U ,U V VV_V_`iVjVj 	r   c                    dt          | j                  fdt          | j                  fd}t          j                     t          | j        j                  }| j        d         }| j        d         }t          j                     t          j        ||d           t          j        ||dd	
           t          t          | j                  | j        z            }| j        }t          |          D ];}	t          j        ||	|z  |	dz   |z           ||	|z  |	dz   |z           d           <t          j                     t          j                     |d k    rKt          j        ||         d         dz   ||         d         z   dz   t          | j                  z              nt          j        |           t          j                     d S r  r  r  s
             r   r  z(exps_Forecaster.plot_targets_predictionsN  r  r   c                    t          j                     t          j        | j        d         |           t          j        d           t          j        d           t          j        d           t          j                     d S r  r  r  s     r   r  zexps_Forecaster.plot_res_histb  r  r   )TNNNNNNr   
r+   r,   r-   r  r   rM  r~  r  r  r  r   r   r   r  r    s          MQMQ   	; 	; 	;k k k*k k k*   (    r   r  c                   :    e Zd ZdZd
dZd Zd Zd ZddZd	 Z	dS )ARIMA_Forecasterr  r  c                     || _         || _        || _        || _        d | _        d | _        d | _        d | _        d | _        d | _        d S r   )	r  qrz   r  rX  r   r   rY  r^  r   r  rz   r  r  s        r   r   zARIMA_Forecaster.__init__r  sP    
  
r   c                     |j         }t          || j        | j        | j        f| j                  | _        | j                                                            |          S )N)orderr  r  )	r   r   r  rz   r  r  rY  r    r  r   rh  r   s      r   rM  zARIMA_Forecaster.fit_predict}  sQ    6DFDFDF+CTZXXX
z~~(((>>>r   c                    || _         || _        g }g }g }g }g }	t                      }
|
                    || j         | j                  }|D ]\  }}||         }||         }|                     ||          }|                    |           |                    |                                           |                    |                                           |                    ||z
                                             |	                    d |d d         D             t          j        ||z
  dz            gz              t          j
        |||||	d                              d          | _        d S )Nc                 &    g | ]}t           j        S r   rl  rn  s     r   r   z3ARIMA_Forecaster.cross_val_roll.<locals>.<listcomp>  r  r   rh   rb   rp  r   r  r  s                   r   r~  zARIMA_Forecaster.cross_val_roll  r  r   c                    || _         || _        g }g }g }g }g }	t                      }
|
                    |||          }|D ]\  }}||         }||         }|                     ||          }|                    |           |                    |                                           |                    |                                           |                    ||z
                                             |	                    d |d d         D             t          j        ||z
  dz            gz              t          j
        |||||	d                              d          | _        d S )Nc                 &    g | ]}t           j        S r   rl  rn  s     r   r   z2ARIMA_Forecaster.cross_val_exp.<locals>.<listcomp>  r  r   rh   rb   rp  r   r  r  s                   r   r  zARIMA_Forecaster.cross_val_exp  r  r   Nc                    dt          | j                  fdt          | j                  fd}t          j                     t          | j        j                  }| j        d         }| j        d         }t          j                     t          j        ||d           t          j        ||dd	
           t          t          | j                  | j        z            }| j        }t          |          D ];}	t          j        ||	|z  |	dz   |z           ||	|z  |	dz   |z           d           <t          j                     t          j                     |d k    rKt          j        ||         d         dz   ||         d         z   dz   t          | j                  z              nt          j        |           t          j                     d S r  r  r  s
             r   r  z)ARIMA_Forecaster.plot_targets_predictions  r  r   c                    t          j                     t          j        | j        d         |           t          j        d           t          j        d           t          j        d           t          j                     d S r  r  r  s     r   r  zARIMA_Forecaster.plot_res_hist  r  r   r  r   r  r   r   r   r  r  k  s         
 
 
 
? ? ?k k k*k k k*   (    r   r  c                   :    e Zd ZdZd
dZd Zd Zd ZddZd	 Z	dS )SARIMA_Forecasterr  r  c	                     || _         || _        || _        || _        || _        || _        || _        || _        d | _        d | _	        d | _
        d | _        d | _        d S r   )r  r  rz   PQr   sr  rX  r   r   rY  r^  	r   r  rz   r  r  r   r  r  r  s	            r   r   zSARIMA_Forecaster.__init__  sd    
  
r   c                    |j         }|| _        t          || j        | j        | j        f| j        | j        | j        | j	        f| j
                  | _        | j                            d                              | j                  S )N)r  seasonal_orderr  Fdispr  )r   r   r   r  rz   r  r  r   r  r  r  rY  r    r  r  s      r   rM  zSARIMA_Forecaster.fit_predict  s    (Vdfdfdf-E/3vtvtvtv.NX\Xbd d d
z~~U~++44T=N4OOOr   c                    || _         || _        g }g }g }g }g }	t                      }
|
                    || j         | j                  }|D ]\  }}||         }||         }|                     ||          }|                    |           |                    |                                           |                    |                                           |                    ||z
                                             |	                    d |d d         D             t          j        ||z
  dz            gz              t          j
        |||||	d                              d          | _        d S )Nc                 &    g | ]}t           j        S r   rl  rn  s     r   r   z4SARIMA_Forecaster.cross_val_roll.<locals>.<listcomp>  r  r   rh   rb   rp  r   r  r  s                   r   r~  z SARIMA_Forecaster.cross_val_roll  r  r   c                    || _         || _        g }g }g }g }g }	t                      }
|
                    ||| j                  }|D ]\  }}||         }||         }|                     ||          }|                    |           |                    |                                           |                    |                                           |                    ||z
                                             |	                    d |d d         D             t          j        ||z
  dz            gz              t          j
        |||||	d                              d          | _        d S )Nc                 &    g | ]}t           j        S r   rl  rn  s     r   r   z3SARIMA_Forecaster.cross_val_exp.<locals>.<listcomp>
  r  r   rh   rb   rp  r   r  r  s                   r   r  zSARIMA_Forecaster.cross_val_exp  s   &(	WW(({DDUVV+0 	a 	a'M<&6%6$$V\::6>>,'''>>&--//***fmmoo...Vf_4466777::<<,ss*;<<<ej&SY/\]I]>^>^=__```` *g`k9BPS,U ,U V VV_V_`iVjVj 	r   Nc                    dt          | j                  fdt          | j                  fd}t          j                     t          | j        j                  }| j        d         }| j        d         }t          j                     t          j        ||d           t          j        ||dd	
           t          t          | j                  | j        z            }| j        }t          |          D ];}	t          j        ||	|z  |	dz   |z           ||	|z  |	dz   |z           d           <t          j                     t          j                     |d k    rKt          j        ||         d         dz   ||         d         z   dz   t          | j                  z              nt          j        |           t          j                     d S r  r  r  s
             r   r  z*SARIMA_Forecaster.plot_targets_predictions  r  r   c                    t          j                     t          j        | j        d         |           t          j        d           t          j        d           t          j        d           t          j                     d S r  r  r  s     r   r  zSARIMA_Forecaster.plot_res_hist!  r  r   r  r   r  r   r   r   r  r    s            P P Pk k k*k k k*   (    r   r  c                   @    e Zd ZdZddZddZddZddZdd	Zd
 Z	dS )ARIMAX_Forecasterr  r  c                     || _         || _        || _        d | _        || _        d | _        d | _        d | _        d | _        d S r   )	r  r  rz   rX  r  r   r   rY  r^  r  s        r   r   zARIMAX_Forecaster.__init__1  sH    
  
r   r   c                    || _         t          |          |z
  }|j        d |         }t          j        t          |                                                                           }||         j        }|	                    |d          j        }|j        |d          }t          j        t          |                                                                           }	|		                    |d          j        }
t          || j        | j        | j        f|| j                  | _        | j                                        }|                    ||
          }|j        S )NrF   r   )r  exogr  r  r  )r   rs   r   r   r   r   r   	transposer   dropr   r  rz   r  r  rY  r    get_forecastpredicted_meanr   rh  r   pred_colr   X_fitX_fit_dfX_fit_endog
X_fit_exog	X_test_dfX_test_exogresultsforecast_objects                r   rM  zARIMAX_Forecaster.fit_predict;  s%   (6{{\1M\M*#C$899CCEEx(/]]8A]66=
\]]+$S&--//%:;;EEGG	nnXan88?;0HQ[eieoppp
*..""!..|K.XX--r   c                    || _         || _        g }g }g }g }	g }
t                      }|                    || j         | j                  }|D ]J\  }}||         }||         }t	          j        t          |                                                                           }||         j	        }| 
                    |||          }|                    |           |                    |                                           |                    |                                           |	                    ||z
                                             |
                    d |d d         D             t          j        ||z
  dz            gz              Lt	          j        ||||	|
d                              d          | _        d S )Nr  c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z4ARIMAX_Forecaster.cross_val_roll.<locals>.<listcomp>]  r  r   rh   rb   rp  r   r   r   r*  r0  r   r   r   r   r  r   rM  rv  rH   rJ  rw  r^  r   r  r   r   r.  r  r   rq  rr  r\  rx  ry  rz  r/  rh  y_test_series	y_test_dfr|  r}  s                      r   r~  z ARIMAX_Forecaster.cross_val_rollI     ((	WW&&|T5FHYZZ+0 
	a 
	a'M<&6|,=']-A-A-C-C(DEEOOQQ9h'.6$$V\h$OO6>>,'''>>&--//***fmmoo...Vf_4466777::<<,ss*;<<<ej&SY/\]I]>^>^=__```` *g`k9BPS,U ,U V VV_V_`iVjVj 	r   c                    || _         || _        g }g }g }g }	g }
t                      }|                    ||| j                  }|D ]J\  }}||         }||         }t	          j        t          |                                                                           }||         j	        }| 
                    |||          }|                    |           |                    |                                           |                    |                                           |	                    ||z
                                             |
                    d |d d         D             t          j        ||z
  dz            gz              Lt	          j        ||||	|
d                              d          | _        d S )Nr   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z3ARIMAX_Forecaster.cross_val_exp.<locals>.<listcomp>t  r  r   rh   rb   rp  r   rX  r   r*  r4  r   r   r   r   r  r   rM  rv  rH   rJ  rw  r^  r   r  rX  r   r.  r  r   rq  rr  r\  rx  ry  rz  r/  rh  r  r  r|  r}  s                      r   r  zARIMAX_Forecaster.cross_val_exp`     &(	WW(({DDUVV+0 
	a 
	a'M<&6|,=']-A-A-C-C(DEEOOQQ9h'.6$$V\h$OO6>>,'''>>&--//***fmmoo...Vf_4466777::<<,ss*;<<<ej&SY/\]I]>^>^=__```` *g`k9BPS,U ,U V VV_V_`iVjVj 	r   Nc                    dt          | j                  fdt          | j                  fd}t          j                     t          | j        j                  }| j        d         }| j        d         }t          j                     t          j        ||d           t          j        ||dd	
           t          t          | j                  | j        z            }| j        }t          |          D ];}	t          j        ||	|z  |	dz   |z           ||	|z  |	dz   |z           d           <t          j                     t          j                     |d k    rKt          j        ||         d         dz   ||         d         z   dz   t          | j                  z              nt          j        |           t          j                     d S r  r  r  s
             r   r  z*ARIMAX_Forecaster.plot_targets_predictionsw  r  r   c                    t          j                     t          j        | j        d         |           t          j        d           t          j        d           t          j        d           t          j                     d S r  r  r  s     r   r  zARIMAX_Forecaster.plot_res_hist  r  r   r  r   r   r  r   r   r   r  r  *  s         	 	 	 	. . . .k k k k.k k k k.   (    r   r  c                   @    e Zd ZdZddZddZddZddZdd	Zd
 Z	dS )SARIMAX_Forecasterr  r  c	                     || _         || _        || _        || _        || _        || _        || _        d | _        d | _        d | _	        d | _
        d | _        || _        d S r   )r  r  rz   r  r  r   r  rX  r   r   rY  r^  r  r  s	            r   r   zSARIMAX_Forecaster.__init__  sd      



r   r   c                    || _         t          |          |z
  }|j        d |         }t          j        t          |                                                                           }||         j        }|	                    |d          j        }|j        |d          }t          j        t          |                                                                           }	|		                    |d          j        }
t          || j        | j        | j        f| j        | j        | j        | j        f|| j                  | _        | j                            d          }|                    ||
          }|j        S )NrF   r   )r  r  r  r  Fr  r  )r   rs   r   r   r   r   r   r  r   r  r   r  rz   r  r  r   r  r  r  rY  r    r  r  r  s                r   rM  zSARIMAX_Forecaster.fit_predict  sF   (6{{\1M\M*#C$899CCEEx(/]]8A]66=
\]]+$S&--//%:;;EEGG	nnXan88?[4646462J-1VTVTVTV,LU_imisu u u
*.....!..|K.XX--r   c                    || _         || _        g }g }g }g }	g }
t                      }|                    || j         | j                  }|D ]J\  }}||         }||         }t	          j        t          |                                                                           }||         j	        }| 
                    |||          }|                    |           |                    |                                           |                    |                                           |	                    ||z
                                             |
                    d |d d         D             t          j        ||z
  dz            gz              Lt	          j        ||||	|
d                              d          | _        d S )Nr   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z5SARIMAX_Forecaster.cross_val_roll.<locals>.<listcomp>  r  r   rh   rb   rp  r   r  r  s                      r   r~  z!SARIMAX_Forecaster.cross_val_roll  r  r   c                    || _         || _        g }g }g }g }	g }
t                      }|                    ||| j                  }|D ]J\  }}||         }||         }t	          j        t          |                                                                           }||         j	        }| 
                    |||          }|                    |           |                    |                                           |                    |                                           |	                    ||z
                                             |
                    d |d d         D             t          j        ||z
  dz            gz              Lt	          j        ||||	|
d                              d          | _        d S )Nr   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z4SARIMAX_Forecaster.cross_val_exp.<locals>.<listcomp>  r  r   rh   rb   rp  r   r	  r
  s                      r   r  z SARIMAX_Forecaster.cross_val_exp  r  r   Nc                    dt          | j                  fdt          | j                  fd}t          j                     t          | j        j                  }| j        d         }| j        d         }t          j                     t          j        ||d           t          j        ||dd	
           t          t          | j                  | j        z            }| j        }t          |          D ];}	t          j        ||	|z  |	dz   |z           ||	|z  |	dz   |z           d           <t          j                     t          j                     |d k    rKt          j        ||         d         dz   ||         d         z   dz   t          | j                  z              nt          j        |           t          j                     d S r  r  r  s
             r   r  z+SARIMAX_Forecaster.plot_targets_predictions  r  r   c                    t          j                     t          j        | j        d         |           t          j        d           t          j        d           t          j        d           t          j                     d S r  r  r  s     r   r  z SARIMAX_Forecaster.plot_res_hist  r  r   r  r  r   r  r   r   r   r  r    s            . . . .k k k k.k k k k.   (    r   r  c                   >    e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
d
S )RE_ForecasterrV  r   c                 v    || _         || _        || _        d | _        d | _        d | _        d | _        d | _        d S r   )r   r   r  rY  r6  r3  coefs_r^  r   r   r   r  s       r   r   zRE_Forecaster.__init__  s@    ((


r   c                    | j         dk    rt          d          | _        | j                            |j        |j                   | j        j        | _        | j        j        | _        t          j
        t          j        | j                  |j        |j                  | _        d S t          d| j                   | _        | j                            |j        |j                   | j        j        | _        | j        j        | _        t          j
        t          j        | j                  |j        |j                  | _        d S )Nr   Ffit_intercept)r}   r   r   r  )r  r   rY  r    r   
intercept_interecept_coef_r  r   r   rH   r  r   r   r   rd  re  s      r   r    zRE_Forecaster.fit  s    :??)%@@@DJJNN7>7>:::#z4D**DK *5?4;+G+GwjqjyzzzDKKKudjIIIDJJNN7>7>:::"j3DO**DK *5?4;+G+GwjqjyzzzDKKKr   c                     g }|j         }| j                            |                                                                          }t          j        |          S r   )r   rY  ri  ru  r   rH   r   )r   rh  rr  r}  s       r   ri  zRE_Forecaster.predict  sK    ##F++1133::<<{6"""r   c           	         g }g }g }g }g }	g }
t                      }|                    ||d          }|| _        |D ]\  }}|j        |         }|j        |         }|                     ||           |j        |         }t          t          |d         |d         | j        z                       }|j        |d                  j        	                                }t          j        |                     |                    }|                    |           |                    |                                           |                    |                                           |                    ||z
                                             |	                    d t          |d         |d         | j        z   dz
            D             t          j        ||z
  dz            gz              |
                    d t          |d         |d         | j        z   dz
            D             | j        j                            d          gz              t%          j        |||||	|
d                              d          | _        d S )	NrF   r   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z0RE_Forecaster.cross_val_roll.<locals>.<listcomp>9  ro  r   rb   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z0RE_Forecaster.cross_val_roll.<locals>.<listcomp>;      lll59lllr      r   rq  rr  r\  rs  rZ  r   )r*  r7  r6  rt  r    rp   rr   r   r   ru  rH   r   ri  rv  r   rJ  r  ru   r   r   rw  r^  r   r   r(   r.  r6  r   rq  rr  r\  rx  params_ry  rz  r/  rd  re  rh  r{  r|  r}  s                       r   r~  zRE_Forecaster.cross_val_roll#  sy   	WW##L&!<<+0 	0 	0'M<U=)7U=)788GW%%%E,'6eLO\!_tGX5XYYZZ;E,q/*177996KV 4 4556>>+&&&>>&--//***fmmoo...Vf_4466777::hh%QaSWSdAdefAf*g*ghhh*fvo12234 5 5 5>>lleLO\RS_W[WhEhijEj.k.klll+$**1--./ 0 0 0 0 *g`k8As^e,g ,g h hhqhqr{h|h| 	r   c           	         g }g }g }g }g }	g }
t                      }|                    ||d          }|| _        |D ]\  }}|j        |         }|j        |         }|                     ||           |j        |         }t          t          |d         |d         | j        z                       }|j        |d                  j        	                                }t          j        |                     |                    }|                    |           |                    |                                           |                    |                                           |                    ||z
                                             |	                    d t          |d         |d         | j        z   dz
            D             t          j        ||z
  dz            gz              |
                    d t          |d         |d         | j        z   dz
            D             | j        j                            d          gz              t%          j        |||||	|
d                              d          | _        d S )	NrF   r   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z/RE_Forecaster.cross_val_exp.<locals>.<listcomp>U  ro  r   rb   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z/RE_Forecaster.cross_val_exp.<locals>.<listcomp>W  r*  r   r+  r,  r   )r*  r9  r3  rt  r    rp   rr   r   r   ru  rH   r   ri  rv  r   rJ  r  ru   r   r   rw  r^  r   r   r(   r.  r3  r   rq  rr  r\  rx  r.  ry  rz  r/  rd  re  rh  r{  r|  r}  s                       r   r  zRE_Forecaster.cross_val_exp?  sy   	WW%%lE1==
+0 	0 	0'M<U=)7U=)788GW%%%E,'6eLO\!_tGX5XYYZZ;E,q/*177996KV 4 4556>>+&&&>>&--//***fmmoo...Vf_4466777::hh%QaSWSdAdefAf*g*ghhh*fvo12234 5 5 5>>lleLO\RS_W[WhEhijEj.k.klll+$**1--./ 0 0 0 0 *g`k8As^e,g ,g h hhqhqr{h|h| 	r   c                    dt          | j                  fdt          | j                  fd}t          j                     t          | j        j                  }t          | j        d                   }t          | j        d                   }t          j        ||d           t          j        ||dd	
           t          t          | j                  | j        z            }| j        }t          |          D ];}	t          j        ||	|z  |	dz   |z           ||	|z  |	dz   |z           d           <t          j                     t          j                     |d k    rft          j        dt          | j                  z   dz   t          | j                  z   dz   ||         d         z   dz   ||         d         z              nt          j        |           t          j                     d S Nr6  r3  r  rq  rr  r  r  r  r  r  rF   r  r  X_seq_len = , y_seq_len = , r   r  r   r6  r3  r   r   rp   r^  r}   r   rI  rs   r   rr   r  r   r   r   r   r  s
             r   r  z&RE_Forecaster.plot_targets_predictions[  s   !)3t{+;+; <GUXY]YcUdUdKeff	&''$/),--$/-011Abx((((Ab|t<<<<DO$$T%6677!q 	Z 	ZAK!E'1Q3+-.1U7AaC;3F0GQXYYYYYD==L#d.?*@*@@CSS4,--.0457@q7IJLQRT]^bTcdeTfg h h h h Lr   c                    t          j                     t          j        | j        d         |           t          j        d           t          j        d           t          j        d           t          j                     d S r  r  r  s     r   r  zRE_Forecaster.plot_res_histo  r  r   Nr  r  r   r   r   r  r    s            { { {# # #
} } }8} } }8  (    r   r  c                   X    e Zd ZdZddZg fdZg fdZd Zd Zg dd	fd
Z	g dfdZ
d	S )RE_Vector_ForecasterrV  r   c                     || _         || _        || _        d | _        d | _        d | _        d | _        g | _        d | _        d }g fd}|| _        || _	        d S )Nc                 v    g }| D ]3}g }|D ]}|                     |           |                    |           4|S r   rv  rt   r   r   r   new_rowelems        r   ru  z,RE_Vector_Forecaster.__init__.<locals>.ravel  Y    E & & ) )DNN4((((W%%%%Lr   c           
         t          | d         d                   }g }g }| D ]}g }g }|D ]n|                    fd|D                        |                    fdt          t          |                    t          |          z
  D                        o|                    |           |                    |           ||fS )Nr   c                      g | ]
}|         S r   r   r   r   rA  s     r   r   z>RE_Vector_Forecaster.__init__.<locals>.sep.<locals>.<listcomp>      $@$@$@T!W$@$@$@r   c                      g | ]
}|         S r   r   rE  s     r   r   z>RE_Vector_Forecaster.__init__.<locals>.sep.<locals>.<listcomp>      %\%\%\!d1g%\%\%\r   rs   rv  setrr   rt   	r   	pred_colsshape
array_predarray_otherr   pred_row	other_rowrA  s	           @r   sepz*RE_Vector_Forecaster.__init__.<locals>.sep      !QLLEJK . .	 ^ ^DOO$@$@$@$@i$@$@$@AAA$$%\%\%\%\E%LL8I8ICPYNN8Z%\%\%\]]]]!!(+++""9----{**r   )
r   r   r  rY  r6  r3  r  r^  ru  rR  )r   r   r   r  ru  rR  s         r   r   zRE_Vector_Forecaster.__init__}  s    ((


	 	 	   	+ 	+ 	+ 	+ 
r   c                 V   |j                                         }|j                                         }t          j        |                     |                    }t          j        |                     ||          d                   }t          j        ||g          }t          j        |                     ||          d                   }| j        dk    rgt          d          | _	        | j	        
                    ||           | j	        j        | _        | j                            | j	        j                   d S t!          d| j                  | _	        | j	        
                    ||           | j	        j        | _        | j                            | j	        j                   d S )NrF   r   Fr  r!  )r   r   rH   r   ru  rR  hstackr  r   rY  r    r"  r#  r  rt   r$  r   )r   rd  re  rL  X_listy_listX_arrayy_arrays           r   r    zRE_Vector_Forecaster.fit  sV   &&((&&((+djj0011+dhhvy99!<==,122+dhhvy99!<==:??)%@@@DJJNN7G,,,#z4DKtz/00000udjIIIDJJNN7G,,,#z4DKtz/00000r   c                 j   g }|j                                         }|j                                         }t          j        |                     |                    }t          j        |                     ||          d                   }t          j        ||g          }t          j        |                     ||          d                   }| j                            |          	                    d| j
        t          |                                                    }	t          j        |	          S NrF   r   )r   r   rH   r   ru  rR  rU  rY  ri  reshaper   rs   )
r   rh  r|  rL  rr  rV  rW  rX  rY  r}  s
             r   ri  zRE_Vector_Forecaster.predict  s    %%''%%''+djj0011+dhhvy99!<==w011TXXfi88;<<##F++33Ad6GYXX__aa{6"""r   c           
      h   g }g }g }g }	g }
t                      }|                    ||| j                  }|| _        |D ]@\  }}|j        |         }|j        |         }|j        |         }|j        |         }|                     |||           |                     |||                              d| j        t          |                    }|j	        
                                }t          j        |                     ||          d                                       d| j        t          |                    }|                    t          t!          |d         |d         | j        z                                  |                    |
                                d                    |                    |
                                d                    |	                    ||z
  
                                d                    |
                    d t!          |d         |d         | j        z   dz
            D             ||z
  dz                                                                  gz              Bt'          j        ||||	|
d                              d          | _        d S )NrL  rF   r   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z7RE_Vector_Forecaster.cross_val_roll.<locals>.<listcomp>  ro  r   rb   rp  r   )r*  r7  r   r6  rt  r    ri  r\  rs   r   r   rH   r   rR  rv  rp   rr   rJ  itemr   r   rw  r^  )r   r   r(   r.  r6  rL  r   rq  rr  r\  rx  ry  rz  r/  rd  re  rh  r|  r}  rW  s                       r   r~  z#RE_Vector_Forecaster.cross_val_roll  s   	WW##L&$:KLL+0 	9 	9'M<U=)7U=)7E,'6E,'688GW)8<<<LLYLGGOOPQRVRcehiresestt6M((**6KY G G JKKSSTUVZVgilmviwiwxx6>>$u\!_l1oHY6YZZ[[\\\>>&--//!,---fmmooa0111Vf_4466q9:::::hh%QaSWSdAdefAf*g*ghhhVOa'--//446678 9 9 9 9 *w7cn9BPS,U ,U V VV_V_`iVjVj 	r   c           
      h   g }g }g }g }	g }
t                      }|                    ||| j                  }|| _        |D ]@\  }}|j        |         }|j        |         }|j        |         }|j        |         }|                     |||           |                     |||                              d| j        t          |                    }|j	        
                                }t          j        |                     ||          d                                       d| j        t          |                    }|                    t          t!          |d         |d         | j        z                                  |                    |
                                d                    |                    |
                                d                    |	                    ||z
  
                                d                    |
                    d t!          |d         |d         | j        z   dz
            D             ||z
  dz                                                                  gz              Bt'          j        ||||	|
d                              d          | _        d S )Nr^  rF   r   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z6RE_Vector_Forecaster.cross_val_exp.<locals>.<listcomp>  ro  r   rb   rp  r   )r*  r9  r   r3  rt  r    ri  r\  rs   r   r   rH   r   rR  rv  rp   rr   rJ  r`  r   r   rw  r^  )r   r   r(   r.  r3  rL  r   rq  rr  r\  rx  ry  rz  r/  rd  re  rh  r|  r}  rW  s                       r   r  z"RE_Vector_Forecaster.cross_val_exp  s   	WW%%lE4;LMM
+0 	9 	9'M<U=)7U=)7E,'6E,'688GW)8<<<LLYLGGOOPQRVRcehiresestt6M((**6KY G G JKKSSTUVZVgilmviwiwxx6>>$u\!_l1oHY6YZZ[[\\\>>&--//!,---fmmooa0111Vf_4466q9:::::hh%QaSWSdAdefAf*g*ghhhVOa'--//446678 9 9 9 9 *w7cn9BPS,U ,U V VV_V_`iVjVj 	r   r2   r3   r  Nc           	         d| j         fd| j        fd}t          | j        j                  }t          t          | j        d                                                    }t          t          | j        d                                                    }t          t          |                    D ]}t          j
                     t          j        |||         d||         z              t          j        |||         d||         z   d	
           t          t          | j                  | j        z            }	| j        }
t          |	          D ]A}t          j        |||
z  |dz   |
z           ||         ||
z  |dz   |
z           d           Bt          j                     t          j                     |d k    rt          j        dt#          | j                  z   dz   t#          | j                  z   dz   t#          ||         d                   z   dz   t#          ||         d                   z              t          j        |           t          j                     d S Nr6  r3  r  rq  rr  target_r  prediction_r  r  rF   r  r  r5  r6  r7  r   r  r6  r3  rp   r^  r}   r   r   rr   rs   r   r   r   rI  r   r  r   r   r   r   r   r   r  labelsr   r  r   rR  rS  ry   r  r  r  s               r   r  z-RE_Vector_Forecaster.plot_targets_predictions  H   !)4; 7wPTPZF[\\	&''#ty188::;<<#t}5<<>>?@@s2ww 	$ 	$AMOOOK"Q%i&)&;<<<<K"Q%mfQi&?TRRRRC(()::;;A%E1XX a aAagqsEk12BqE!E'1Q3+:M4NX_`````MOOOKMMM}}^c$2C.D.DDGWW4,--.0457:9T?1;M7N7NOQVWY\]fgk]lmn]oYpYpq r r r r U####r   c                    t          j                     t          t          | j        d                                                    }t          t          |                    D ]}t          j                     t          j        ||         |d||         z              t          j	        d           t          j
        d           t          j        d           t          j                     t          j                     d S Nr\  	residual_)r  r  r  residualzResidual Histogramr   r   rp   r   r^  r   rr   rs   r  r   r   r   r  r   r   r  rj  r   ry   s        r   r  z"RE_Vector_Forecaster.plot_res_hist      dok299;;<==s1vv 	 	AMOOOK!V[6!95LMMMMM'"""M*%%%L-...MOOOKMMMM	 	r   r  r  r   r   r   r;  r;  x  s                B 13 1 1 1 1" 35 	# 	# 	# 	#k k k6k k k6 7Foot    * .=__ 
 
 
 
 
 
r   r;  c                   2    e Zd ZdZd Zd Zd ZddZd ZdS )	RES_ForecasterrV  c                 L    || _         || _        || _        || _        d | _        d S r   )r   r   r  r"  r^  )r   r   r   coefs	intercepts        r   r   zRES_Forecaster.__init__  s+    ((#r   c                    |j         }t                      | _        | j        | j        _        | j        | j        _        | j                            |                                                                          }t          j
        |          S r   )r   r   rY  r  r$  r"  ri  ru  r   rH   r   )r   rh  r}  s      r   rM  zRES_Forecaster.fit_predict  sk    %''
;
 $
##F++1133::<<{6"""r   c           	      &   g }g }g }g }g }|D ]P}|j         |g         }	t          t          ||| j        z                       }
|j         |         j                                        }|                     |	          }|                    |
           |                    |                                           |                    |                                           |                    ||z
                                             |                    d t          ||| j        z   dz
            D             t          j
        ||z
  dz            gz              Rt          j        |||||d                              d          | _        d S )Nc                 &    g | ]}t           j        S r   rl  rn  s     r   r   z,RES_Forecaster.cross_val.<locals>.<listcomp>2      bbbQuybbbr   rF   rb   rp  r   )rt  rp   rr   r   r   ru  rM  rv  r   rH   rJ  r   r   rw  r^  r   r   r(   r.  r   rq  rr  r\  rx  rh  r{  r|  r}  s                r   	cross_valzRES_Forecaster.cross_val#  s   	( 
	5 
	5LE<.)6eL,AR2RSSTT;E,'.44666$$V,,6>>+&&&>>&--//***fmmoo...Vf_4466777::bb%lTM^>^_`>`*a*abbb*fvo12234 5 5 5 5 *g`k8As,T ,T U UU^U^_hUiUi 	r   Nc                 D   t          j                     t          | j        j                  }t          | j        d                   }t          | j        d                   }t          j        ||d           t          j        ||dd           t          t          | j                  | j        z            }| j        }t          |          D ];}t          j        |||z  |dz   |z           |||z  |dz   |z           d	
           <t          j
                     t          j                     |d k    rBt          j        dt          | j                  z   dz   t          | j                  z              nt          j        |           t          j                     d S Nrq  rr  r  r  r  r  r  rF   r  r  r5  r6  r   r   rp   r^  r}   r   rI  rs   r   rr   r  r   r   r   r   r   r   r   r   rR  rS  r  r  ry   s           r   r  z'RES_Forecaster.plot_targets_predictions6  u   &''$/),--$/-011Abx((((Ab|t<<<<DO$$T%6677!q 	Z 	ZAK!E'1Q3+-.1U7AaC;3F0GQXYYYYYD==L#d.?*@*@@CSSVYZ^ZkVlVllmmmmLr   c                    t          j                     t          j        | j        d         |           t          j        d           t          j        d           t          j        d           t          j                     d S r  r  r  s     r   r  zRES_Forecaster.plot_res_histH  r  r   r   	r+   r,   r-   r  r   rM  r}  r  r  r   r   r   rt  rt    sq           # # #j j j&   $    r   rt  c                   H    e Zd ZdZd Zd Zd Zg dfdZd
dZg dfd	Z	dS )RES_Vector_ForecasterrV  c                 x    || _         || _        || _        || _        d | _        d }g fd}|| _        || _        d S )Nc                 v    g }| D ]3}g }|D ]}|                     |           |                    |           4|S r   r>  r?  s        r   ru  z-RES_Vector_Forecaster.__init__.<locals>.ravel\  rB  r   c           
         t          | d         d                   }g }g }| D ]}g }g }|D ]n|                    fd|D                        |                    fdt          t          |                    t          |          z
  D                        o|                    |           |                    |           ||fS )Nr   c                      g | ]
}|         S r   r   rE  s     r   r   z?RES_Vector_Forecaster.__init__.<locals>.sep.<locals>.<listcomp>l  rF  r   c                      g | ]
}|         S r   r   rE  s     r   r   z?RES_Vector_Forecaster.__init__.<locals>.sep.<locals>.<listcomp>m  rH  r   rI  rK  s	           @r   rR  z+RES_Vector_Forecaster.__init__.<locals>.sepd  rS  r   )r   r   r  r"  r^  ru  rR  )r   r   r   rv  rw  ru  rR  s          r   r   zRES_Vector_Forecaster.__init__V  sc    ((#	 	 	   	+ 	+ 	+ 	+ 
r   c                    t                      | _        | j        | j        _        | j        | j        _        |j                                        }|j                                        }t          j        | 	                    |                    }t          j        | 
                    ||          d                   }t          j        ||g          }t          j        | 
                    ||          d                   }| j                            |                              d| j        t          |                                                    }t          j        |          S r[  )r   rY  r  r$  r"  r   r   rH   r   ru  rR  rU  ri  r\  r   rs   )	r   rh  r|  rL  rV  rW  rX  rY  r}  s	            r   rM  z!RES_Vector_Forecaster.fit_predicts  s   %''
;
 $
%%''%%''+djj0011+dhhvy99!<==w011TXXfi88;<<##F++33Ad6GYXX__aa{6"""r   c           
         g }g }g }g }g }	|D ]}|j         |g         }
|j         |g         }|                     |
||          }|j                                        }t	          j        |                     ||          d                                       d| j        t          |                    }|
                    t          t          ||| j        z                                  |
                    |                                d                    |
                    |                                d                    |
                    ||z
                                  d                    |	
                    d t          ||| j        z   dz
            D             ||z
  dz                                                                  gz              t          j        |||||	d                              d          | _        t          j        |||||	d                              d          | _        d S )Nr^  r   rF   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z3RES_Vector_Forecaster.cross_val.<locals>.<listcomp>  r{  r   rb   rp  r   )rt  rM  r   r   rH   r   rR  r\  r   rs   rv  rp   rr   rJ  r`  r   r   rw  r^  )r   r   r(   r.  rL  r   rq  rr  r\  rx  rh  r|  r}  rW  s                 r   r}  zRES_Vector_Forecaster.cross_val  s>   	( 	8 	8LE<.)6E<.)6$$VVY??6M((**6KY G G JKKSSTUVZVgilmviwiwxx6>>$u\<$BS3STTUUVVV>>&--//!,---fmmooa0111Vf_4466q9:::::bb%lTM^>^_`>`*a*abbbF?Q&,,..335567 8 8 8 8 *g`k8As,T ,T U UU^U^_hUiUi 	 *g`k8As,T ,T U UU^U^_hUiUi 	r   rc  c           	         t          | j        j                  }t          t          | j        d                                                    }t          t          | j        d                                                    }t          t          |                    D ]K}t          j                     t          j	        |||         d||         z              t          j	        |||         d||         z   d           t          t          | j                  | j        z            }| j        }t          |          D ]A}t          j	        |||z  |dz   |z           ||         ||z  |dz   |z           d	
           Bt          j                     t          j                     t          j        dt          | j                  z   dz   t          | j                  z              Mt          j                     d S Nrq  rr  rf  r  rg  r  r  rF   r  r  r5  r6  rp   r^  r}   r   r   rr   rs   r   r   r   rI  r   r  r   r   r   r   r   	r   rj  r   rR  rS  ry   r  r  r  s	            r   r  z.RES_Vector_Forecaster.plot_targets_predictions     %&&qdoi07799:;;rdom4;;==>??rc"gg 
m 
m1=???;qAY%:;;;;;qA]VAY%>DQQQQ3t''(99::1$5!HH ` `q{1QuWac5[012a55!A#u9L3MW^_____=???;===<T->)?)??BRRUXY]YjUkUkkllll{}}}}}r   Nc                    |d k    r't          j                    }t          j                    }n|}t          t	          | j        d                                                    }t          t	          | j        d                                                    }|                    |d         |d         ddd           |                    |d         |d         d	d
d           t          t          | j                  | j
        z            }| j
        }t          |          D ]I}	|                    |d         |	|z  |	dz   |z           |d         |	|z  |	dz   |z           dd           J|d k    rD|                    dt          | j                  z   dz   t          | j
                  z              d S |                    |           d S Nrq  rr  r   rF   rf  red.)r  r  markerrg  r  oranger  r  r  r  )r  r  r5  r6  r   r   axesrp   r   r^  r   r   rI  rs   r   rr   	set_titler   r   
r   r  r   figaxr   r  r  r  r  s
             r   #plot_targets_predictions_as_vectorsz9RES_Vector_Forecaster.plot_targets_predictions_as_vectors  s   4<<-//CBBBdoi07799:;;dom4;;==>??
!ad)USJJJ
!ad-4RRRDO$$T%6677!q 	i 	iAGGAaD5!A#u,-qtAeGQqS%K4G/HRYdgGhhhhD==LL#d.?*@*@@CSSVYZ^ZkVlVllmmmmmLLr   c                    t          j                     t          t          | j        d                                                    }t          t          |                    D ]}t          j                     t          j        ||         |d||         z              t          j	        d           t          j
        d           t          j        d           t          j                     t          j                     d S rm  rp  rq  s        r   r  z#RES_Vector_Forecaster.plot_res_hist      }T_[188::;<<qc!ff  1=???;qtFK&)4KLLLL=!!!=$$$<,---=???;==== r   NN
r+   r,   r-   r  r   rM  r}  r  r  r  r   r   r   r  r  Q  s           :# # #j j j, 1@            $ .=__ 
 
 
 
 
 
r   r  c                   @    e Zd ZdZddZd Zd Zd Zd Zdd	Z	d
 Z
dS )DE_ForecasterrV  r   c                     || _         || _        || _        d | _        d | _        d | _        t          j        d t          | j         dd          D             dgz             | _	        d | _
        d| _        d S )Nc                 8    g | ]}d t          |          z   dz   S r   r   r   s     r   r   z*DE_Forecaster.__init__.<locals>.<listcomp>  s'    /j/j/jqAs0B/j/j/jr   r   rh   r   r}   rF   )r   r   r  rY  r6  r3  r   r   rr   r  r^  counterr  s       r   r   zDE_Forecaster.__init__  s    ((


&/j/jERVRcdefhLiLi/j/j/jntmu/uvvvr   c                 T   | j         dk    rt          d          | _        | j                            |j        |j                   | j        j        | _        | j        j        d         | j        dt          | j
                  z   <   | xj
        dz  c_
        d S t          d| j                   | _        | j                            |j        |j                   | j        j        | _        | j        j        d         | j        dt          | j
                  z   <   | xj
        dz  c_
        d S )Nr   Fr  zrun rF   r!  )r  r   rY  r    r   r"  r#  r$  r  r   r  r   r%  s      r   r    zDE_Forecaster.fit  s    :??)%@@@DJJNN7>7>:::#z4D48J4DQ4GDKs4<0001LL1LLLLudjIIIDJJNN7>7>:::"j3DO48J4DQ4GDKs4<0001LL1LLLLr   c                    g }|j         }t          | j                  D ]}| j                            |                                                                          }|                    |           |                                d         }|dd         |z   |d         gz   g}t          j	        |          }t          j	        |          S )Nr   rF   rh   )
r   rr   r   rY  ri  ru  r   rv  rH   r   )r   rh  rr  ry   r}  s        r   ri  zDE_Forecaster.predict  s    t()) 	) 	)AZ''//5577>>@@Fv&&&]]__Q'FQrTlV+vbzl:;F[((FF{;'''r   c           	      F   g }g }g }g }g }	g }
t                      }|                    ||d          }|| _        |D ]\  }}|j        |         }|j        |         }|                     ||           |j        |         }t          t          |d         |d         | j        z                       }|d         j        |         j        	                                }t          j        |                     |                    }|                    |           |                    |                                           |                    |                                           |                    ||z
                                             |	                    d t          |d         |d         | j        z   dz
            D             t          j        ||z
  dz            gz              t!          j        |||||	d                              d          | _        d S )NrF   r   y0c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z0DE_Forecaster.cross_val_roll.<locals>.<listcomp>   ro  r   rb   rp  r   )r*  r7  r6  rt  r    rp   rr   r   r   ru  rH   r   ri  rv  r   rJ  r   r   rw  r^  r-  s                       r   r~  zDE_Forecaster.cross_val_roll  s   	WW##L&!<<+0 	5 	5'M<U=)7U=)788GW%%%E,'6eLO\!_tGX5XYYZZ;dGK,399;;6KV 4 4556>>+&&&>>&--//***fmmoo...Vf_4466777::hh%QaSWSdAdefAf*g*ghhh*fvo12234 5 5 5 5 *g`k8As,T ,T U UU^U^_hUiUi 	r   c           	      F   g }g }g }g }g }	g }
t                      }|                    ||d          }|| _        |D ]\  }}|j        |         }|j        |         }|                     ||           |j        |         }t          t          |d         |d         | j        z                       }|d         j        |         j        	                                }t          j        |                     |                    }|                    |           |                    |                                           |                    |                                           |                    ||z
                                             |	                    d t          |d         |d         | j        z   dz
            D             t          j        ||z
  dz            gz              t!          j        |||||	d                              d          | _        d S )NrF   r   r  c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z/DE_Forecaster.cross_val_exp.<locals>.<listcomp>  ro  r   rb   rp  r   )r*  r9  r3  rt  r    rp   rr   r   r   ru  rH   r   ri  rv  r   rJ  r   r   rw  r^  r2  s                       r   r  zDE_Forecaster.cross_val_exp  s   	WW%%lE1==
+0 	5 	5'M<U=)7U=)788GW%%%E,'6eLO\!_tGX5XYYZZ;dGK,399;;6KV 4 4556>>+&&&>>&--//***fmmoo...Vf_4466777::hh%QaSWSdAdefAf*g*ghhh*fvo12234 5 5 5 5 *g`k8As,T ,T U UU^U^_hUiUi 	r   Nc                    dt          | j                  fdt          | j                  fd}t          j                     t          | j        j                  }t          | j        d                   }t          | j        d                   }t          j        ||d           t          j        ||dd	d
           t          t          | j                  | j        z            }| j        }t          |          D ];}	t          j        ||	|z  |	dz   |z           ||	|z  |	dz   |z           d           <t          j                     t          j                     |d k    rft          j        dt          | j                  z   dz   t          | j                  z   dz   ||         d         z   dz   ||         d         z              nt          j        |           t          j                     d S )Nr6  r3  r  rq  rr  r  r  r  r  r  r  rF   r  r  r5  r6  r7  r   r  r8  r  s
             r   r  z&DE_Forecaster.plot_targets_predictions  s   !)3t{+;+; <GUXY]YcUdUdKeff	&''$/),--$/-011Abx((((Ab|tXNNNNDO$$T%6677!q 	Z 	ZAK!E'1Q3+-.1U7AaC;3F0GQXYYYYYD==L#d.?*@*@@CSS4,--.0457@q7IJLQRT]^bTcdeTfg h h h h Lr   c                    t          j                     t          j        | j        d         |           t          j        d           t          j        d           t          j        d           t          j                     d S r  r  r  s     r   r  zDE_Forecaster.plot_res_hist2  r  r   r  r   r  r   r   r   r  r    s         	 	 	 	  	( 	( 	(j j j4j j j4   (    r   r  c                   X    e Zd ZdZddZg fdZg fdZd Zd Zg dd	fd
Z	g dfdZ
d	S )DE_Vector_ForecasterrV  r   c                     || _         || _        || _        d | _        d | _        d | _        d | _        t          j                    | _        d | _	        d| _
        d }|| _        d S )NrF   c                 v    g }| D ]3}g }|D ]}|                     |           |                    |           4|S r   r>  r?  s        r   ru  z,DE_Vector_Forecaster.__init__.<locals>.ravelK  rB  r   )r   r   r  rY  r6  r3  r  r   r   r^  r  ru  )r   r   r   r  ru  s        r   r   zDE_Vector_Forecaster.__init__@  so    ((


&((	 	 	 


r   c                    |j                                         }|dg         j                                         }t          j        |                     |                    }t          j        |                     |                    t          j        |t          j        |d          g          }d d |f         }fdt          | j        dd          D             d t          j	        d                   D             z   d t          t          j	        d                             t          |          z
  D             z   }|| j        _        | j        dk    rCt          d	
          | _        | j                            ||           | j        j        | _        d S t'          d	| j                  | _        | j                            ||           | j        j        | _        d S )Nr  rF   r   c                     g | ]G}t          j        d                    D ]*}dt          |          z   dz   t          |          z   dz   +HS )rF   r   ,r   )rr   rM  r   )r   r   r   rY  s      r   r   z,DE_Vector_Forecaster.fit.<locals>.<listcomp>[  sY    yyyQafgngtuvgwaxaxyy\]73q66>#%c!ff,S0yyyyr   r   rh   c                 2    g | ]}d t          |          z   S zbeta r   r   s     r   r   z,DE_Vector_Forecaster.fit.<locals>.<listcomp>\  s"    DDDqGCFFNDDDr   c                 8    g | ]}d t          |          z   dz   S zy_(0,r   r   r   s     r   r   z,DE_Vector_Forecaster.fit.<locals>.<listcomp>\  sB      FS  FS  FS]^gcRSffnUXFX  FS  FS  FSr   Fr  r!  )r   r   rH   r   ru  rU  deleterr   r   rM  rJ  r  r}   r  r   rY  r    r"  r#  r   )	r   rd  re  rL  rV  rW  rX  r   rY  s	           @r   r    zDE_Vector_Forecaster.fitT  s   &&(($'..00+djj0011+djj0011,gyq)Q)Q)QRSS!!!Y,'yyyy%@QRSTV:W:WyyyDDE'-2B,C,CDDDE FS  FScfglmtmz{|m}g~g~cc  CF  GP  CQ  CQ  dQ  FS  FS  FSS#:??)%@@@DJJNN7G,,,#z4D
 udjIIIDJJNN7G,,,"j3DOOOr   c           	         g }|j                                         }|j                                         }t          | j                  D ]l}t	          j        |                     |                    }t	          j        |d         |                                       dd          }	t	          j        |t	          j	        |	|d          g          }| j
                            |                              dd                                          }
|                    |
           t	          j        |
                                          }
|	                                }t          |          D ]\  }}|
|         ||<   t          |          }|d         dd         |gz   |d         d         gz   g}nt	          j        |          S )Nr   rF   rh   r   )r   r   rr   r   rH   r   ru  r\  rU  r  rY  ri  rv  r  rq   )r   rh  r|  rL  rr  rV  rW  ry   rX  rY  r}  X_newr   values                 r   ri  zDE_Vector_Forecaster.predictl  s   %%''%%''t()) 	C 	CAk$**V"4"455Gk&)A,//77"==G\7EL)RS,T,T,T"UVVFZ''//77"==DDFFFv&&&[((..00FMMOOE'	22 + +
U%c{e%LLEQi"o/6!9R=/ABFF{;'''r   c           
         g }g }g }g }	g }
t                      }|                    ||| j                  }|| _        |D ]\  }}|j        |         }|j        |         }|j        |         }|j        |         }|                     |||           |                     |||          }t          j        |j	        
                                          d         d d |f         }|                    t          t          |d         |d         | j        z                                  |                    |
                                           |                    |
                                           |	                    ||z
  
                                           |
                    d t          |d         |d         | j        z   dz
            D             ||z
  dz                                                                  gz              t!          j        ||||	|
d                              d          | _        d S )Nr^  r   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z7DE_Vector_Forecaster.cross_val_roll.<locals>.<listcomp>  ro  r   rF   rb   rp  r   )r*  r7  r   r6  rt  r    ri  rH   r   r   r   rv  rp   rr   rJ  r`  r   r   rw  r^  r   r   r(   r.  r6  rL  r   rq  rr  r\  rx  ry  rz  r/  rd  re  rh  r|  r}  s                      r   r~  z#DE_Vector_Forecaster.cross_val_roll}  s1   	WW##L&$:KLL+0 	9 	9'M<U=)7U=)7E,'6E,'688GW)8<<<LL;;6K 4 4 6 677:111Y;G6>>$u\!_l1oHY6YZZ[[\\\>>&--//***fmmoo...Vf_4466777::hh%QaSWSdAdefAf*g*ghhhVOa'--//446678 9 9 9 9 *w7cn9BPS,U ,U V VV_V_`iVjVj 	r   c           
         g }g }g }g }	g }
t                      }|                    ||| j                  }|| _        |D ]\  }}|j        |         }|j        |         }|j        |         }|j        |         }|                     |||           |                     |||          }t          j        |j	        
                                          d         d d |f         }|                    t          t          |d         |d         | j        z                                  |                    |
                                           |                    |
                                           |	                    ||z
  
                                           |
                    d t          |d         |d         | j        z   dz
            D             ||z
  dz                                                                  gz              t!          j        ||||	|
d                              d          | _        d S )Nr^  r   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z6DE_Vector_Forecaster.cross_val_exp.<locals>.<listcomp>  ro  r   rF   rb   rp  r   )r*  r9  r   r3  rt  r    ri  rH   r   r   r   rv  rp   rr   rJ  r`  r   r   rw  r^  r   r   r(   r.  r3  rL  r   rq  rr  r\  rx  ry  rz  r/  rd  re  rh  r|  r}  s                      r   r  z"DE_Vector_Forecaster.cross_val_exp  s1   	WW%%lE4;LMM
+0 	9 	9'M<U=)7U=)7E,'6E,'688GW)8<<<LL;;6K 4 4 6 677:111Y;G6>>$u\!_l1oHY6YZZ[[\\\>>&--//***fmmoo...Vf_4466777::hh%QaSWSdAdefAf*g*ghhhVOa'--//446678 9 9 9 9 *w7cn9BPS,U ,U V VV_V_`iVjVj 	r   rc  Nc           	         d| j         fd| j        fd}t          | j        j                  }t          t          | j        d                                                    }t          t          | j        d                                                    }t          t          |                    D ]}t          j
                     t          j        |||         d||         z              t          j        |||         d||         z   d	
           t          t          | j                  | j        z            }	| j        }
t          |	          D ]A}t          j        |||
z  |dz   |
z           ||         ||
z  |dz   |
z           d           Bt          j                     t          j                     |d k    rt          j        dt#          | j                  z   dz   t#          | j                  z   dz   t#          ||         d                   z   dz   t#          ||         d                   z              t          j        |           t          j                     d S re  rh  ri  s               r   r  z-DE_Vector_Forecaster.plot_targets_predictions  rk  r   c                    t          j                     t          t          | j        d                                                    }t          t          |                    D ]}t          j                     t          j        ||         |d||         z              t          j	        d           t          j
        d           t          j        d           t          j                     t          j                     d S rm  rp  rq  s        r   r  z"DE_Vector_Forecaster.plot_res_hist  rr  r   r  r  r   r   r   r  r  ;  s            ( 13 4 4 4 40 35 ( ( ( ("k k k4k k k4 7Foot    * .=__ 
 
 
 
 
 
r   r  c                   2    e Zd ZdZd Zd Zd ZddZd ZdS )	DES_ForecasterrV  c                 >    || _         || _        || _        d | _        d S r   )r   r   r  r^  )r   r   r   rv  s       r   r   zDES_Forecaster.__init__  s$    ((r   c                    g }|j         }t          j        | j                  }d t	          | j        dd          D             dgz   }t          j        ||          | _        t	          | j                  D ]}t          j	        ||          
                                }|                    |           |
                                d         }|dd         |z   |d         gz   g}t          j        |          }t          j        |          S )Nc                 8    g | ]}d t          |          z   dz   S r   r   r   s     r   r   z.DES_Forecaster.fit_predict.<locals>.<listcomp>  s'    MMM!73q66>#%MMMr   r   rh   r   r  rF   )r   rH   r   r  rr   r   r   r   r   dotr   rv  )r   rh  rr  r  r   ry   r}  s          r   rM  zDES_Forecaster.fit_predict  s    T[))MMuT5Fq/L/LMMMQWPXXmFG<<<t()) 	) 	)AYvv..5577Fv&&&]]__Q'FQrTlV+vbzl:;F[((FF{;'''r   c           	      V   g }g }g }g }g }|D ]h}|j         |g         }	t          t          ||| j        z                       }
|d         j         |
         j                                        }t          j        |                     |	                    }|	                    |
           |	                    |
                                           |	                    |
                                           |	                    ||z
  
                                           |	                    d t          ||| j        z   dz
            D             t          j        ||z
  dz            gz              jt          j        |||||d                              d          | _        d S )Nr  c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z,DES_Forecaster.cross_val.<locals>.<listcomp>  r{  r   rF   rb   rp  r   )rt  rp   rr   r   r   ru  rH   r   rM  rv  r   rJ  r   r   rw  r^  r|  s                r   r}  zDES_Forecaster.cross_val  s   	( 
	5 
	5LE<.)6eL,AR2RSSTT;dGK,399;;6K 0 0 8 8996>>+&&&>>&--//***fmmoo...Vf_4466777::bb%lTM^>^_`>`*a*abbb*fvo12234 5 5 5 5 *g`k8As,T ,T U UU^U^_hUiUi 	r   Nc                 D   t          j                     t          | j        j                  }t          | j        d                   }t          | j        d                   }t          j        ||d           t          j        ||dd           t          t          | j                  | j        z            }| j        }t          |          D ];}t          j        |||z  |dz   |z           |||z  |dz   |z           d	
           <t          j
                     t          j                     |d k    rBt          j        dt          | j                  z   dz   t          | j                  z              nt          j        |           t          j                     d S r  r  r  s           r   r  z'DES_Forecaster.plot_targets_predictions  r  r   c                    t          j                     t          j        | j        d         |           t          j        d           t          j        d           t          j        d           t          j                     d S r  r  r  s     r   r  zDES_Forecaster.plot_res_hist  r  r   r   r  r   r   r   r  r    sq           
( ( (j j j&   $    r   r  c                   J    e Zd ZdZd Zd Zd Zg ddfdZd
dZg dfd	Z	dS )DES_Vector_ForecasterrV  c                     || _         || _        t          j        |          | _        d | _        d | _        d }|| _        d S )Nc                 v    g }| D ]3}g }|D ]}|                     |           |                    |           4|S r   r>  r?  s        r   ru  z-DES_Vector_Forecaster.__init__.<locals>.ravel#  rB  r   )r   r   rH   r   model_coefs_rv  r^  ru  )r   r   r   rv  ru  s        r   r   zDES_Vector_Forecaster.__init__  sN    ((!K..
	 	 	 


r   c           	      .    g }j                                         }|j                                         }t          |d         d                   fdt           j        dd          D             d t                    D             z   d t          t                              t          |          z
  D             z   }t          j        |           _        t          |          D ]'\  }}	 j
        |          j        t          |	          <   (t           j                  D ]V}
t          j                             |                    }t          j        |d         |
                                       dd          }t          j        |t          j        ||d          g           fd	t          t          |                    D             g}|                    |           t          j        |                                          }|                                }t          |          D ]\  }}||         ||<   t)          |          }|d         dd         |gz   |d         d         gz   g}Xt          j        |          S )
Nr   c                     g | ]<}t                    D ]*}d t          |          z   dz   t          |          z   dz   +=S )r   r  r   )rr   r   )r   r   r   dims      r   r   z5DES_Vector_Forecaster.fit_predict.<locals>.<listcomp>1  sP    lllQafgjakakll\]73q66>#%c!ff,S0llllr   rh   c                 2    g | ]}d t          |          z   S r  r   r   s     r   r   z5DES_Vector_Forecaster.fit_predict.<locals>.<listcomp>2  s"    888WSVV^888r   c                 8    g | ]}d t          |          z   dz   S r  r   r   s     r   r   z5DES_Vector_Forecaster.fit_predict.<locals>.<listcomp>2  s(    9y9y9yQR'#a&&.:L9y9y9yr   r  rF   r   c                     g | ]:}t          j        d          j        |                                                   ;S r  )rH   r  r  r`  )r   r   rh  r   s     r   r   z5DES_Vector_Forecaster.fit_predict.<locals>.<listcomp>:  s=    hhhQuyD,=a,@AAFFHHhhhr   )r   r   rs   rr   r   rJ  r   r   r  r  r  r   r   rH   r   ru  r\  rU  r  rv  rq   )r   rh  r|  rL  rr  rV  rW  r   numpredry   rX  rY  r}  r  r   r  r  s   ``               @r   rM  z!DES_Vector_Forecaster.fit_predict,  st   %%''%%''&)A,llll%@QRSTV:W:Wlll88U3ZZ88899y9yWZ[`ad[e[eWfWfilmviwiwWw9y9y9yz&w777"9-- 	< 	<IC%)%6s%;DKD		""t()) 	C 	CAk$**V"4"455Gk&)A,//77"==G\7EL)RS,T,T,T"UVVFhhhhhRWX[\eXfXfRgRghhhiFv&&&[((..00FMMOOE'	22 + +
U%c{e%LLEQi"o/6!9R=/ABFF{;'''r   c           	         g }g }g }g }g }	|D ]}|j         |g         }
|j         |g         }t          t          ||| j        z                       }t	          j        |                     |
||                    }t	          j        |j                                                  d         d d |f         }|	                    |           |	                    |                                           |	                    |                                           |	                    ||z
                                             |		                    d t          ||| j        z   dz
            D             t	          j
        ||z
  dz            gz              t          j        |||||	d                              d          | _        d S )Nr   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z3DES_Vector_Forecaster.cross_val.<locals>.<listcomp>S  r{  r   rF   rb   rp  r   )rt  rp   rr   r   rH   r   rM  r   r   rv  rJ  r   r   rw  r^  )r   r   r(   r.  rL  r   rq  rr  r\  rx  rh  r|  r{  r}  s                 r   r}  zDES_Vector_Forecaster.cross_valC  s   	( 	5 	5LE<.)6E<.)6eL,AR2RSSTT;K 0 0 K KLL6K 4 4 6 677:111Y;G6>>+&&&>>&--//***fmmoo...Vf_4466777::bb%lTM^>^_`>`*a*abbb*fvo12234 5 5 5 5 *g`k8As,T ,T U UU^U^_hUiUi 	r   rc  Nc           	      4   t          | j        j                  }t          t          | j        d                                                    }t          t          | j        d                                                    }t          t          |                    D ]g}t          j                     t          j	        |||         d||         z              t          j	        |||         d||         z   d           t          t          | j                  | j        z            }| j        }t          |          D ]A}	t          j	        ||	|z  |	dz   |z           ||         |	|z  |	dz   |z           d	
           Bt          j                     t          j                     |d k    rCt          j        dt          | j                  z   dz   t          | j                  z              St          j        |           it          j                     d S r  r  )
r   rj  r   r   rR  rS  ry   r  r  r  s
             r   r  z.DES_Vector_Forecaster.plot_targets_predictionsW  s   %&&qdoi07799:;;rdom4;;==>??rc"gg # #1=???;qAY%:;;;;;qA]VAY%>DQQQQ3t''(99::1$5!HH ` `q{1QuWac5[012a55!A#u9L3MW^_____=???;===tmm|NS1B-C-CCFVVY\]a]nYoYoopppp|E""""{}}}}}r   c                 ^   |d k    r't          j                    }t          j                    }n|}t          t	          | j        d                                                    }t          t	          | j        d                                                    }|                    |d         |d         ddd           |                    |d         |d         d	d
d           t          t          | j                  | j
        z            }| j
        }t          |          D ]I}|                    |d         ||z  |dz   |z           |d         ||z  |dz   |z           dd           J|                    dt          | j                  z   dz   t          | j
                  z              d S r  r  )	r   r  r  r  r   r  r  r  r  s	            r   r  z9DES_Vector_Forecaster.plot_targets_predictions_as_vectorsj  s   4<<-//CBBBdoi07799:;;dom4;;==>??
!ad)USIII
!ad-4RRRDO$$T%6677!q 	i 	iAGGAaD5!A#u,-qtAeGQqS%K4G/HRYdgGhhhh
^c$*;&<&<<?OORUVZVgRhRhhiiiiir   c                    t          j                     t          t          | j        d                                                    }t          t          |                    D ]}t          j                     t          j        ||         |d||         z              t          j	        d           t          j
        d           t          j        d           t          j                     t          j                     d S rm  rp  rq  s        r   r  z#DES_Vector_Forecaster.plot_res_histz  r  r   r   r  r   r   r   r  r    s           ( ( (.j j j( 1@    &j j j j  .=__ 
 
 
 
 
 
r   r  c                   R    e Zd ZdZg g ddddddfdZdd	Zd
 Zd Zd ZddZ	d Z
dS )RNN_Forecaster
    Description
    -----------
    This class enfolds some useful features within PyTorch's functional RNN models.  
    Trying to make it have the same methods and things as the other classes above.
    relur   MSEd   2   c                    || _         || _        || _        || _        t	          j                    t	          j                    t	          j                    d| _        || _	        d | _
        t          t          t          t          d| _        || _        d | _        t$          t&          d| _        || _        d | _        t/                      t1                      d| _        || _        d | _        g | _        d | _        |	| _        |
| _        d | _         d | _!        tE          j#        tD          j$        %                                rdnd          | _#        d | _&        d | _'        d S Nr  linearsoftplus)unit	symmetricrJ   abr   )r  MAEcudacpu)(r   r   
rnn_layers	nn_layersnnReLUIdentitySoftplusactivation_dictactivation_name
activationr   r]   rf   r/   scaler_dictscaler_namescalerr   r   optimizer_dictoptimizer_name	optimizerr   r   	loss_dict	loss_namelosstraining_mse_listtraining_mse_resultsepochsr>  r^  rY  torchdevicer  is_availabler6  r3  )r   r   r   r  r  r  r  r  r  r  r>  s              r   r   zRNN_Forecaster.__init__  s'   (($"(*		R[]]XZXcXeXeff)$/>NW`hqrr!&)488'!(688<<	!#$(!$
lUZ-D-D-F-F#Q66ERR


r   Nc                 0    G d dt           j                  }| j        | j                 | _        | j        | j                 | _         || j        | j	        | j                  | _
        | j
                            | j                    | j        | j        d                  | j
                                        fi | j        d         | _         | j        | j        d                  di | j        d         | _        t)          j        |j        d d d | j        f         j        t(          j                                      d                              | j                  }t)          j        |j        d d | j        d f         j        t(          j                                      d                              | j                  }t)          j        |j        t(          j                                      | j                  }| j                            t)          j        |                                |                                fd                     | j                            |          }| j                            |          }t?          |||          }tA          || j!        d	
          }|d k    rOt)          j        |d         j        d d d | j        f         j        t(          j                                      d                              | j                  }	t)          j        |d         j        d d | j        d f         j        t(          j                                      d                              | j                  }
t)          j        |d         j        t(          j                                      | j                  }| j                            |	          }	| j                            |          }| j
        "                                 tG          | j$                  D ]M}d}|D ]}| j        %                                 |\  }}}| 
                    ||          }|                     ||          }|&                                 | j        '                                 |j(        \  }}|||z  |z  z  }|tS          |          | j*        z  z  }|dz  dk    r|d k    rItW          dtY          |          z   dz   dz   tY          |-                                          z              
| j
        .                                 | j
                            | j                   t)          j/                    5  | 
                    |	|
          }||z
  dz  0                                -                                }tW          dtY          |          z   dz   dz   tY          tc          j2        |-                                d                    z   dz   dz   tY          tc          j2        |d                    z              d d d            n# 1 swxY w Y   | j
        "                                 MOtW          d           d S )Nc                   $     e Zd Z fdZd Z xZS )RNN_Forecaster.fit.<locals>.rnnc                 |   t                                                       	 || _        || _        t	          j        d|d         t          |          d          | _        t	          j        d|d         t          |          d          | _        t	          j	                    | _
        | j
                            t	          j        |d         |d                              t          dt          |                    D ]?}| j
                            t	          j        ||dz
           ||                              @|| _        d } || j                    || j                   | j
        D ]J}t          j                            |j                   t          j                            |j                   Kd S )NrF   r   T
input_sizehidden_size
num_layersbatch_firstin_featuresout_featuresc                    |                                  D ]p\  }}d|v r t          j                            |           )d|v r t          j                            |           Md|v rt          j                            |           qd S N	weight_ih	weight_hhbiasnamed_parametersr  initxavier_uniform_orthogonal_zeros_rnnnameparams      r   initialize_rnn_weightszHRNN_Forecaster.fit.<locals>.rnn.__init__.<locals>.initialize_rnn_weights      &)&:&:&<&< 1 1{tU%--72259999'4//7..u5555"dNN7>>%0001 1r   )superr   r  r  r  RNNrs   encoderdecoder
ModuleList
lin_layersrt   Linearrr   actr%  r&  weightr(  r"  )r   r  r  r  ry   r-  layer	__class__s          r   r   z(RNN_Forecaster.fit.<locals>.rnn.__init__  s   ww!!! ",t )t~ f!:a=_bcm_n_n  C  D  D  Dt| f!:a=_bcm_n_n  C  D  D  Dt|!#t%%bijm\efg\h&i&i&ijjjaI// o o1/((1Q3`ijk`l)m)m)mnnnn$tx1 1 1 &%dl333%%dl333 O . .57**5<8887>>%*----. .r   c                 R   t          j        t          | j                  |j        d         | j        d         |j                  }|                     ||          \  }}|                     ||          \  }}|j        \  }}}	|                    d|	          }| 	                     | j
        d         |                    }t          dt          | j                            D ]+}
| 	                     | j
        |
         |                    },|                    ||g          }|S Nr   r  rh   rF   )r  zerosrs   r  rM  r  r1  r2  r\  r6  r4  rr   r  )r   X_encX_dech0r!  h_ency_decr>  
seq_lengthr  ry   s              r   forwardz'RNN_Forecaster.fit.<locals>.rnn.forward  s   [T_!5!5u{1~tWXGYdidpqqq<<r225<<u55q6;k3
Jb55!3!3E!:!:;;q#dn"5"566 @ @A HH%7T_Q%7%>%>??EEz:&>??r   r+   r,   r-   r   rD  __classcell__r9  s   @r   r*  r    sG        . . . . .8
 
 
 
 
 
 
r   r*  )r  r  r  r   rF   dtyperb   r   Tr>  shuffle
   epoch: 	training_loss:    validation_loss: 
r   )3r  Moduler   r  r  r	  r
  r  r  r  rY  tor  r  r  
parametersr  r  r  r  r  tensorr   r   r   rv   	unsqueezer    catflattenr"   r	   r
   r>  trainrr   r  	zero_gradbackwardsteprM  rs   r   printr   r`  evalno_gradrJ  rH   ru   )r   rd  re  val_datar*  X_encoder_trainX_decoder_traindataset_trainbatches_trainX_encoder_valX_decoder_valy_valepoch
loss_epochbatchX_enc_batchX_dec_batchy_batchr}  
loss_batchr6  seq_lenmse_vals                          r   r    zRNN_Forecaster.fit  sh   '	 '	 '	 '	 '	") '	 '	 '	P .t/CDN4>2	Sdo4>`d`oppp

dk"""D,T-@-CDTZEZEZE\E\ww`d`stu`vww;d&t'7':;RRd>Nq>QRR,w|AAA6Ht7H6H4H'I'PZ_Zefffppqrssvvw{  xC  D  D,w|AAAd6G6H6H4H'I'PZ_Zefffppqrssvvw{  xC  D  D,w~u{CCCFFt{SS	?#:#:#<#<goo>O>O"PYZ[[[\\\+//@@+''00 &oPP"=tZ^___t <(8;MD<M;M9M(N(U_d_jkkkuuvwxx{{  }A  }H  I  I= <(84;L;M;M9M(N(U_d_jkkkuuvwxx{{  }A  }H  I  I=< 2EKHHHKKDKXX5;00??=;((//5
 	
4;'' 	 	EJ& 8 8((***491['K==!YYvw77
##%%%##%%%"(,j/77

#g,,t'888JRx1}}t##)c%jj047:KKcR\RaRaRcRcNdNddeeeeJOO%%%JMM$+... Z Z!%M=!I!I$)FNQ#6"<"<">">"C"C"E"Ei#e**4t;>OORUV[VablbqbqbsbstuVvVvRwRww $%':;=@WUVAWAW=X=XY Z Z ZZ Z Z Z Z Z Z Z Z Z Z Z Z Z Z
 J$$&&&&ds   CYY#	&Y#	c                    | j                                          | j                             | j                   t	          j        |j        d d d | j        f         j        t          j	                  
                    d                              | j                  }t	          j        |j        d d | j        d f         j        t          j	                  
                    d                              | j                  }| j                            |          }t	          j                    5  |                      ||          }| j                            |          cd d d            S # 1 swxY w Y   d S NrH  rb   rY  r_  rT  r  r  rV  r   r   r   rv   rW  r  r"   r`  r)   r   rh  X_encoder_testX_decoder_testr(   s        r   ri  zRNN_Forecaster.predict     

dk"""fk!!!4FT5F4F2F&G&NX]Xcdddnnopqqttuy  vA  B  Bfk!!!D4E4F4F2F&G&NX]Xcdddnnopqqttuy  vA  B  B..~>>]__ 	) 	)

>>::A;%%a((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)   20E//E36E3c           
         g }g }g }g }g }	t          |          }
t                      }|                    ||| j                  }|| _        |D ]\  }}|j        |         }|j        |         }|j        |         }|j        |         }|                     ||||g           |                     |                                          }t          j
        |j        t                                                                        | j                  }|                    t          t!          |d         |d         | j        z                                  |                    |                                           |                    |                                           |                    ||z
                                             |	                    d t!          |d         |d         | j        z   dz
            D             ||z
  dz                                                                  gz              t)          j        |||||	d                              d          | _        d S )	Nra  rH  r   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z1RNN_Forecaster.cross_val_roll.<locals>.<listcomp>,  ro  r   rF   rb   rp  r   rp   r*  r7  r   r6  rt  r    ri  rY  r  rV  r   rv   rT  r  rv  rr   r   rJ  r`  r   r   rw  r^  r   r   r(   r.  r6  r   rq  rr  r\  rx  keysry  rz  r/  rd  re  rh  r|  r}  s                      r   r~  zRNN_Forecaster.cross_val_roll  N   	L!!WW##L&$:KLL+0 	9 	9'M<U=)7U=)7E,'6E,'688GW&&1A8BBBLL((00226L>>>FFHHKKDKXX6>>$u\!_l1oHY6YZZ[[\\\>>&--//***fmmoo...Vf_4466777::hh%QaSWSdAdefAf*g*ghhhVOa'--//446678 9 9 9 9 *w7cn9BPS,U ,U V VV_V_`iVjVj 	r   c           
         g }g }g }g }g }	t          |          }
t                      }|                    ||| j                  }|| _        |D ]\  }}|j        |         }|j        |         }|j        |         }|j        |         }|                     ||||g           |                     |                                          }t          j
        |j        t          j                                                                      | j                  }|                    t          t!          |d         |d         | j        z                                  |                    |                                           |                    |                                           |                    ||z
                                             |	                    d t!          |d         |d         | j        z   dz
            D             ||z
  dz                                                                  gz              t)          j        |||||	d                              d          | _        d S )	Nr{  rH  r   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z0RNN_Forecaster.cross_val_exp.<locals>.<listcomp>G  ro  r   rF   rb   rp  r   rp   r*  r9  r   r3  rt  r    ri  rY  r  rV  r   rv   rT  r  rv  rr   r   rJ  r`  r   r   rw  r^  r   r   r(   r.  r3  r   rq  rr  r\  rx  r  ry  rz  r/  rd  re  rh  r|  r}  s                      r   r  zRNN_Forecaster.cross_val_exp1  R   	L!!WW%%lE4;LMM
+0 	9 	9'M<U=)7U=)7E,'6E,'688GW&&1A8BBBLL((00226LDDDLLNNQQRVR]^^6>>$u\!_l1oHY6YZZ[[\\\>>&--//***fmmoo...Vf_4466777::hh%QaSWSdAdefAf*g*ghhhVOa'--//446678 9 9 9 9 *w7cn9BPS,U ,U V VV_V_`iVjVj 	r   c                    dt          | j                  fdt          | j                  fd}t          | j        j                  }| j        d         }| j        d         }t          j                     t          j        ||d           t          j        ||dd	
           t          t          | j                  | j        z            }| j        }t          |          D ];}	t          j        ||	|z  |	dz   |z           ||	|z  |	dz   |z           d           <t          j                     t          j                     |d k    rft          j        dt          | j                  z   dz   t          | j                  z   dz   ||         d         z   dz   ||         d         z              nt          j        |           t          j                     d S r4  r   r6  r3  rp   r^  r}   r   r   r   rI  rs   r   rr   r  r   r   r   r   r  s
             r   r  z'RNN_Forecaster.plot_targets_predictionsL     !)3t{+;+; <GUXY]YcUdUdKeff	&''_Y'_]+Abx((((Ab|>>>>DO$$T%6677!q 	Z 	ZAK!E'1Q3+-.1U7AaC;3F0GQXYYYYYD==L#d.?*@*@@CSS4,--.0457@q7IJLQRT]^bTcdeTfg h h h h Lr   c                    t          j                     t          j        | j        d         |           t          j        d           t          j        d           t          j        d           t          j                     d S r  r  r  s     r   r  zRNN_Forecaster.plot_res_hist`  r  r   r   r  r   r   r   r  r    s          ACPRag"USWY   :` ` ` `D) ) )k k k6k k k6   (    r   r  c                   b    e Zd ZdZg g dg ddddfdZdd	Zd
 Zd Zd Zg ddfdZ	g dfdZ
dS )RNN_Vector_Forecaster
    Description
    -----------
    This class enfolds some useful features within keras' functional RNN models.  
    Trying to make it have the same methods and things as the other classes above.
    r  r   r  r  r  c                    || _         || _        || _        || _        t	          j                    t	          j                    t	          j                    d| _        || _	        d | _
        t          t          t          t          d| _        || _        d | _        t$          t&          d| _        || _        d | _        t/                      t1                      d| _        || _        d | _        g | _        d | _        |	| _        |
| _        d | _         d | _!        tE          j#        tD          j$        %                                rdnd          | _#        d | _&        d | _'        tQ          | j                  | _)        d S r  )*r   r   r  r  r  r  r  r  r   r  r  r   r]   rf   r/   scalers_dictscalers_namesscalersr   r   r  r  r  r   r   r	  r
  r  r  r  r  r>  r^  rY  r  r  r  r  r6  r3  rs   in_size)r   r   r   r  r  r  r  r  r  r  r>  s              r   r   zRNN_Vector_Forecaster.__init__p  s9   (($"(*		R[]]XZXcXeXeff)%0?OXairss$&)488'!(688<<	!#$(!$
lUZ-D-D-F-F#Q66ERR
4-..r   Nc                      G d dt           j                  } j         j                  _         j         j                  _         | j         j	         j         j
                   _         j                             j                     j         j        d                   j                                        fi  j        d          _         fdt%           j
                  D              _        t)          j        |j        d d d  j        f         j                                        t(          j                                       j                  }t)          j        |j        d d  j        d f         j                                        t(          j                                       j                  }t)          j        |j                                        t(          j                                       j                  }t%           j
                  D ]}|d d d d |f                                         }	||vr8t)          j        |	|d d d d |f                                         fd          }	nJt)          j        |	|d d d d |                    |          f                                         fd          }	 j        |                             |	           t%           j
                  D ]} j        |                             |d d d d |f                   |d d d d |f<   ||vr8 j        |                             |d d d d |f                   |d d d d |f<   u|                    |          }
 j        |                             |d d d d |
f                   |d d d d |
f<   tA          |||          }tC          | j"        d	
          }|d k    rt)          j        |d         j        d d d  j        f         j                                        t(          j                                       j                  }t)          j        |d         j        d d  j        d f         j                                        t(          j                                       j                  }t)          j        |d         j                                        t(          j                                       j                  }t%           j
                  D ]} j        |                             |d d d d |f                   |d d d d |f<   ||vr8 j        |                             |d d d d |f                   |d d d d |f<   u|                    |          }
 j        |                             |d d d d |
f                   |d d d d |
f<   ||g|f} j        #                                 t%           j$                  D ]N}d}|D ]} j        %                                 |\  }}}                     ||          }                     ||          }|&                                  j        '                                 |j(        \  }}}|||z  |z  z  }|tS          |           j*        z  z  }|dz  dk    r|d k    rItW          dtY          |          z   dz   dz   tY          |-                                          z               j        .                                  j                             j                   t)          j/                    5                       ||          }||z
  dz  0                                -                                }tW          dtY          |          z   dz   dz   tY          tc          j2        |-                                d                    z   dz   dz   tY          tc          j2        |d                    z              d d d            n# 1 swxY w Y    j        #                                 NPtW          d           d S )Nc                   $     e Zd Z fdZd Z xZS )&RNN_Vector_Forecaster.fit.<locals>.rnnc                    t                                                       	 || _        || _        || _        t          j        ||d         t          |          d          | _        t          j        ||d         t          |          d          | _	        t          j
                    | _        | j                            t          j        |d         |d                              t          dt          |                    D ]?}| j                            t          j        ||dz
           ||                              @|| _        d } || j                    || j	                   | j        D ]J}t
          j                            |j                   t
          j                            |j                   Kd S )Nr   Tr  r  rF   c                    |                                  D ]p\  }}d|v r t          j                            |           )d|v r t          j                            |           Md|v rt          j                            |           qd S r  r#  r)  s      r   r-  zORNN_Vector_Forecaster.fit.<locals>.rnn.__init__.<locals>.initialize_rnn_weights  r.  r   )r/  r   r  r  r  r  r0  rs   r1  r2  r3  r4  rt   r5  rr   r6  r%  r&  r7  r(  r"  )	r   r  r  r  r  ry   r-  r8  r9  s	           r   r   z/RNN_Vector_Forecaster.fit.<locals>.rnn.__init__  s   ww!!! ",t )t~%t| f'TUehisetet  EI  J  J  Jt| f'TUehisetet  EI  J  J  Jt|!#t%%bijm\efg\h&i&i&ijjjaI// o o1/((1Q3`ijk`l)m)m)mnnnn$tx1 1 1 &%dl333%%dl333 O . .57**5<8887>>%*----. .r   c                 n   | j         d         }t          j        t          | j                  |j        d         | j        d         |j                  }|                     ||          \  }}|                     ||          \  }}|j        \  }}	}
|	                    d|
          }| 
                     | j        d         |                    }t          dt          | j                             D ]+}| 
                     | j        |         |                    },|	                    ||	|g          }|S Nrh   r   r<  rF   r  r  r=  rs   r  rM  r  r1  r2  r\  r6  r4  rr   r   r>  r?  output_sizer@  r!  rA  rB  r>  rC  r  ry   s               r   rD  z.RNN_Vector_Forecaster.fit.<locals>.rnn.forward     "nR0[T_!5!5u{1~tWXGYdidpqqq<<r225<<u55q6;k3
Jb55!3!3E!:!:;;q#dn"5"566 @ @A HH%7T_Q%7%>%>??EEz:{&KLLr   rE  rG  s   @r   r*  r    sG        . . . . .:      r   r*  r  r  r  r  r   rF   c                 z    g | ]7} j         j        |         d                   di j        |         d         8S r   rF   r   r  r  r   ry   r   s     r   r   z-RNN_Vector_Forecaster.fit.<locals>.<listcomp>  O    }}}deC)$*<Q*?*BC__dFXYZF[\]F^__}}}r   rH  r   TrJ  rM  rN  rO  rb   rP  rQ  rR  )3r  rS  r   r  r  r	  r
  r  r  r  r  rY  rT  r  r  r  rU  r  rr   r  r  rV  r   r   r   r   rv   rY  rX  r}   r    r"   r	   r
   r>  rZ  r  r[  r\  r]  rM  rs   r   r^  r   r`  r_  r`  rJ  rH   ru   )r   rd  re  rL  ra  r*  rb  rc  ry   array_of_valuesr}   rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  r}  ro  r6  rp  sizerq  s   `                           r   r    zRNN_Vector_Forecaster.fit  s   )	 )	 )	 )	 )	") )	 )	 )	T .t/CDN4>2	Sdo4>`d`o{  |H  I  I  I

dk"""D,T-@-CDTZEZEZE\E\ww`d`stu`vww}}}}inoso{i|i|}}},w|AAA6Ht7H6H4H'I'P'W'W'Y'Ychcnooorrsws~,w|AAAd6G6H6H4H'I'P'W'W'Y'Ychcnooorrsws~,w~4466LLLOOPTP[\\t|$$ 	1 	1A-aaa!e4<<>>O	!!"')_oaaaPQPQPQRSe>T>\>\>^>^,_hi"j"j"j"')_gaaa)//Z[J\J\F\>]>e>e>g>g,hqr"s"s"sLO0000t|$$ 	S 	SA%)\!_%>%>qqqQRQRQRSTu?U%V%VOAAAaaaE"	!!)-a)B)B?STSTSTUVUVUVWXSXCY)Z)Z!!!A&&!**%)\!_%>%>wqqq5y?Q%R%R!!!E	"" &oPP"=tZ^___t <(8;MD<M;M9M(N(U(\(\(^(^hmhstttwwx|  yD  E  E= <(84;L;M;M9M(N(U(\(\(^(^hmhstttwwx|  yD  E  E=< 2 9 9 ; ;U[QQQTTUYU`aa5$,'' R Rq&*l1o&?&?aaaPQPQPQRSe@T&U&U}QQQqqqU#9$$*.,q/*C*CMRSRSRSTUTUTUVWRWDX*Y*Y=111Q''$??1--5&*l1o&?&?aaa%i@P&Q&Q5111U##%}5u=8 	
4;'' 	 	EJ& 8 8((***491['K==!YYvw77
##%%%##%%%(.%j/77

#g,,t'888JQw!||t##)c%jj047:KKcR\RaRaRcRcNdNddeeeeJOO%%%JMM$+... Z Z!%M=!I!I$)FNQ#6"<"<">">"C"C"E"Ei#e**4t;>OORUV[VablbqbqbsbstuVvVvRwRww $%':;=@WUVAWAW=X=XY Z Z ZZ Z Z Z Z Z Z Z Z Z Z Z Z Z Z
 J$$&&&&ds    Caa	a	c                    t          j        |j        d d d | j        f         j                                        t           j                                      | j                  }t          j        |j        d d | j        d f         j                                        t           j                                      | j                  }t          | j
                  D ]t}| j        |                             |d d d d |f                   |d d d d |f<   ||vr7| j        |                             |d d d d |f                   |d d d d |f<   ut          j                    5  |                     ||          }t          |          D ]<\  }}| j        |                             |d d d d |f                   |d d d d |f<   =	 d d d            n# 1 swxY w Y   |S NrH  r  rV  r   r   r   r   rv   rT  r  rr   r  r  r"   r`  rY  r  r)   r   rh  rL  rv  rw  ry   r(   r}   s           r   ri  zRNN_Vector_Forecaster.predict 	  B   fk!!!4FT5F4F2F&G&N&U&U&W&Wafalmmmppquq|}}fk!!!D4E4F4F2F&G&N&U&U&W&Wafalmmmppquq|}}t|$$ 	Y 	YA$(LO$=$=nQQQqqqQRU>S$T$TN111QQQq5!	!!(,Q(A(A.QRQRQRSTSTSTUVQVBW(X(Xqqq1u%]__ 	D 	D

>>::A%i00 D Dq#|A55a!!!E	lCC!!!AAAe)D	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D    'A#GGGc           
         g }g }g }g }	g }
t                      }|                    ||| j                  }|| _        |D ]\  }}|j        |         }|j        |         }|j        |         }|j        |         }|                     ||||f|           t          j        |j        	                                          
                    d                              | j                  }|                     ||          
                    d          }|                    t          t!          |d         |d         | j        z                                  |                    |	                                           |                    |	                                           |	                    ||z
  	                                           |
                    d t!          |d         |d         | j        z   dz
            D             ||z
  dz                                                                  gz              t'          j        ||||	|
d                              d          | _        d S )Nra  rL  r   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z8RNN_Vector_Forecaster.cross_val_roll.<locals>.<listcomp>!	  ro  r   rF   rb   rp  r   r*  r7  r   r6  rt  r    r  rV  r   r   squeezerT  r  ri  rv  rp   rr   rJ  r`  r   r   rw  r^  r  s                      r   r~  z$RNN_Vector_Forecaster.cross_val_roll	  P   	WW##L&$:KLL+0 	9 	9'M<U=)7U=)7E,'6E,'688GW&&1Ay8YYYL!5!5!7!788@@CCFFt{SS6LL33;;A>>6>>$u\!_l1oHY6YZZ[[\\\>>&--//***fmmoo...Vf_4466777::hh%QaSWSdAdefAf*g*ghhhVOa'--//446678 9 9 9 9 *w7cn9BPS,U ,U V VV_V_`iVjVj 	r   c           
         g }g }g }g }	g }
t                      }|                    ||| j                  }|| _        |D ]\  }}|j        |         }|j        |         }|j        |         }|j        |         }|                     ||||f|           t          j        |j        	                                          
                    d                              | j                  }|                     ||          
                    d          }|                    t          t!          |d         |d         | j        z                                  |                    |	                                           |                    |	                                           |	                    ||z
  	                                           |
                    d t!          |d         |d         | j        z   dz
            D             ||z
  dz                                                                  gz              t'          j        ||||	|
d                              d          | _        d S )Nr  r   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z7RNN_Vector_Forecaster.cross_val_exp.<locals>.<listcomp>;	  ro  r   rF   rb   rp  r   r*  r9  r   r3  rt  r    r  rV  r   r   r  rT  r  ri  rv  rp   rr   rJ  r`  r   r   rw  r^  r  s                      r   r  z#RNN_Vector_Forecaster.cross_val_exp&	  P   	WW%%lE4;LMM
+0 	9 	9'M<U=)7U=)7E,'6E,'688GW&&1Ay8YYYL!5!5!7!788@@CCFFt{SS6LL33;;A>>6>>$u\!_l1oHY6YZZ[[\\\>>&--//***fmmoo...Vf_4466777::hh%QaSWSdAdefAf*g*ghhhVOa'--//446678 9 9 9 9 *w7cn9BPS,U ,U V VV_V_`iVjVj 	r   rc  c           	         d| j         fd| j        fd}t          | j        j                  }t          t          | j        d                                                    }t          t          | j        d                                                    }t          t          |                    D ]}t          j
                     t          j        |||         d||         z              t          j        |||         d||         z   d	
           t          t          | j                  | j        z            }	| j        }
t          |	          D ]A}t          j        |||
z  |dz   |
z           ||         ||
z  |dz   |
z           d           Bt          j                     t          j                     |d k    rt          j        dt#          | j                  z   dz   t#          | j                  z   dz   t#          ||         d                   z   dz   t#          ||         d                   z              t          j        |           t          j                     d S re  rh  ri  s               r   r  z.RNN_Vector_Forecaster.plot_targets_predictions@	  rk  r   c                    t          j                     t          t          | j        d                                                    }t          t          |                    D ]}t          j                     t          j        ||         |d||         z              t          j	        d           t          j
        d           t          j        d           t          j                     t          j                     d S rm  rp  rq  s        r   r  z#RNN_Vector_Forecaster.plot_res_histU	  rr  r   r   r  r   r   r   r  r  i  s          ACPRag2ecXZ/ / / /8s s s sh  k k k4k k k4 7Foot    * .=__ 
 
 
 
 
 
r   r  c                   T    e Zd ZdZg g dg dfdZd Zd Zg dfdZdd	Zg dfd
Z	dS )RNNS_Vector_Forecasterr  r  Nc                    || _         || _        || _        || _        t	          j                    t	          j                    t	          j                    d| _        || _	        d | _
        || _        d | _        d | _        t          j        t          j                                        rdnd          | _        t%          | j                  | _        || _        d S Nr  r  r  )r   r   r  r  r  r  r  r  r   r  r  r  r^  rY  r  r  r  r  rs   r  weights)r   r   r   r  r  r  r  r  s           r   r   zRNNS_Vector_Forecaster.__init__i	  s    (($"(*		R[]]XZXcXeXeff)
lUZ-D-D-F-F#Q66ERR4<((r   c                 b    G d dt           j                  }| j        | j                 | _         || j        | j        | j        | j                  | _        | j        	                    | j
                   | j                            | j                   | j                                         | j        	                    | j
                   t          j        |j        d d d | j        f         j                                        t          j                  	                    | j
                  }t          j        |j        d d | j        d f         j                                        t          j                  	                    | j
                  }t+          | j                  D ]t}| j        |                             |d d d d |f                   |d d d d |f<   ||vr7| j        |                             |d d d d |f                   |d d d d |f<   ut          j                    5  |                     ||          }t3          |          D ]<\  }}| j        |                             |d d d d |f                   |d d d d |f<   =	 d d d            n# 1 swxY w Y   |S )Nc                   $     e Zd Z fdZd Z xZS )/RNNS_Vector_Forecaster.fit_predict.<locals>.rnnc                    t                                                       	 || _        || _        || _        t          j        ||d         t          |          d          | _        t          j        ||d         t          |          d          | _	        t          j
                    | _        | j                            t          j        |d         |d                              t          dt          |                    D ]?}| j                            t          j        ||dz
           ||                              @|| _        d S Nr   Tr  r  rF   )r/  r   r  r  r  r  r0  rs   r1  r2  r3  r4  rt   r5  rr   r6  )r   r  r  r  r  ry   r9  s         r   r   z8RNNS_Vector_Forecaster.fit_predict.<locals>.rnn.__init__y	  sC   ww!!! ",t )t~%t| f'TUehisetet  EI  J  J  Jt| f'TUehisetet  EI  J  J  Jt|!#t%%bijm\efg\h&i&i&ijjjaI// o o1/((1Q3`ijk`l)m)m)mnnnn$txxxr   c                 n   | j         d         }t          j        t          | j                  |j        d         | j        d         |j                  }|                     ||          \  }}|                     ||          \  }}|j        \  }}	}
|	                    d|
          }| 
                     | j        d         |                    }t          dt          | j                             D ]+}| 
                     | j        |         |                    },|	                    ||	|g          }|S r  r  r  s               r   rD  z7RNNS_Vector_Forecaster.fit_predict.<locals>.rnn.forward	  r  r   rE  rG  s   @r   r*  r  x	  sG        % % % % %       r   r*  r  rH  )r  rS  r   r  r  r  r  r  rY  rT  r  load_state_dictr  r_  r  rV  r   r   r   r   rv   rr   r  r"   r`  r  r)   )	r   rh  rL  r*  rv  rw  ry   r(   r}   s	            r   rM  z"RNNS_Vector_Forecaster.fit_predictw	  s   	 	 	 	 	") 	 	 	: .t/CDSdo4>`d`o{  |H  I  I  I

dk"""
""4<000

dk"""fk!!!4FT5F4F2F&G&N&U&U&W&Wafalmmmppquq|}}fk!!!D4E4F4F2F&G&N&U&U&W&Wafalmmmppquq|}}t|$$ 	Y 	YA$(LO$=$=nQQQqqqQRU>S$T$TN111QQQq5!	!!(,Q(A(A.QRQRQRSTSTSTUVQVBW(X(Xqqq1u%]__ 	D 	D

>>::A%i00 D Dq#|A55a!!!E	lCC!!!AAAe)D	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D    4A#J$$J(+J(c           
         g }g }g }g }g }	|D ]}|j         |g         }
|j         |g         }t          j        |j                                                                      d                              | j                  }|                     |
|                              d          }|	                    t          t          ||| j        z                                  |	                    |                                           |	                    |                                           |	                    ||z
                                             |		                    d t          ||| j        z   dz
            D             ||z
  dz                                                                  gz              t          j        |||||	d                              d          | _        d S )Nr   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z4RNNS_Vector_Forecaster.cross_val.<locals>.<listcomp>	  r{  r   rF   rb   rp  r   rt  r  rV  r   r   r  rT  r  rM  rv  rp   rr   r   rJ  r`  r   r   rw  r^  r   r   r(   r.  rL  r   rq  rr  r\  rx  rh  r|  r}  s                r   r}  z RNNS_Vector_Forecaster.cross_val	     	( 
	9 
	9LE<.)6E<.)6L!5!5!7!788@@CCFFt{SS6$$VY77??BB6>>$u\<$BS3STTUUVVV>>&--//***fmmoo...Vf_4466777::bb%lTM^>^_`>`*a*abbbVOa'--//446678 9 9 9 9 *w7cn9BPS,U ,U V VV_V_`iVjVj 	r   rc  c           	         t          | j        j                  }t          t          | j        d                                                    }t          t          | j        d                                                    }t          t          |                    D ]K}t          j                     t          j	        |||         d||         z              t          j	        |||         d||         z   d           t          t          | j                  | j        z            }| j        }t          |          D ]A}t          j	        |||z  |dz   |z           ||         ||z  |dz   |z           d	
           Bt          j                     t          j                     t          j        dt          | j                  z   dz   t          | j                  z              Mt          j                     d S r  r  r  s	            r   r  z/RNNS_Vector_Forecaster.plot_targets_predictions	  r  r   c                    |d k    r't          j                    }t          j                    }n|}t          t	          | j        d                                                    }t          t	          | j        d                                                    }|                    |d         |d         ddd           |                    |d         |d         d	d
d           t          t          | j                  | j
        z            }| j
        }t          |          D ]I}	|                    |d         |	|z  |	dz   |z           |d         |	|z  |	dz   |z           dd           J|d k    rD|                    dt          | j                  z   dz   t          | j
                  z              d S |                    |           d S r  r  r  s
             r   r  z:RNNS_Vector_Forecaster.plot_targets_predictions_as_vectors	     4<<-//CBBBdoi07799:;;dom4;;==>??
!ad)USIII
!ad-4RRRDO$$T%6677!q 	i 	iAGGAaD5!A#u,-qtAeGQqS%K4G/HRYdgGhhhhD==LL#d.?*@*@@CSSVYZ^ZkVlVllmmmmmLLr   c                    t          j                     t          t          | j        d                                                    }t          t          |                    D ]}t          j                     t          j        ||         |d||         z              t          j	        d           t          j
        d           t          j        d           t          j                     t          j                     d S rm  rp  rq  s        r   r  z$RNNS_Vector_Forecaster.plot_res_hist	  rr  r   r  r  r   r   r   r  r  b	  s          ACPRagsu  BF    . . .^k k k& 1@            & .=__ 
 
 
 
 
 
r   r  c                   P    e Zd ZdZg g ddddddfdZdd	Zd
 Zd Zd Zd Z	d Z
dS )LSTM_Forecasterr  r  r   r  r  r  c                    || _         || _        || _        || _        t	          j                    t	          j                    t	          j                    d| _        || _	        d | _
        t          t          t          t          d| _        || _        d | _        t$          t&          d| _        || _        d | _        t/                      t1                      d| _        || _        d | _        g | _        d | _        |	| _        |
| _        d | _         d | _!        tE          j#        tD          j$        %                                rdnd          | _#        d | _&        d | _'        d S r  )(r   r   lstm_layersr  r  r  r  r  r   r  r  r   r]   rf   r/   r  r  r  r   r   r  r  r  r   r   r	  r
  r  r  r  r  r>  r^  rY  r  r  r  r  r6  r3  )r   r   r   r  r  r  r  r  r  r  r>  s              r   r   zLSTM_Forecaster.__init__	  s(   ((&"(*		R[]]XZXcXeXeff)$/>NW`hqrr!&)488'!(688<<	!#$(!$
lUZ-D-D-F-F#Q66ERR


r   Nc                     G d dt           j                  }| j        | j                 | _        | j        | j                 | _         || j        | j	        | j                  | _
        | j
                            | j                    | j        | j        d                  | j
                                        fi | j        d         | _         | j        | j        d                  di | j        d         | _        t)          j        |j        d d d | j        f         j        t(          j                                      d                              | j                  }t)          j        |j        d d | j        d f         j        t(          j                                      d                              | j                  }t)          j        |j        t(          j                                      | j                  }| j                            t)          j        |                                |                                fd                     | j                            |          }| j                            |          }|| _        || _         || _!        tE          |||          }tG          || j$        d	
          }|d k    rdt)          j        |d         j        d d d | j        f         j        t(          j                                      d                              | j                  }	t)          j        |d         j        d d | j        d f         j        t(          j                                      d                              | j                  }
t)          j        |d         j        t(          j                                      | j                  }| j                            |	          }	| j                            |          }|	| _%        |
| _&        || _'        | j
        (                                 tS          | j*                  D ]M}d}|D ]}| j        +                                 |\  }}}| 
                    ||          }|                     ||          }|,                                 | j        -                                 |j.        \  }}|||z  |z  z  }|t_          |          | j0        z  z  }|dz  dk    r|d k    rItc          dte          |          z   dz   dz   te          |3                                          z              
| j
        4                                 | j
                            | j                   t)          j5                    5  | 
                    |	|
          }||z
  dz  6                                3                                }tc          dte          |          z   dz   dz   te          to          j8        |3                                d                    z   dz   dz   te          to          j8        |d                    z              d d d            n# 1 swxY w Y   | j
        (                                 MOtc          d           d S )Nc                   $     e Zd Z fdZd Z xZS )!LSTM_Forecaster.fit.<locals>.lstmc                 z   t                                                       || _        || _        t	          j        d|d         t          |          d          | _        t	          j        d|d         t          |          d          | _        t	          j	                    | _
        | j
                            t	          j        |d         |d                              t          dt          |                    D ]?}| j
                            t	          j        ||dz
           ||                              @|| _        d } || j                    || j                   | j
        D ]J}t          j                            |j                   t          j                            |j                   Kd S )NrF   r   Tr  r  c                 N   |                                  D ]\  }}d|v r t          j                            |           )d|v r t          j                            |           Md|v r>t          j                            |           |j        d         dz  }d|j        |d|z  <   d S Nr   r!  r"  r      g333333?rb   r$  r  r%  r&  r'  r(  rM  r   lstmr+  r,  r  s       r   initialize_lstm_weightszKLSTM_Forecaster.fit.<locals>.lstm.__init__.<locals>.initialize_lstm_weights
      &*&;&;&=&= I I{tU%--72259999'4//7..u5555"dNN7>>%000).Q1)<;EH5:k!k/&ABI Ir   )r/  r   r  r  r  LSTMrs   r1  r2  r3  r4  rt   r5  rr   r6  r%  r&  r7  r(  r"  )r   r  r  r  ry   r  r8  r9  s          r   r   z*LSTM_Forecaster.fit.<locals>.lstm.__init__
  s   ww!!!"-t )t~ g1KPQNadepaqaq  BF  G  G  Gt| g1KPQNadepaqaq  BF  G  G  Gt|!#t%%bik!n]fgh]i&j&j&jkkkaI// o o1/((1Q3`ijk`l)m)m)mnnnn$tx	I 	I 	I '&t|444&&t|444 O . .57**5<8887>>%*----. .r   c                    t          j        t          | j                  |j        d         | j        d         |j                  }t          j        t          | j                  |j        d         | j        d         |j                  }|                     |||f          \  }\  }}|                     |||f          \  }}|j        \  }	}
}|                    d|          }| 	                     | j
        d         |                    }t          dt          | j                            D ]+}| 	                     | j
        |         |                    },|                    |	|
g          }|S r;  )r  r=  rs   r  rM  r  r1  r2  r\  r6  r4  rr   r  )r   r>  r?  r@  c0r!  rA  c_encrB  r>  rC  r  ry   s                r   rD  z)LSTM_Forecaster.fit.<locals>.lstm.forward)
  sR   [T%5!6!6AHXYZH[fkfrsss[T%5!6!6AHXYZH[fkfrsss#'<<2w#?#? =E%<<e}==q6;k3
Jb55!3!3E!:!:;;q#dn"5"566 @ @A HH%7T_Q%7%>%>??EEz:&>??r   rE  rG  s   @r   r  r  
  sG        . . . . .4      r   r  )r  r  r  r   rF   rH  rb   r   TrJ  rL  rM  rN  rO  rP  rQ  rR  r   )9r  rS  r   r  r  r	  r
  r  r  r  rY  rT  r  r  r  rU  r  r  r  r  r  rV  r   r   r   rv   rW  r    rX  rY  r"   X_enc_sX_dec_sy_sr	   r
   r>  
X_enc_vals
X_dec_valsy_valsrZ  rr   r  r[  r\  r]  rM  rs   r   r^  r   r`  r_  r`  rJ  rH   ru   )r   rd  re  ra  r  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  r}  ro  r6  rp  rq  s                          r   r    zLSTM_Forecaster.fit
  s   &	 &	 &	 &	 &	29 &	 &	 &	N .t/CDN4>2	T(8dncgcrsss

dk"""D,T-@-CDTZEZEZE\E\ww`d`stu`vww;d&t'7':;RRd>Nq>QRR,w|AAA6Ht7H6H4H'I'PZ_Zefffppqrssvvw{  xC  D  D,w|AAAd6G6H6H4H'I'PZ_Zefffppqrssvvw{  xC  D  D,w~u{CCCFFt{SS	?#:#:#<#<goo>O>O"PYZ[[[\\\+//@@+''00&&%oPP"=tZ^___t <(8;MD<M;M9M(N(U_d_jkkkuuvwxx{{  }A  }H  I  I= <(84;L;M;M9M(N(U_d_jkkkuuvwxx{{  }A  }H  I  I=< 2EKHHHKKDKXX5;00??=;((//5*4?*4?4;
4;'' 	 	EJ& 8 8((***491['K==!YYvw77
##%%%##%%%"(,j/77

#g,,t'888JRx1}}t##)c%jj047:KKcR\RaRaRcRcNdNddeeeeJOO%%%JMM$+... Z Z!%M=!I!I$)FNQ#6"<"<">">"C"C"E"Ei#e**4t;>OORUV[VablbqbqbsbstuVvVvRwRww $%':;=@WUVAWAW=X=XY Z Z ZZ Z Z Z Z Z Z Z Z Z Z Z Z Z Z
 J$$&&&&ds   7CZ		Z	Z	c                    | j                                          | j                             | j                   t	          j        |j        d d d | j        f         j        t          j	                  
                    d                              | j                  }t	          j        |j        d d | j        d f         j        t          j	                  
                    d                              | j                  }| j                            |          }t	          j                    5  |                      ||          }| j                            |          cd d d            S # 1 swxY w Y   d S rs  rt  ru  s        r   ri  zLSTM_Forecaster.predictn
  rx  ry  c           
         g }g }g }g }g }	t          |          }
t                      }|                    ||| j                  }|| _        |D ]\  }}|j        |         }|j        |         }|j        |         }|j        |         }|                     ||||g           |                     |                                          }t          j
        |j        t                                                                        | j                  }|                    t          t!          |d         |d         | j        z                                  |                    |                                           |                    |                                           |                    ||z
                                             |	                    d t!          |d         |d         | j        z   dz
            D             ||z
  dz                                                                  gz              t)          j        |||||	d                              d          | _        d S )	Nr{  rH  r   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z2LSTM_Forecaster.cross_val_roll.<locals>.<listcomp>
  ro  r   rF   rb   rp  r   r}  r~  s                      r   r~  zLSTM_Forecaster.cross_val_rollw
  r  r   c           
         g }g }g }g }g }	t          |          }
t                      }|                    ||| j                  }|| _        |D ]\  }}|j        |         }|j        |         }|j        |         }|j        |         }|                     ||||g           |                     |                                          }t          j
        |j        t          j                                                                      | j                  }|                    t          t!          |d         |d         | j        z                                  |                    |                                           |                    |                                           |                    ||z
                                             |	                    d t!          |d         |d         | j        z   dz
            D             ||z
  dz                                                                  gz              t)          j        |||||	d                              d          | _        d S )	Nr{  rH  r   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z1LSTM_Forecaster.cross_val_exp.<locals>.<listcomp>
  ro  r   rF   rb   rp  r   r  r  s                      r   r  zLSTM_Forecaster.cross_val_exp
  r  r   c                    dt          | j                  fdt          | j                  fd}t          | j        j                  }| j        d         }| j        d         }t          j                     t          j        ||d           t          j        ||dd	
           t          t          | j                  | j        z            }| j        }t          |          D ];}	t          j        ||	|z  |	dz   |z           ||	|z  |	dz   |z           d           <t          j                     t          j                     |d k    rft          j        dt          | j                  z   dz   t          | j                  z   dz   ||         d         z   dz   ||         d         z              nt          j        |           t          j                     d S r4  r  r  s
             r   r  z(LSTM_Forecaster.plot_targets_predictions
  r  r   c                    t          j                     t          j        | j        d         |           t          j        d           t          j        d           t          j        d           t          j                     d S r  r  r  s     r   r  zLSTM_Forecaster.plot_res_hist
  r  r   r   r  r   r   r   r  r  	  s          BDQSbh"USWY   :_ _ _ _B) ) )k k k6k k k8  (    r   r  c                   b    e Zd ZdZg g dg ddddfdZdd	Zd
 Zd Zd Zg ddfdZ	g dfdZ
dS )LSTM_Vector_Forecasterz
    Description
    -----------
    This class enfolds some useful features within keras' functional LSTM models.  
    Trying to make it have the same methods and things as the other classes above.
    r  r   r  r  r  c                    || _         || _        || _        || _        t	          j                    t	          j                    t	          j                    d| _        || _	        d | _
        t          t          t          t          d| _        || _        d | _        t$          t&          d| _        || _        d | _        t/                      t1                      d| _        || _        d | _        g | _        d | _        |	| _        |
| _        d | _         d | _!        tE          j#        tD          j$        %                                rdnd          | _#        d | _&        d | _'        tQ          | j                  | _)        d S r  )*r   r   r  r  r  r  r  r  r   r  r  r   r]   rf   r/   r  r  r  r   r   r  r  r  r   r   r	  r
  r  r  r  r  r>  r^  rY  r  r  r  r  r6  r3  rs   r  )r   r   r   r  r  r  r  r  r  r  r>  s              r   r   zLSTM_Vector_Forecaster.__init__
  s:   ((&"(*		R[]]XZXcXeXeff)%0?OXairss$&)488'!(688<<	!#$(!$
lUZ-D-D-F-F#Q66ERR
4-..r   Nc                      G d dt           j                  } j         j                  _         j         j                  _         | j         j	         j         j
                   _         j                             j                     j         j        d                   j                                        fi  j        d          _         fdt%           j
                  D              _        t)          j        |j        d d d  j        f         j                                        t(          j                                       j                  }t)          j        |j        d d  j        d f         j                                        t(          j                                       j                  }t)          j        |j                                        t(          j                                       j                  }t%           j
                  D ]}|d d d d |f                                         }	||vr8t)          j        |	|d d d d |f                                         fd          }	nJt)          j        |	|d d d d |                    |          f                                         fd          }	 j        |                             |	           t%           j
                  D ]} j        |                             |d d d d |f                   |d d d d |f<   ||vr8 j        |                             |d d d d |f                   |d d d d |f<   u|                    |          }
 j        |                             |d d d d |
f                   |d d d d |
f<   tA          |||          }tC          | j"        	          }|d k    rt)          j        |d         j        d d d  j        f         j                                        t(          j                                       j                  }t)          j        |d         j        d d  j        d f         j                                        t(          j                                       j                  }t)          j        |d         j                                        t(          j                                       j                  }t%           j
                  D ]} j        |                             |d d d d |f                   |d d d d |f<   ||vr8 j        |                             |d d d d |f                   |d d d d |f<   u|                    |          }
 j        |                             |d d d d |
f                   |d d d d |
f<   ||g|f} j        #                                 t%           j$                  D ]N}d}|D ]} j        %                                 |\  }}}                     ||          }                     ||          }|&                                  j        '                                 |j(        \  }}}|||z  |z  z  }|tS          |           j*        z  z  }|dz  dk    r|d k    rItW          d
tY          |          z   dz   dz   tY          |-                                          z               j        .                                  j                             j                   t)          j/                    5                       ||          }||z
  dz  0                                -                                }tW          d
tY          |          z   dz   dz   tY          tc          j2        |-                                d                    z   dz   dz   tY          tc          j2        |d                    z              d d d            n# 1 swxY w Y    j        #                                 NPtW          d           d S )Nc                   $     e Zd Z fdZd Z xZS )(LSTM_Vector_Forecaster.fit.<locals>.lstmc                    t                                                       	 || _        || _        || _        t          j        ||d         t          |          d          | _        t          j        ||d         t          |          d          | _	        t          j
                    | _        | j                            t          j        |d         |d                              t          dt          |                    D ]?}| j                            t          j        ||dz
           ||                              @|| _        d } || j                    || j	                   | j        D ]J}t
          j                            |j                   t
          j                            |j                   Kd S )Nr   Tr  r  rF   c                 N   |                                  D ]\  }}d|v r t          j                            |           )d|v r t          j                            |           Md|v r>t          j                            |           |j        d         dz  }d|j        |d|z  <   d S r  r  r  s       r   r  zRLSTM_Vector_Forecaster.fit.<locals>.lstm.__init__.<locals>.initialize_lstm_weights   r  r   )r/  r   r  r  r  r  r  rs   r1  r2  r3  r4  rt   r5  rr   r6  r%  r&  r7  r(  r"  )	r   r  r  r  r  ry   r  r8  r9  s	           r   r   z1LSTM_Vector_Forecaster.fit.<locals>.lstm.__init__
  s   ww!!! #.t )t~%t| g7+VW.gjkvgwgw  HL  M  M  Mt| g7+VW.gjkvgwgw  HL  M  M  Mt|!#t%%bik!n]fgh]i&j&j&jkkkaI// o o1/((1Q3`ijk`l)m)m)mnnnn$tx	I 	I 	I '&t|444&&t|444 O . .57**5<8887>>%*----. .r   c                    | j         d         }t          j        t          | j                  |j        d         | j        d         |j                  }t          j        t          | j                  |j        d         | j        d         |j                  }|                     |||f          \  }\  }}|                     |||f          \  }	}|	j        \  }
}}|		                    d|          }	| 
                     | j        d         |	                    }	t          dt          | j                             D ]+}| 
                     | j        |         |	                    }	,|		                    |
||g          }	|	S r  r  r  r=  rs   r  rM  r  r1  r2  r\  r6  r4  rr   r   r>  r?  r  r@  r  r!  rA  r  rB  r>  rC  r  ry   s                 r   rD  z0LSTM_Vector_Forecaster.fit.<locals>.lstm.forward  `   "nR0[T%5!6!6AHXYZH[fkfrsss[T%5!6!6AHXYZH[fkfrsss$(LLB$@$@!>E5<<u~>>q6;k3
Jb55!3!3E!:!:;;q#dn"5"566 @ @A HH%7T_Q%7%>%>??EEz:{&KLLr   rE  rG  s   @r   r  r  
  sG        . . . . .>      r   r  r  r  r  r  r   rF   c                 z    g | ]7} j         j        |         d                   di j        |         d         8S r  r  r  s     r   r   z.LSTM_Vector_Forecaster.fit.<locals>.<listcomp>!  r  r   rH  r   )r>  rM  rN  rO  rb   rP  rQ  rR  )3r  rS  r   r  r  r	  r
  r  r  r  r  rY  rT  r  r  r  rU  r  rr   r  r  rV  r   r   r   r   rv   rY  rX  r}   r    r"   r	   r
   r>  rZ  r  r[  r\  r]  rM  rs   r   r^  r   r`  r_  r`  rJ  rH   ru   )r   rd  re  rL  ra  r  rb  rc  ry   r  r}   rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  r}  ro  r6  rp  r  rq  s   `                           r   r    zLSTM_Vector_Forecaster.fit
  s   ,	 ,	 ,	 ,	 ,	29 ,	 ,	 ,	Z .t/CDN4>2	T(8dncgcr  C  K  L  L  L

dk"""D,T-@-CDTZEZEZE\E\ww`d`stu`vww}}}}inoso{i|i|}}},w|AAA6Ht7H6H4H'I'P'W'W'Y'Ychcnooorrsws~,w|AAAd6G6H6H4H'I'P'W'W'Y'Ychcnooorrsws~,w~4466LLLOOPTP[\\t|$$ 	1 	1A-aaa!e4<<>>O	!!"')_oaaaPQPQPQRSe>T>\>\>^>^,_hi"j"j"j"')_gaaa)//Z[J\J\F\>]>e>e>g>g,hqr"s"s"sLO0000t|$$ 	S 	SA%)\!_%>%>qqqQRQRQRSTu?U%V%VOAAAaaaE"	!!)-a)B)B?STSTSTUVUVUVWXSXCY)Z)Z!!!A&&!**%)\!_%>%>wqqq5y?Q%R%R!!!E	"" &oPP"=tOOOt <(8;MD<M;M9M(N(U(\(\(^(^hmhstttwwx|  yD  E  E= <(84;L;M;M9M(N(U(\(\(^(^hmhstttwwx|  yD  E  E=< 2 9 9 ; ;U[QQQTTUYU`aa5$,'' R Rq&*l1o&?&?aaaPQPQPQRSe@T&U&U}QQQqqqU#9$$*.,q/*C*CMRSRSRSTUTUTUVWRWDX*Y*Y=111Q''$??1--5&*l1o&?&?aaa%i@P&Q&Q5111U##%}5u=8 	
4;'' 	 	EJ& 8 8((***491['K==!YYvw77
##%%%##%%%(.%j/77

#g,,t'888JQw!||t##)c%jj047:KKcR\RaRaRcRcNdNddeeeeJOO%%%JMM$+... Z Z!%M=!I!I$)FNQ#6"<"<">">"C"C"E"Ei#e**4t;>OORUV[VablbqbqbsbstuVvVvRwRww $%':;=@WUVAWAW=X=XY Z Z ZZ Z Z Z Z Z Z Z Z Z Z Z Z Z Z
 J$$&&&&ds   ?Caa	a	c                    t          j        |j        d d d | j        f         j                                        t           j                                      | j                  }t          j        |j        d d | j        d f         j                                        t           j                                      | j                  }t          | j
                  D ]t}| j        |                             |d d d d |f                   |d d d d |f<   ||vr7| j        |                             |d d d d |f                   |d d d d |f<   ut          j                    5  |                     ||          }t          |          D ]<\  }}| j        |                             |d d d d |f                   |d d d d |f<   =	 d d d            n# 1 swxY w Y   |S r  r  r  s           r   ri  zLSTM_Vector_Forecaster.predicte  r  r  c           
         g }g }g }g }	g }
t                      }|                    ||| j                  }|| _        |D ]\  }}|j        |         }|j        |         }|j        |         }|j        |         }|                     ||||f|           t          j        |j        	                                          
                    d                              | j                  }|                     ||          
                    d          }|                    t          t!          |d         |d         | j        z                                  |                    |	                                           |                    |	                                           |	                    ||z
  	                                           |
                    d t!          |d         |d         | j        z   dz
            D             ||z
  dz                                                                  gz              t'          j        ||||	|
d                              d          | _        d S )Nr  r   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z9LSTM_Vector_Forecaster.cross_val_roll.<locals>.<listcomp>  ro  r   rF   rb   rp  r   r  r  s                      r   r~  z%LSTM_Vector_Forecaster.cross_val_rollq  r  r   c           
         g }g }g }g }	g }
t                      }|                    ||| j                  }|| _        |D ]\  }}|j        |         }|j        |         }|j        |         }|j        |         }|                     ||||f|           t          j        |j        	                                          
                    d                              | j                  }|                     ||          
                    d          }|                    t          t!          |d         |d         | j        z                                  |                    |	                                           |                    |	                                           |	                    ||z
  	                                           |
                    d t!          |d         |d         | j        z   dz
            D             ||z
  dz                                                                  gz              t'          j        ||||	|
d                              d          | _        d S )Nr  r   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z8LSTM_Vector_Forecaster.cross_val_exp.<locals>.<listcomp>  ro  r   rF   rb   rp  r   r  r  s                      r   r  z$LSTM_Vector_Forecaster.cross_val_exp  r  r   rc  c           	         d| j         fd| j        fd}t          | j        j                  }t          t          | j        d                                                    }t          t          | j        d                                                    }t          t          |                    D ]}t          j
                     t          j        |||         d||         z              t          j        |||         d||         z   d	
           t          t          | j                  | j        z            }	| j        }
t          |	          D ]A}t          j        |||
z  |dz   |
z           ||         ||
z  |dz   |
z           d           Bt          j                     t          j                     |d k    rt          j        dt#          | j                  z   dz   t#          | j                  z   dz   t#          ||         d                   z   dz   t#          ||         d                   z              t          j        |           t          j                     d S re  rh  ri  s               r   r  z/LSTM_Vector_Forecaster.plot_targets_predictions  rk  r   c                    t          j                     t          t          | j        d                                                    }t          t          |                    D ]}t          j                     t          j        ||         |d||         z              t          j	        d           t          j
        d           t          j        d           t          j                     t          j                     d S rm  rp  rq  s        r   r  z$LSTM_Vector_Forecaster.plot_res_hist  rr  r   r   r  r   r   r   r  r  
  s          BDQSbh2ecXZ/ / / /8v v v vn  k k k4k k k4 7Foot    * .=__ 
 
 
 
 
 
r   r  c                   T    e Zd ZdZg g dg dfdZd Zd Zg dfdZdd	Zg dfd
Z	dS )LSTMS_Vector_Forecasterr  r  Nc                    || _         || _        || _        || _        t	          j                    t	          j                    t	          j                    d| _        || _	        d | _
        || _        d | _        d | _        t          j        t          j                                        rdnd          | _        t%          | j                  | _        || _        d S r  )r   r   r  r  r  r  r  r  r   r  r  r  r^  rY  r  r  r  r  rs   r  r  )r   r   r   r  r  r  r  r  s           r   r   z LSTMS_Vector_Forecaster.__init__  s    ((&"(*		R[]]XZXcXeXeff)
lUZ-D-D-F-F#Q66ERR4<((r   c                 b    G d dt           j                  }| j        | j                 | _         || j        | j        | j        | j                  | _        | j        	                    | j
                   | j                            | j                   | j                                         | j        	                    | j
                   t          j        |j        d d d | j        f         j                                        t          j                  	                    | j
                  }t          j        |j        d d | j        d f         j                                        t          j                  	                    | j
                  }t+          | j                  D ]t}| j        |                             |d d d d |f                   |d d d d |f<   ||vr7| j        |                             |d d d d |f                   |d d d d |f<   ut          j                    5  |                     ||          }t3          |          D ]<\  }}| j        |                             |d d d d |f                   |d d d d |f<   =	 d d d            n# 1 swxY w Y   |S )Nc                   $     e Zd Z fdZd Z xZS )1LSTMS_Vector_Forecaster.fit_predict.<locals>.lstmc                    t                                                       	 || _        || _        || _        t          j        ||d         t          |          d          | _        t          j        ||d         t          |          d          | _	        t          j
                    | _        | j                            t          j        |d         |d                              t          dt          |                    D ]?}| j                            t          j        ||dz
           ||                              @|| _        d S r  )r/  r   r  r  r  r  r  rs   r1  r2  r3  r4  rt   r5  rr   r6  )r   r  r  r  r  ry   r9  s         r   r   z:LSTMS_Vector_Forecaster.fit_predict.<locals>.lstm.__init__  sD   ww!!! #.t )t~%t| g7+VW.gjkvgwgw  HL  M  M  Mt| g7+VW.gjkvgwgw  HL  M  M  Mt|!#t%%bik!n]fgh]i&j&j&jkkkaI// o o1/((1Q3`ijk`l)m)m)mnnnn$txxxr   c                    | j         d         }t          j        t          | j                  |j        d         | j        d         |j                  }t          j        t          | j                  |j        d         | j        d         |j                  }|                     |||f          \  }\  }}|                     |||f          \  }	}|	j        \  }
}}|		                    d|          }	| 
                     | j        d         |	                    }	t          dt          | j                             D ]+}| 
                     | j        |         |	                    }	,|		                    |
||g          }	|	S r  r  r  s                 r   rD  z9LSTMS_Vector_Forecaster.fit_predict.<locals>.lstm.forward  r  r   rE  rG  s   @r   r  r    sG        % % % % %       r   r  r  rH  )r  rS  r   r  r  r  r  r  rY  rT  r  r  r  r_  r  rV  r   r   r   r   rv   rr   r  r"   r`  r  r)   )	r   rh  rL  r  rv  rw  ry   r(   r}   s	            r   rM  z#LSTMS_Vector_Forecaster.fit_predict  s   	 	 	 	 	29 	 	 	< .t/CDT(8dncgcr  C  K  L  L  L

dk"""
""4<000

dk"""fk!!!4FT5F4F2F&G&N&U&U&W&Wafalmmmppquq|}}fk!!!D4E4F4F2F&G&N&U&U&W&Wafalmmmppquq|}}t|$$ 	Y 	YA$(LO$=$=nQQQqqqQRU>S$T$TN111QQQq5!	!!(,Q(A(A.QRQRQRSTSTSTUVQVBW(X(Xqqq1u%]__ 	D 	D

>>::A%i00 D Dq#|A55a!!!E	lCC!!!AAAe)D	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D r  c           
         g }g }g }g }g }	|D ]}|j         |g         }
|j         |g         }t          j        |j                                                                      d                              | j                  }|                     |
|                              d          }|	                    t          t          ||| j        z                                  |	                    |                                           |	                    |                                           |	                    ||z
                                             |		                    d t          ||| j        z   dz
            D             ||z
  dz                                                                  gz              t          j        |||||	d                              d          | _        d S )Nr   c                 &    g | ]}t           j        S r   rl  rn  s     r   r   z5LSTMS_Vector_Forecaster.cross_val.<locals>.<listcomp>  r{  r   rF   rb   rp  r   r  r  s                r   r}  z!LSTMS_Vector_Forecaster.cross_val  r  r   rc  c           	         t          | j        j                  }t          t          | j        d                                                    }t          t          | j        d                                                    }t          t          |                    D ]K}t          j                     t          j	        |||         d||         z              t          j	        |||         d||         z   d           t          t          | j                  | j        z            }| j        }t          |          D ]A}t          j	        |||z  |dz   |z           ||         ||z  |dz   |z           d	
           Bt          j                     t          j                     t          j        dt          | j                  z   dz   t          | j                  z              Mt          j                     d S r  r  r  s	            r   r  z0LSTMS_Vector_Forecaster.plot_targets_predictions  r  r   c                    |d k    r't          j                    }t          j                    }n|}t          t	          | j        d                                                    }t          t	          | j        d                                                    }|                    |d         |d         ddd           |                    |d         |d         d	d
d           t          t          | j                  | j
        z            }| j
        }t          |          D ]I}	|                    |d         |	|z  |	dz   |z           |d         |	|z  |	dz   |z           dd           J|d k    rD|                    dt          | j                  z   dz   t          | j
                  z              d S |                    |           d S r  r  r  s
             r   r  z;LSTMS_Vector_Forecaster.plot_targets_predictions_as_vectors/  r  r   c                    t          j                     t          t          | j        d                                                    }t          t          |                    D ]}t          j                     t          j        ||         |d||         z              t          j	        d           t          j
        d           t          j        d           t          j                     t          j                     d S rm  rp  rq  s        r   r  z%LSTMS_Vector_Forecaster.plot_res_histB  rr  r   r  r  r   r   r   r  r    s          BDQSbhtv  CG    / / /`k k k& 1@            & .=__ 
 
 
 
 
 
r   r  )Dr  rH   r   
matplotlibr   r  torch.nnr  r   r   torch.optimr   r   torch.utils.datar	   r
   r   statsmodels.tsa.arima.modelr   "statsmodels.tsa.statespace.sarimaxr   sklearn.linear_modelr   r   r   statsmodels.tsa.holtwintersr   cartopycartopy.crscrsccrscartopy.featurefeaturecfeatureobjectr   r/   r?   r]   rf   r   r   r   r   r   r*  rB  rD  rU  r  r  r  r  r  r  r;  rt  r  r  r  r  r  r  r  r  r  r  r  r   r   r   <module>r      s                   $ $ $ $ $ $ $ $ ! ! ! ! ! ! ! ! > > > > > > > > > > - - - - - - 6 6 6 6 6 6 ? ? ? ? ? ? ? ? ? ? < < < < < <        " " " " " "
 
 
 
 
& 
 
 
O O O O O O O O&, , , , ,6 , , ,44 4 4 4 4v 4 4 4", , , , , , , ,.  "  ": : : : :f : : :z	: 	: 	: 	: 	:F 	: 	: 	:z5 z5 z5 z5 z5v z5 z5 z5z- - - - -F - - -2      f   2c c c c c c c cLc c c c c c c cLZ Z Z Z Z Z Z Zz_ _ _ _ _ _ _ _Dg g g g g g g gTl l l l l l l l^r r r r r r r rjV V V V V V V Vr= = = = = = = =@p p p p p p p pft t t t t t t tnU U U U U U U UpB B B B B B B BJl l l l l l l l^_ _ _ _ _ _ _ _Dv v v v v v v vrD D D D D D D DN_ _ _ _ _ _ _ _Dy y y y y y y yxE E E E E E E E E Er   