{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport gc\nimport datetime,random\nimport warnings\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\nfrom time import time\nfrom scipy.stats import skew, boxcox, mstats\nfrom sklearn.metrics import mean_squared_error\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.preprocessing import MinMaxScaler\nfrom sklearn.experimental import enable_iterative_imputer\nfrom sklearn.impute import IterativeImputer\nfrom sklearn.linear_model import BayesianRidge\nfrom pandas.api.types import is_datetime64_any_dtype as is_datetime\nfrom pandas.api.types import is_categorical_dtype\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import mean_squared_error\nfrom sklearn.model_selection import KFold\nimport lightgbm as lgb\nimport xgboost as xgb\nfrom sklearn.model_selection import cross_val_score\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"SEED = 42\nFOLDS = 3\n\ndef seed_env(seed=SEED):\n    random.seed(seed)\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    np.random.seed(seed)\n\npd.set_option('display.max_columns', 380)\npd.set_option('display.max_rows', 500)\nseed_env()\n\nsns.set()\n%matplotlib inline","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Feature engineering"},{"metadata":{"trusted":true},"cell_type":"code","source":"def air_temp_fe(df):\n    df['min_day_temp'] = df.groupby(['building_id','month','day'])['air_temperature'].transform('min').astype(np.float16)\n    df['max_day_temp'] = df.groupby(['building_id','month','day'])['air_temperature'].transform('max').astype(np.float16)\n    df['mean_day_temp'] = df.groupby(['building_id','month','day'])['air_temperature'].transform('mean').astype(np.float16)\n    df['site_id_mean_temp'] = df.groupby(['site_id','month'])['air_temperature'].transform('mean').astype(np.float16)\n    #https://en.wikipedia.org/wiki/Degree_day\n    #https://www.sciencedirect.com/topics/engineering/heating-degree-day\n    nominal_degree = 18\n    df['degree_day'] = (np.round((df['max_day_temp'] + df['min_day_temp'])/2) - nominal_degree).astype(np.float16)\n    #df['degree_day_month'] =  df.groupby(['building_id','month'])['degree_day'].transform(lambda x: sum(np.abs(x))).astype(np.float16)\n    #df['air_temp_month'] = df.groupby(['building_id','month'])['air_temperature'].transform('mean').astype(np.float16)\n    df.drop(['min_day_temp','max_day_temp'], axis = 1, inplace = True)\n\ndef sea_level_pressure_fe(df):\n    #df['sea_level_pressure_month_max'] = df.groupby(['building_id','month'])['sea_level_pressure'].transform('max').astype(np.float16)\n    #df['sea_level_pressure_month_min'] = df.groupby(['building_id','month'])['sea_level_pressure'].transform('min').astype(np.float16)\n    df['sea_level_pressure_month_mean'] = df.groupby(['building_id','month'])['sea_level_pressure'].transform('mean').astype(np.float16)\n    #air temperature and sea level pressure are used in altitude calculation\n    #https://keisan.casio.com/exec/system/1224585971\n    #df['sea_level_air_temp_rel'] = (df['sea_level_pressure']*df['air_temperature']*0.00065).astype(np.float32)\n    \n\ndef add_lag_feature(df, window=3):\n    group_df = df.groupby('site_id')\n    cols = ['air_temperature']\n    rolled = group_df[cols].rolling(window=window, min_periods=0)\n    lag_mean = rolled.mean().reset_index().astype(np.float16)\n    \n    for col in cols:\n        df[f'{col}_mean_lag{window}'] = lag_mean[col].astype(np.float32)\n    \n    del lag_mean,rolled,group_df\n    gc.collect()\n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def set_localtime(df):\n    zone_dict={0:4,1:0,2:7,3:4,4:7,5:0,6:4,7:4,8:4,9:5,10:7,11:4,12:0,13:5,14:4,15:4} \n    for sid, zone in zone_dict.items():\n        sids = df.site_id == sid\n        df.loc[sids, 'timestamp'] = df[sids].timestamp - pd.offsets.Hour(zone)\n        \ndef time_features(df):\n    df['month'] = df['timestamp'].dt.month.astype(np.int8)\n    df['day'] = df['timestamp'].dt.day.astype(np.int8)\n    df['hour'] = df['timestamp'].dt.hour.astype(np.int8)\n    df['weekday'] = df['timestamp'].dt.weekday.astype(np.int8)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def building_features(df,df_group):\n    building_mean = df_group.mean().astype(np.float16)\n    building_median = df_group.median().astype(np.float16)\n    building_std = df_group.std().astype(np.float16)\n    \n    df['building_median'] = df['building_id'].map(building_median).astype(np.float16)\n    df['building_mean'] = df['building_id'].map(building_mean).astype(np.float16)\n    df['building_std'] = df['building_id'].map(building_std).astype(np.float16)\n    \n    del building_mean,building_median,building_std\n    gc.collect()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Modelling"},{"metadata":{"trusted":true},"cell_type":"code","source":"categorical_features = [\"primary_use\",\"building_id\",\"month\",\"day\",\"hour\",\"weekday\",\"site_id\"]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def train(train_df, target, splits):\n    params = {\n    \"objective\": \"regression\",\n    \"boosting\": \"gbdt\",\n    \"num_leaves\": 41,\n    \"max_depth\": 6,\n    \"learning_rate\": 0.05,\n    \"feature_fraction\": 0.8,\n    \"bagging_fraction\": 0.33,\n    \"bagging_freq\": 5,\n    \"metric\": \"rmse\",\n    \"reg_lambda\": 2\n    }\n    \n    lgb_models = list()\n    #kf = KFold(n_splits=FOLDS, shuffle=False, random_state=SEED)\n    \n    for split in splits:\n        train_index = split[0] \n        val_index = split[1] \n        train_X = train_df.iloc[train_index]\n        val_X = train_df.iloc[val_index]\n        train_y = target.iloc[train_index]\n        val_y = target.iloc[val_index]\n        lgb_train = lgb.Dataset(train_X, train_y, categorical_feature=categorical_features)\n        lgb_eval = lgb.Dataset(val_X, val_y, categorical_feature=categorical_features)\n        lgb_model = lgb.train(params,\n                lgb_train,\n                valid_sets=(lgb_train, lgb_eval),\n                valid_names=[\"train\",\"valid\"],\n                num_boost_round=1600,\n                early_stopping_rounds=200,\n                verbose_eval = 200)\n        \n        lgb_models.append(lgb_model)\n        \n        del train_X,val_X,train_y,val_y,lgb_train,lgb_eval\n        gc.collect()\n        \n    return lgb_models","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def visualize_feature_importance(model,columns):\n    feature_imp = pd.DataFrame(sorted(zip(model.feature_importance(),columns), reverse=True), columns=[\"Value\",\"Feature\"])\n    plt.figure(figsize=(10,10))\n    importance_bar = sns.barplot(data=feature_imp, x='Value', y='Feature')\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Training"},{"metadata":{"trusted":true},"cell_type":"code","source":"def df_transformation(df, group):\n    df['timestamp'] = pd.to_datetime(df['timestamp'], format=\"%Y-%m-%d %H:%M:%S\")\n    df[\"meter\"] = df[\"meter\"].astype(np.int8)\n    df[\"building_id\"] = df[\"building_id\"].astype(np.int16)\n    time_features(df)\n    building_features(df,group)\n\ndef weather_transformation(weather):\n    weather['timestamp'] = pd.to_datetime(weather['timestamp'], format=\"%Y-%m-%d %H:%M:%S\")\n    set_localtime(weather)\n    #add_lag_feature(weather)\n    \ndef building_transformation(building):\n    building[\"primary_use\"] = building[\"primary_use\"].astype(np.int8)\n    building[\"floor_count\"] = building[\"floor_count\"].astype(np.int8)\n    building[\"year_built\"] = building[\"year_built\"].astype(np.int16)\n    \ndef memory_adj(df):\n    df['site_id'] = df['site_id'].astype(np.int8)\n    df['square_feet'] = df['square_feet'].astype(np.int32)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = pd.read_feather('../input/ashre-data-clean-leak-for-train/train_no_nan_s.feather')\ntrain_df['meter_reading'] = np.log1p(train_df['meter_reading'])\ndf_group = train_df.groupby('building_id')['meter_reading']\ndf_transformation(train_df,df_group)\n\nweather_df = pd.read_feather('../input/ashre-data-clean-leak-for-train/weather_intr_no_nan_s.feather')\nbuilding_metadata_df = pd.read_feather('../input/ashre-data-clean-leak-for-train/building_no_nan_s.feather')\n\nweather_transformation(weather_df)\nbuilding_transformation(building_metadata_df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def df_for_meter_type(meter):\n    target_train_df = train_df[train_df['meter'] == meter]\n    target_train_df = target_train_df.merge(building_metadata_df, on='building_id', how='left')\n    target_train_df = target_train_df.merge(weather_df, on=['site_id', 'timestamp'], how='left')\n    \n    air_temp_fe(target_train_df)\n    sea_level_pressure_fe(target_train_df)\n    target_train_df.drop(['air_temperature','sea_level_pressure','wind_direction','wind_speed'], axis = 1, inplace = True)\n    \n    train_idx_f1 = target_train_df[(target_train_df.timestamp.dt.year == 2016)].index\n    test_idx_f1 = target_train_df[(target_train_df.timestamp.dt.year == 2017) | (target_train_df.timestamp.dt.year == 2018)].index\n    train_idx_f2 = target_train_df[(target_train_df.timestamp.dt.year == 2016) | (target_train_df.timestamp.dt.year == 2017)].index\n    test_idx_f2 = target_train_df[(target_train_df.timestamp.dt.year == 2018)].index\n    \n    splits = [(train_idx_f1,test_idx_f1), (train_idx_f2,test_idx_f2)]\n    \n    target = target_train_df['meter_reading']\n    meter_df = target_train_df.drop(['meter_reading','timestamp','meter'],axis = 1,inplace = False)\n    memory_adj(meter_df)\n    \n    del target_train_df,train_idx_f1,test_idx_f1,train_idx_f2,test_idx_f2\n    return meter_df, target, splits","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\nmeter_0_df, target, splits = df_for_meter_type(0)\nmeter_0_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"meter_0_models = train(meter_0_df,target,splits)\ncolumns = meter_0_df.columns\n\ndel meter_0_df,target,splits\ngc.collect()\n\nvisualize_feature_importance(meter_0_models[0],columns)\nvisualize_feature_importance(meter_0_models[1],columns)\n\ndel columns\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\nmeter_1_df, target, splits = df_for_meter_type(1)\nmeter_1_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"meter_1_models = train(meter_1_df,target,splits)\ncolumns = meter_1_df.columns\n\ndel meter_1_df,target,splits\ngc.collect()\n\nvisualize_feature_importance(meter_1_models[0],columns)\nvisualize_feature_importance(meter_1_models[1],columns)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\nmeter_2_df, target, splits = df_for_meter_type(2)\nmeter_2_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"meter_2_models = train(meter_2_df,target,splits)\ncolumns = meter_2_df.columns\n\ndel meter_2_df,target,splits\ngc.collect()\n\nvisualize_feature_importance(meter_2_models[0],columns)\nvisualize_feature_importance(meter_2_models[1],columns)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\nmeter_3_df, target, splits = df_for_meter_type(2)\nmeter_3_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"meter_3_models = train(meter_3_df,target,splits)\ncolumns = meter_3_df.columns\n\ndel meter_3_df,target,splits\ngc.collect()\n\nvisualize_feature_importance(meter_3_models[0],columns)\nvisualize_feature_importance(meter_3_models[1],columns)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"del train_df, weather_df \ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_df = pd.read_feather('../input/ashre-simple-no-missing-for-test/test_no_nan_s.feather')\ndf_transformation(test_df,df_group)\n\nweather_test_df = pd.read_feather('../input/ashre-simple-no-missing-for-test/weather_test_intr_no_nan_s.feather')\nbuilding_metadata_df = pd.read_feather('../input/ashre-simple-no-missing-for-test/building_test_no_nan_s.feather')\n\nweather_transformation(weather_test_df)\nbuilding_transformation(building_metadata_df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def df_for_meter_type_test(meter):\n    target_test_df = test_df[test_df['meter'] == meter]\n    target_test_df = target_test_df.merge(building_metadata_df, on='building_id', how='left')\n    target_test_df = target_test_df.merge(weather_test_df, on=['site_id', 'timestamp'], how='left')\n    \n    air_temp_fe(target_test_df)\n    sea_level_pressure_fe(target_test_df)\n    target_test_df.drop(['air_temperature','sea_level_pressure','wind_direction','wind_speed'], axis = 1, inplace = True)\n    meter_df = target_test_df.drop(['timestamp','meter','row_id'],axis = 1,inplace = False)\n    memory_adj(meter_df)\n    \n    del target_test_df\n    return meter_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_test = df_for_meter_type_test(0)\n\ny_test0 = sum([model.predict(X_test, num_iteration=model.best_iteration) for model in meter_0_models])/2\n\ndel X_test,meter_0_models\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_test = df_for_meter_type_test(1)\n\ny_test1 = sum([model.predict(X_test, num_iteration=model.best_iteration) for model in meter_1_models])/2\n\ndel X_test,meter_1_models\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_test = df_for_meter_type_test(2)\n\ny_test2 = sum([model.predict(X_test, num_iteration=model.best_iteration) for model in meter_2_models])/2\n\ndel X_test,meter_2_models\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_test = df_for_meter_type_test(3)\n\ny_test3 = sum([model.predict(X_test, num_iteration=model.best_iteration) for model in meter_3_models])/2\n\ndel X_test,meter_3_models\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample_submission = pd.read_csv('../input/ashrae-energy-prediction/sample_submission.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample_submission.loc[test_df[test_df['meter'] == 0]['row_id'], 'meter_reading'] = np.clip(np.expm1(y_test0),0, a_max=None)\nsample_submission.loc[test_df[test_df['meter'] == 1]['row_id'], 'meter_reading'] = np.clip(np.expm1(y_test1),0, a_max=None)\nsample_submission.loc[test_df[test_df['meter'] == 2]['row_id'], 'meter_reading'] = np.clip(np.expm1(y_test2),0, a_max=None)\nsample_submission.loc[test_df[test_df['meter'] == 3]['row_id'], 'meter_reading'] = np.clip(np.expm1(y_test3),0, a_max=None)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample_submission.to_csv('submission_Dec8_1.csv', index=False, float_format='%.4f')","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}