{"cells":[{"metadata":{},"cell_type":"markdown","source":"# 1. Read Data"},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"%%time\n\nimport numpy as np \nimport pandas as pd\n\nTRAIN_PATH = '/kaggle/input/ashrae-energy-prediction/train.csv'\nTEST_PATH  = '/kaggle/input/ashrae-energy-prediction/test.csv'\n\ntrain = pd.read_csv(TRAIN_PATH)\ntest  = pd.read_csv(TEST_PATH)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_train = train['meter_reading']\ndel train['meter_reading']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test.set_index('row_id', inplace=True)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 2. Preprocessing"},{"metadata":{"trusted":true},"cell_type":"code","source":"def datetime_features(x, attrs=['year', 'month', 'day'], prefix='dt_'):\n    x = pd.to_datetime(x)\n    features = [getattr(x.dt, attr).rename(prefix+attr) for attr in attrs]\n    df = pd.concat(features, axis=1)\n    return df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"FEATURES = ['month', 'weekday', 'hour']\n#FEATURES = ['month', 'hour']\n\ndt_train = datetime_features(train['timestamp'], FEATURES)\ndt_test  = datetime_features(test['timestamp'],  FEATURES)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cols = ['building_id', 'meter']\n\nX_train = pd.concat([dt_train, train[cols]], axis=1)\nX_test =  pd.concat([dt_test,  test[cols]],  axis=1)\n\nX_test","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"del train, test","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 2. Model"},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.base import BaseEstimator, RegressorMixin\n\n\nclass TargetEncodingRegressor(BaseEstimator, RegressorMixin):\n\n    def __init__(self, func='mean'):\n        self.func = func\n        \n        \n    def fit(self, X, y):\n        \n        self.X_cols = list(X)\n        self.mapper = X.join(y).groupby(self.X_cols).agg(self.func)\n        self.target_mean = y.apply(self.func)\n        self.target = y.name\n        \n        return self\n\n\n    def predict(self, X):\n        Xt = X.merge(self.mapper, on=self.X_cols, how='left')\n        return Xt[self.target].fillna(self.target_mean).values","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.base import BaseEstimator, RegressorMixin, clone\n\n\n\nclass TransformedTargetRegressor(BaseEstimator, RegressorMixin):\n    \n    def __init__(self, regressor=None, func=None, inverse_func=None):\n    \n        self.regressor = regressor\n        self.func = func\n        self.inverse_func = inverse_func\n\n\n    def fit(self, X, y, sample_weight=None):\n        \n        self.target = y.name\n        y = self.func(y)\n        \n        self.regressor_ = clone(self.regressor).fit(X, y)\n\n        return self\n\n\n    def predict(self, X):\n        \n        y = self.regressor_.predict(X)\n        y = self.inverse_func(y)\n\n        y = pd.Series(y, name=self.target, index=X.index)\n\n        return y","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"regressor = TargetEncodingRegressor('mean')\nestimator = TransformedTargetRegressor(regressor, np.log1p, np.expm1)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 3. Fit-predict"},{"metadata":{"trusted":true},"cell_type":"code","source":"estimator.fit(X_train, y_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_pred = estimator.predict(X_test)\n\ny_pred = y_pred.clip(upper=y_train.max())\ny_pred = y_pred.astype('float32')\n\ny_pred","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 4. Submit"},{"metadata":{"trusted":true},"cell_type":"code","source":"y_pred.to_csv('submission.csv', header=True)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":1}