|
@@ -11,14 +11,16 @@ except:
|
|
|
from .._base._base import BaseModel
|
|
from .._base._base import BaseModel
|
|
|
|
|
|
|
|
class RoomDewPredictor(BaseModel):
|
|
class RoomDewPredictor(BaseModel):
|
|
|
- def __init__(self):
|
|
|
|
|
|
|
+ def __init__(self,coef_is_pos:bool):
|
|
|
super().__init__()
|
|
super().__init__()
|
|
|
|
|
+ self.coef_is_pos = coef_is_pos
|
|
|
|
|
+ self.record_load_info(coef_is_pos = self.coef_is_pos)
|
|
|
|
|
|
|
|
def fit_Droom(self,Dout:np.ndarray, Droom:np.ndarray):
|
|
def fit_Droom(self,Dout:np.ndarray, Droom:np.ndarray):
|
|
|
- _,_,best_lag,best_coef = self.get_lag_coef(Dout=Dout,Droom=Droom)
|
|
|
|
|
|
|
+ _,_,best_lag,best_coef,boundary = self.get_lag_coef(Dout=Dout,Droom=Droom)
|
|
|
self.record_model(
|
|
self.record_model(
|
|
|
model_name = 'Droom',
|
|
model_name = 'Droom',
|
|
|
- model = {'coef':best_coef,'lag':best_lag},
|
|
|
|
|
|
|
+ model = {'coef':best_coef,'lag':best_lag,'boundary':boundary},
|
|
|
train_data = {'Dout':Dout,'Droom':Droom},
|
|
train_data = {'Dout':Dout,'Droom':Droom},
|
|
|
train_metric = {'R2':1,'MAE':1,'MAPE':1},
|
|
train_metric = {'R2':1,'MAE':1,'MAPE':1},
|
|
|
)
|
|
)
|
|
@@ -34,13 +36,33 @@ class RoomDewPredictor(BaseModel):
|
|
|
model = self.model_info['model_Droom']
|
|
model = self.model_info['model_Droom']
|
|
|
lag = model['lag']
|
|
lag = model['lag']
|
|
|
coef = model['coef']
|
|
coef = model['coef']
|
|
|
|
|
+ boundary = model['boundary']
|
|
|
Dout = Dout[-lag-1:]
|
|
Dout = Dout[-lag-1:]
|
|
|
Dout_diff = np.diff(Dout)
|
|
Dout_diff = np.diff(Dout)
|
|
|
- Droom_diff = Dout_diff * coef
|
|
|
|
|
|
|
+ Droom_diff = np.clip(Dout_diff * coef,boundary[0],boundary[1])
|
|
|
Droom = smooth(Droom_diff.cumsum() + Droom_cur,sm_frac)
|
|
Droom = smooth(Droom_diff.cumsum() + Droom_cur,sm_frac)
|
|
|
return Droom
|
|
return Droom
|
|
|
|
|
|
|
|
- @classmethod
|
|
|
|
|
|
|
+ def plot_predict_Droom(self,Dout:np.ndarray,Droom_real:np.ndarray,sm_frac=0) -> np.ndarray:
|
|
|
|
|
+ all_pred = {}
|
|
|
|
|
+ for i in range(self.lag+1,len(Dout)-self.lag):
|
|
|
|
|
+ Droom_cur = Droom_real[i]
|
|
|
|
|
+ pred = self.predict_Droom(Dout=Dout[:i],Droom_cur=Droom_cur,sm_frac=sm_frac)
|
|
|
|
|
+ all_pred[f'step_{i}'] = pd.Series(pred,index=np.arange(i+1,i+self.lag+1))
|
|
|
|
|
+ all_pred = pd.concat(all_pred,axis=1)
|
|
|
|
|
+ plot = (
|
|
|
|
|
+ all_pred
|
|
|
|
|
+ .assign(D=Droom_real[self.lag+2:])
|
|
|
|
|
+ .reset_index()
|
|
|
|
|
+ .melt(id_vars=['index','D'])
|
|
|
|
|
+ .pipe(gg.ggplot)
|
|
|
|
|
+ + gg.aes(x='index',y='value',color='variable')
|
|
|
|
|
+ + gg.geom_line()
|
|
|
|
|
+ + gg.geom_line(gg.aes(x='index',y='D'),color='black')
|
|
|
|
|
+ + gg.theme(legend_position='none')
|
|
|
|
|
+ )
|
|
|
|
|
+ return plot
|
|
|
|
|
+
|
|
|
def to_diffdata(
|
|
def to_diffdata(
|
|
|
self,
|
|
self,
|
|
|
Dout : np.ndarray,
|
|
Dout : np.ndarray,
|
|
@@ -88,7 +110,7 @@ class RoomDewPredictor(BaseModel):
|
|
|
|
|
|
|
|
def plot_diffdata_lagcorr(self,Dout:np.ndarray, Droom:np.ndarray):
|
|
def plot_diffdata_lagcorr(self,Dout:np.ndarray, Droom:np.ndarray):
|
|
|
|
|
|
|
|
- all_coef,all_r2,best_lag,best_coef = self.get_lag_coef(Dout=Dout,Droom=Droom)
|
|
|
|
|
|
|
+ all_coef,all_r2,best_lag,_,_ = self.get_lag_coef(Dout=Dout,Droom=Droom)
|
|
|
data = pd.DataFrame({'coef':all_coef,'r2':all_r2,'lag':np.arange(1,30)})
|
|
data = pd.DataFrame({'coef':all_coef,'r2':all_r2,'lag':np.arange(1,30)})
|
|
|
p1 = (
|
|
p1 = (
|
|
|
data
|
|
data
|
|
@@ -97,6 +119,7 @@ class RoomDewPredictor(BaseModel):
|
|
|
+ gg.geom_point()
|
|
+ gg.geom_point()
|
|
|
+ gg.geom_line()
|
|
+ gg.geom_line()
|
|
|
+ gg.geom_vline(xintercept=best_lag,color='red',linetype='--')
|
|
+ gg.geom_vline(xintercept=best_lag,color='red',linetype='--')
|
|
|
|
|
+ + gg.geom_hline(yintercept=0,color='blue',linetype='--')
|
|
|
+ gg.scale_x_continuous(breaks=np.arange(1,30))
|
|
+ gg.scale_x_continuous(breaks=np.arange(1,30))
|
|
|
)
|
|
)
|
|
|
p2 = (
|
|
p2 = (
|
|
@@ -106,6 +129,7 @@ class RoomDewPredictor(BaseModel):
|
|
|
+ gg.geom_point()
|
|
+ gg.geom_point()
|
|
|
+ gg.geom_line()
|
|
+ gg.geom_line()
|
|
|
+ gg.geom_vline(xintercept=best_lag,color='red',linetype='--')
|
|
+ gg.geom_vline(xintercept=best_lag,color='red',linetype='--')
|
|
|
|
|
+ + gg.geom_hline(yintercept=0.5,color='blue',linetype='--')
|
|
|
+ gg.scale_x_continuous(breaks=np.arange(1,30))
|
|
+ gg.scale_x_continuous(breaks=np.arange(1,30))
|
|
|
+ gg.scale_y_continuous(breaks=np.arange(0,1,0.2))
|
|
+ gg.scale_y_continuous(breaks=np.arange(0,1,0.2))
|
|
|
)
|
|
)
|
|
@@ -130,6 +154,8 @@ class RoomDewPredictor(BaseModel):
|
|
|
|
|
|
|
|
def get_lag_coef(self,Dout:np.ndarray, Droom:np.ndarray):
|
|
def get_lag_coef(self,Dout:np.ndarray, Droom:np.ndarray):
|
|
|
diffdata = self.to_diffdata(Dout=Dout,Droom=Droom)
|
|
diffdata = self.to_diffdata(Dout=Dout,Droom=Droom)
|
|
|
|
|
+ boundary = diffdata.loc[:,'Droom'].quantile(q=[0.01,0.99])
|
|
|
|
|
+ boundary = (boundary.iat[0],boundary.iat[1])
|
|
|
all_lag = np.arange(1,30)
|
|
all_lag = np.arange(1,30)
|
|
|
all_coef = []
|
|
all_coef = []
|
|
|
all_r2 = []
|
|
all_r2 = []
|
|
@@ -145,9 +171,24 @@ class RoomDewPredictor(BaseModel):
|
|
|
all_r2.append(r2)
|
|
all_r2.append(r2)
|
|
|
all_coef = np.array(all_coef)
|
|
all_coef = np.array(all_coef)
|
|
|
all_r2 = np.array(all_r2)
|
|
all_r2 = np.array(all_r2)
|
|
|
- best_lag = all_lag[all_r2.argmax()]
|
|
|
|
|
- best_coef = all_coef[all_r2.argmax()]
|
|
|
|
|
- return all_coef,all_r2,best_lag,best_coef
|
|
|
|
|
|
|
+
|
|
|
|
|
+ is_right_coef = all_coef > 0 if self.coef_is_pos else all_coef < 0
|
|
|
|
|
+ right_lag = all_lag[is_right_coef]
|
|
|
|
|
+ right_coef = all_coef[is_right_coef]
|
|
|
|
|
+
|
|
|
|
|
+ if np.sum(is_right_coef) == 0:
|
|
|
|
|
+ best_lag = 0
|
|
|
|
|
+ best_coef = 0
|
|
|
|
|
+ else:
|
|
|
|
|
+ best_lag = right_lag[all_r2[is_right_coef].argmax()]
|
|
|
|
|
+ best_coef = right_coef[all_r2[is_right_coef].argmax()]
|
|
|
|
|
+ return (
|
|
|
|
|
+ all_coef,
|
|
|
|
|
+ all_r2,
|
|
|
|
|
+ best_lag,
|
|
|
|
|
+ best_coef,
|
|
|
|
|
+ boundary
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
def smooth(y:pd.Series,frac=0.1):
|
|
def smooth(y:pd.Series,frac=0.1):
|
|
|
import statsmodels.api as sm
|
|
import statsmodels.api as sm
|