野菜価格に影響する要因を探り当てよう!
tanuking0
参加者の皆様お疲れ様でした。また、運営の方々、本コンペを開催してくださりありがとうございました。
8thのソリューションを共有します。
価格データの11月と12月だけでどこまで予想できるかな、という試みです。気象データは値段に一定反映済みだろうということと、価格データも毎年似たような動きをするだろうし11月の価格からそう大きく外れることはないだろう、という仮定のもと試してみました。
処理の概要
import pandas as pd import numpy as np from google.colab import drive drive.mount('/content/drive') folder_path = [FOLDER_PATH]
train_df = pd.read_csv(folder_path + "train_data.csv") train_df.set_index('id', inplace=True) train_df = train_df.T
nov_dec_ratio_2016 = train_df["2016-12-01"] / train_df["2016-11-01"] nov_dec_ratio_2018 = train_df["2018-12-01"] / train_df["2018-11-01"] nov_dec_ratio = (nov_dec_ratio_2016 + nov_dec_ratio_2018) / 2 pred = (train_df["2019-11-01"] * nov_dec_ratio).round(0)# (参考:ここまででpublic 0.14525、private 0.16944
#みつばは12月に必ず高騰する。2016-18の12月の平均値を使うことにする dec_ave = ((train_df["2016-12-01"] + train_df["2017-12-01"] + train_df["2018-12-01"]) / 3).round(0) combined_df = pd.concat([pred, dec_ave], axis=1, keys=['pred', 'pred_sub']) condition = combined_df.index.str.contains('みつば') pred = pd.Series([combined_df.loc[idx, 'pred_sub'] if cond else combined_df.loc[idx, 'pred'] for idx, cond in zip(combined_df.index, condition)], index=combined_df.index)
#キャベツは上がったり下がったりを繰り返す。12月/11月比がx0.6-0.7になってしまっているが、これはたまたま。2019/11の値のままにする combined_df = pd.concat([train_df["2019-11-01"], pred], axis=1, keys=['nov_val', 'pred']) condition = combined_df.index.str.contains('キャベツ') pred = pd.Series([combined_df.loc[idx, 'nov_val'] if cond else combined_df.loc[idx, 'pred'] for idx, cond in zip(combined_df.index, condition)], index=combined_df.index)
#にんじんは直近安定しているが過去の暴騰暴落の影響で12月/11月比がx0.67。にんじんは小さい価格なので影響が大きく、あまり外したくない。直近は横ばいなので2019/11の値のままにする combined_df = pd.concat([train_df["2019-11-01"], pred], axis=1, keys=['nov_val', 'pred']) condition = combined_df.index.str.contains('にんじん') pred = pd.Series([combined_df.loc[idx, 'nov_val'] if cond else combined_df.loc[idx, 'pred'] for idx, cond in zip(combined_df.index, condition)], index=combined_df.index)
min_df = train_df.min(axis=1) max_df = train_df.max(axis=1) diff = max_df - min_df min_df = min_df + diff * 0.05 max_df = max_df - diff * 0.05 pred = np.where(pred < min_df, min_df, pred) pred = np.where(pred > max_df, max_df, pred) pred = pd.Series(pred,index=train_df.index).round(0)
submit file作成
pred_upd = pd.DataFrame(pred).reset_index() pred_upd.columns = ["id", "y"] pred_upd.to_csv("submit.csv", index=False) #public 0.12259、private 0.14407
キャベツの処理がないほうがprivate良かったみたいです