{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":82611,"databundleVersionId":9553358,"sourceType":"competition"}],"dockerImageVersionId":30775,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"#necessary\nimport pandas as pd#导入csv文件的库\nimport numpy as np#对矩阵进行科学计算的库\nfrom sklearn.linear_model import Ridge#岭回归模型\nimport warnings#避免一些可以忽略的报错\nwarnings.filterwarnings('ignore')#filterwarnings()方法是用于设置警告过滤器的方法，它可以控制警告信息的输出方式和级别。\n\nimport random#提供了一些用于生成随机数的函数\n#设置随机种子,保证模型可以复现\ndef seed_everything(seed):\n    np.random.seed(seed)#numpy的随机种子\n    random.seed(seed)#python内置的随机种子\nseed_everything(seed=2024)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train=pd.read_csv(\"/kaggle/input/brist1d/train.csv\")\ntest=pd.read_csv(\"/kaggle/input/brist1d/test.csv\")\nprint(f\"len(train):{len(train)},len(test):{len(test)}\")\ntrain.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#six float features\nfeats=['bg','insulin','hr','steps','cals','activity']\nts=['-5:55', '-5:50', '-5:45', '-5:40', '-5:35', '-5:30', '-5:25', '-5:20', '-5:15', '-5:10', '-5:05', '-5:00', '-4:55', '-4:50', '-4:45', '-4:40', '-4:35', '-4:30', '-4:25', '-4:20', '-4:15', '-4:10', '-4:05', '-4:00', '-3:55', '-3:50', '-3:45', '-3:40', '-3:35', '-3:30', '-3:25', '-3:20', '-3:15', '-3:10', '-3:05', '-3:00', '-2:55', '-2:50', '-2:45', '-2:40', '-2:35', '-2:30', '-2:25', '-2:20', '-2:15', '-2:10', '-2:05', '-2:00', '-1:55', '-1:50', '-1:45', '-1:40', '-1:35', '-1:30', '-1:25', '-1:20', '-1:15', '-1:10', '-1:05', '-1:00', '-0:55', '-0:50', '-0:45', '-0:40', '-0:35', '-0:30', '-0:25', '-0:20', '-0:15', '-0:10', '-0:05', '-0:00']\ndef get_more_data(df,timestep,mode='train'):#mode is train or test\n    full_data=[]\n    #12step is 1 hour.\n    for start in range(0,len(ts)-timestep-12):\n        end=start+timestep\n        target=end+12\n        #[start:end] target\n        hours_data=df[['p_num']+[f+ts[i]  for i in range(start,end) for f in feats]+['bg'+ts[target]]]\n        hours_data.columns=['p_num']+[f+str(i-start)  for i in range(start,end)for f in feats]+['bg+1:00']\n        hours_data=hours_data[~hours_data['bg+1:00'].isna()]\n        full_data.append(hours_data)\n    if mode=='test':\n        hours_data=df[['p_num']+[f+ts[i]  for i in range(len(ts)-timestep,len(ts)) for f in feats]]\n        hours_data.columns=['p_num']+[f+str(i-len(ts)+timestep)  for i in range(len(ts)-timestep,len(ts))for f in feats]\n        full_data.append(hours_data)\n    full_data=pd.concat(full_data).drop_duplicates()\n    return full_data","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ndef FE(df,mode='train',timestep=32):#mode='train' or 'test'\n    #mean_isnan is 0.98 ,id is useless.\n    print(\"< drop useless columns >\")\n    df.drop([c for c in df.columns if 'carbs' in c]+['id'],axis=1,inplace=True)\n\n    #nearest bgs' correlation is greater than 0.99.\n    print(\"< fillna >\")\n    bgs=[c for c in list(df.columns) if (c!='bg+1:00') and ('bg' in c)]\n    df[bgs] = df[bgs].fillna(method='ffill', axis=1)\n    df[bgs] = df[bgs].fillna(method='bfill', axis=1)\n\n    #transform None to np.nan.\n    print(\"< fix bug >\")\n    float_cols=[c for c in df.columns  for f in feats[:-1] if f in c]\n    df[float_cols]=df[float_cols].astype(np.float32)\n\n    print(\"< get more data >\")\n    df=get_more_data(df,timestep=timestep,mode=mode)\n    \n    return df\n\ntrain=FE(train,mode='train')\ntest=FE(test,mode='test')\ntotal=pd.concat((train,test))\nprint(len(train),len(test),len(total))\ntest=total[total['bg+1:00'].isna()]\ntrain=total[~total['bg+1:00'].isna()]\nprint(len(train),len(test),len(total))\ntrain.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def RMSE(y_true,y_pred):\n    return np.sqrt(np.mean((y_true-y_pred)**2))\nbg=[f'bg{i}' for i in range(32)]\nvalid=train[train['p_num']=='p03']\ntrain=train[train['p_num']!='p03']\nX=train[bg].values\ny=train['bg+1:00'].values\nvalid_X=valid[bg].values\nvalid_y=valid['bg+1:00'].values\nmodel=Ridge(alpha=1.0)\nmodel.fit(X,y)\ny_pred=model.predict(valid_X)\nprint(f\"valid_rmse:{RMSE(valid_y,y_pred)}\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_X=test[bg].values\ntest_pred=model.predict(test_X)\nsubmission=pd.read_csv(\"/kaggle/input/brist1d/sample_submission.csv\")\nsubmission['bg+1:00']=test_pred\nsubmission.to_csv(\"submission.csv\",index=None)\nsubmission.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}