---
# System prepended metadata

title: Global Forecasting Using Decision Trees

---

# Global Forecasting Using Decision Trees
Contributors - 

```
class GlobalForecaster:#Name to be changed
    def __init__(self,
                regressor,
                group_ids:List,#Ids to identify panels
                date_col, #Name of Date Col,
                target_col,#String,
                lags,#List of lags,
                differences,
                categorical_cols #If any,
                strategy,#recursive/direct
    )
    ...
    
    def fit(X,y):
    
        X= self._transform(X)
        if self.strategy == "recursive":
            X=self._target(X)
        elif self.strategy == "direct":
            ...
        ...
        
    def _transform(self,data):
        feature_engineering = dict()
        for each_lag in self.lags:
            feature_engineering[f"lag_{each_lag}"] = \
            data.groupby(self.group_ids)[self.target_col].shift(each_lag)

        for each_lag in self.shfts:
            feature_engineering[f"diff_{each_lag}"] = \
            data.groupby(self.group_ids)[self.target_col].diff(each_lag)
            
        data = data.assign(**feature_engineering)
        
    def _target(self,data,shift=-1):
        feature_engineering[f"target"] = data.\
        groupby(self.group_ids)[self.target_col].shift(shift)
                                         
    def _extract_seasonal_features(self):
        if freq=="D":
            features["date"] = pd.to_datetime(features["date"])

            features["month"] = features["date"].dt.month.astype("category").cat.codes.values
            features["dayofweek"] = features["date"].dt.dayofweek.astype("category").cat.codes.values
            features["weekofyear"] = features["date"].dt.weekofyear.astype("category").cat.codes.values
            features["week_of_month"] = ...
        
        self._save_above_encoding_for_test_set
        
    def _encode_group_ids_and_categorical_cols(self:
        ...
        
    def predict(fh):
        ...
    
    
```


Points:

- How to determine lags(User/Predefined)
- We need to add Differences(As We can't detrend for each panel)
- How to determine Differences(User/Predefined)
- To capture seasonality, we need to extract calender/date features(challenge- different feature extraction for different time frequencies)
- We need a Global Train Test split
- Need an efficient way for recursive/direct forecast


# make_panel_reduction