From ba1129064d75f95dd9d87cf02616d7fa515ce85a Mon Sep 17 00:00:00 2001 From: benjas <909336740@qq.com> Date: Mon, 30 Nov 2020 22:07:22 +0800 Subject: [PATCH] =?UTF-8?q?Add=20=E5=B7=A5=E4=B8=9A=E5=8C=96=E5=B7=A5?= =?UTF-8?q?=E7=94=9F=E4=BA=A7=E9=A2=84=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../工业生产预测-checkpoint.ipynb | 3137 +++++++++++++++++ .../assets/20201130145942327.png | Bin 0 -> 296286 bytes .../jinnan_round1_testA_20181227.csv | 151 + .../jinnan_round1_testB_20190121.csv | 150 + .../jinnan_round1_train_20181227.csv | 1397 ++++++++ .../工业生产预测.ipynb | 3137 +++++++++++++++++ 6 files changed, 7972 insertions(+) create mode 100644 机器学习竞赛实战_优胜解决方案/工业生产预测/.ipynb_checkpoints/工业生产预测-checkpoint.ipynb create mode 100644 机器学习竞赛实战_优胜解决方案/工业生产预测/assets/20201130145942327.png create mode 100644 机器学习竞赛实战_优胜解决方案/工业生产预测/jinnan_round1_testA_20181227.csv create mode 100644 机器学习竞赛实战_优胜解决方案/工业生产预测/jinnan_round1_testB_20190121.csv create mode 100644 机器学习竞赛实战_优胜解决方案/工业生产预测/jinnan_round1_train_20181227.csv create mode 100644 机器学习竞赛实战_优胜解决方案/工业生产预测/工业生产预测.ipynb diff --git a/机器学习竞赛实战_优胜解决方案/工业生产预测/.ipynb_checkpoints/工业生产预测-checkpoint.ipynb b/机器学习竞赛实战_优胜解决方案/工业生产预测/.ipynb_checkpoints/工业生产预测-checkpoint.ipynb new file mode 100644 index 0000000..de8a0a6 --- /dev/null +++ b/机器学习竞赛实战_优胜解决方案/工业生产预测/.ipynb_checkpoints/工业生产预测-checkpoint.ipynb @@ -0,0 +1,3137 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 任务目标:利用异烟酸生产过程中的各参数,预测最终异烟酸的收率\n", + "\n", + "\n", + "**预测具体的值:回归任务**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 数据处理" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import warnings\n", + "import xgboost as xgb\n", + "from sklearn.model_selection import KFold\n", + "from sklearn.metrics import mean_squared_error as mse\n", + "\n", + "warnings.simplefilter('ignore')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"导入数据集\"\"\"\n", + "df_trn = pd.read_csv('jinnan_round1_train_20181227.csv', encoding='GB2312') # encoding进行编码\n", + "df_tst_a = pd.read_csv('jinnan_round1_testA_20181227.csv', encoding='GB2312')\n", + "df_tst_b = pd.read_csv('jinnan_round1_testB_20190121.csv', encoding='GB2312') " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
样本idA1A2A3A4A5A6A7A8A9...B6B7B8B9B10B11B12B13B14收率
0sample_1528300NaN405.070013:30:0038.0NaNNaN15:30:00...6511:30:0045.011:30-13:0014:00-15:30NaN800.00.154000.879
1sample_1698300NaN405.070014:00:0029.0NaNNaN16:00:00...806:00:0045.06:00-7:307:30-9:009:00-10:001200.00.154000.902
2sample_639300NaN405.070014:00:0029.0NaNNaN16:00:00...801:00:0045.01:00-2:302:30-4:004:00-5:001200.00.154000.936
3sample_483300NaN405.07001:30:0038.0NaNNaN3:00:00...6518:00:0045.019:00-20:3021:30-23:00NaN800.00.154000.902
4sample_617300NaN405.070022:00:0029.0NaNNaN0:00:00...809:00:0045.09:00-10:3010:30-12:0012:00-13:001200.00.154200.983
\n", + "

5 rows × 44 columns

\n", + "
" + ], + "text/plain": [ + " 样本id A1 A2 A3 A4 A5 A6 A7 A8 A9 ... \\\n", + "0 sample_1528 300 NaN 405.0 700 13:30:00 38.0 NaN NaN 15:30:00 ... \n", + "1 sample_1698 300 NaN 405.0 700 14:00:00 29.0 NaN NaN 16:00:00 ... \n", + "2 sample_639 300 NaN 405.0 700 14:00:00 29.0 NaN NaN 16:00:00 ... \n", + "3 sample_483 300 NaN 405.0 700 1:30:00 38.0 NaN NaN 3:00:00 ... \n", + "4 sample_617 300 NaN 405.0 700 22:00:00 29.0 NaN NaN 0:00:00 ... \n", + "\n", + " B6 B7 B8 B9 B10 B11 B12 B13 \\\n", + "0 65 11:30:00 45.0 11:30-13:00 14:00-15:30 NaN 800.0 0.15 \n", + "1 80 6:00:00 45.0 6:00-7:30 7:30-9:00 9:00-10:00 1200.0 0.15 \n", + "2 80 1:00:00 45.0 1:00-2:30 2:30-4:00 4:00-5:00 1200.0 0.15 \n", + "3 65 18:00:00 45.0 19:00-20:30 21:30-23:00 NaN 800.0 0.15 \n", + "4 80 9:00:00 45.0 9:00-10:30 10:30-12:00 12:00-13:00 1200.0 0.15 \n", + "\n", + " B14 收率 \n", + "0 400 0.879 \n", + "1 400 0.902 \n", + "2 400 0.936 \n", + "3 400 0.902 \n", + "4 420 0.983 \n", + "\n", + "[5 rows x 44 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 观察数据\n", + "df_trn.head() # 可以发现A2、A7等有NaN缺失值" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 1396 entries, 0 to 1395\n", + "Data columns (total 44 columns):\n", + "样本id 1396 non-null object\n", + "A1 1396 non-null int64\n", + "A2 42 non-null float64\n", + "A3 1354 non-null float64\n", + "A4 1396 non-null int64\n", + "A5 1396 non-null object\n", + "A6 1396 non-null float64\n", + "A7 149 non-null object\n", + "A8 149 non-null float64\n", + "A9 1396 non-null object\n", + "A10 1396 non-null int64\n", + "A11 1396 non-null object\n", + "A12 1396 non-null int64\n", + "A13 1396 non-null float64\n", + "A14 1396 non-null object\n", + "A15 1396 non-null float64\n", + "A16 1396 non-null object\n", + "A17 1396 non-null float64\n", + "A18 1396 non-null float64\n", + "A19 1396 non-null int64\n", + "A20 1396 non-null object\n", + "A21 1393 non-null float64\n", + "A22 1396 non-null float64\n", + "A23 1393 non-null float64\n", + "A24 1395 non-null object\n", + "A25 1396 non-null object\n", + "A26 1394 non-null object\n", + "A27 1396 non-null int64\n", + "A28 1396 non-null object\n", + "B1 1386 non-null float64\n", + "B2 1394 non-null float64\n", + "B3 1394 non-null float64\n", + "B4 1396 non-null object\n", + "B5 1395 non-null object\n", + "B6 1396 non-null int64\n", + "B7 1396 non-null object\n", + "B8 1395 non-null float64\n", + "B9 1396 non-null object\n", + "B10 1152 non-null object\n", + "B11 547 non-null object\n", + "B12 1395 non-null float64\n", + "B13 1395 non-null float64\n", + "B14 1396 non-null int64\n", + "收率 1396 non-null float64\n", + "dtypes: float64(18), int64(8), object(18)\n", + "memory usage: 480.0+ KB\n" + ] + } + ], + "source": [ + "df_trn.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "我们需要解决一些异常值,如某值相对其它值过大的离群点" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def train_abnormal_revise(data):\n", + " df_trn = data.copy() # 复制一份数据,不改变原数据\n", + " df_trn.loc[(df_trn['A1'] == 200) & (df_trn['A3'] == 405), 'A1'] = 300\n", + " # A5会发现三个不合法值,比如1900/1/21 0:00可能要表达的是21:00:00,我们替换掉\n", + " df_trn['A5'] = df_trn['A5'].replace('1900/1/21 0:00', '21:00:00')\n", + " df_trn['A5'] = df_trn['A5'].replace('1900/1/29 0:00', '14:00:00')\n", + " df_trn['A9'] = df_trn['A9'].replace('1900/1/9 7:00', '23:00:00')\n", + " # A9有两个不合法值\n", + " df_trn['A9'] = df_trn['A9'].replace('1900/1/9 7:00', '23:00:00')\n", + " df_trn['A9'] = df_trn['A9'].replace('700', '7:00:00')\n", + " # A11有一个不合法值\n", + " df_trn['A11'] = df_trn['A11'].replace('1900/1/1 2:30', '2:30:00')\n", + " df_trn['A11'] = df_trn['A11'].replace(':30:00', '00:30:00')\n", + " df_trn['A16'] = df_trn['A16'].replace('1900/1/12 0:00', '12:00:00')\n", + " df_trn['A20'] = df_trn['A20'].replace('6:00-6:30分', '6:00-6:30')\n", + " df_trn['A20'] = df_trn['A20'].replace('18:30-15:00', '18:30-19:00')\n", + " # A22有个不合法值\n", + " df_trn['A22'] = df_trn['A22'].replace(3.5, np.nan)\n", + " df_trn['A25'] = df_trn['A25'].replace('1900/3/10 0:00', 70).astype(int)\n", + " df_trn['A26'] = df_trn['A26'].replace('1900/3/13 0:00', '13:00:00')\n", + " df_trn['B1'] = df_trn['B1'].replace(3.5, np.nan)\n", + " df_trn['B4'] = df_trn['B4'].replace('15:00-1600', '15:00-16:00')\n", + " df_trn['B4'] = df_trn['B4'].replace('18:00-17:00', '16:00-17:00')\n", + " df_trn['B4'] = df_trn['B4'].replace('19:-20:05', '19:05-20:05')\n", + " df_trn['B9'] = df_trn['B9'].replace('23:00-7:30', '23:00-00:30')\n", + " df_trn['B14'] = df_trn['B14'].replace(40, 400)\n", + " return df_trn\n", + "\n", + "\n", + "def test_a_abnormal_revise(data):\n", + " df_tst = data.copy()\n", + " df_tst['A5'] = df_tst['A5'].replace('1900/1/22 0:00', '22:00:00')\n", + " df_tst['A7'] = df_tst['A7'].replace('0:50:00', '21:50:00')\n", + " df_tst['B14'] = df_tst['B14'].replace(785, 385)\n", + " return df_tst\n", + "\n", + "\n", + "def train_abnormal_adjust(data):\n", + " df_trn = data.copy()\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1894', 'A5'] = '14:00:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1234', 'A9'] = '0:00:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1020', 'A9'] = '18:30:00'\n", + "\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1380', 'A11'] = '15:30:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_844', 'A11'] = '10:00:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1348', 'A11'] = '17:00:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_25', 'A11'] = '00:30:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1105', 'A11'] = '4:00:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_313', 'A11'] = '15:30:00'\n", + "\n", + " df_trn.loc[df_trn['样本id'] == 'sample_291', 'A14'] = '19:30:00'\n", + "\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1398', 'A16'] = '11:00:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1177', 'A20'] = '19:00-20:00'\n", + "\n", + " df_trn.loc[df_trn['样本id'] == 'sample_71', 'A20'] = '16:20-16:50'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_14', 'A20'] = '18:00-18:30'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_69', 'A20'] = '6:10-6:50'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1500', 'A20'] = '23:00-23:30'\n", + "\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1524', 'A24'] = '15:00:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1524', 'A26'] = '15:30:00'\n", + "\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1046', 'A28'] = '18:00-18:30'\n", + "\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1230', 'B5'] = '17:00:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_97', 'B7'] = '1:00:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_752', 'B9'] = '11:00-14:00'\n", + "\n", + " df_trn.loc[df_trn['样本id'] == 'sample_609', 'B11'] = '11:00-12:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_643', 'B11'] = '12:00-13:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1164', 'B11'] = '5:00-6:00'\n", + " return df_trn\n", + "\n", + "\n", + "def test_a_abnormal_adjust(data):\n", + " df_tst = data.copy()\n", + " df_tst.loc[df_tst['样本id'] == 'sample_919', 'A9'] = '19:50:00'\n", + " return df_tst\n", + "\n", + "\n", + "def test_b_abnormal_adjust(data):\n", + " df_tst = data.copy()\n", + " df_tst.loc[df_tst['样本id'] == 'sample_566', 'A5'] = '18:00:00'\n", + " df_tst.loc[df_tst['样本id'] == 'sample_40', 'A20'] = '5:00-5:30'\n", + " df_tst.loc[df_tst['样本id'] == 'sample_531', 'B5'] = '1:00'\n", + " return df_tst" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "df_trn = train_abnormal_revise(df_trn).pipe(train_abnormal_adjust)\n", + "df_tst_a = test_a_abnormal_revise(df_tst_a).pipe(test_a_abnormal_adjust)\n", + "df_tst_b = test_b_abnormal_adjust(df_tst_b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 标签与数据集整合" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "df_trn, df_tst = df_trn.copy(), df_tst_a.copy()\n", + "df_target = df_trn['收率'] # 获取数据标签\n", + "del df_trn['收率'] # 删除掉训练集的标签,即是训练数据\n", + "df_trn_tst = df_trn.append(df_tst, ignore_index=False).reset_index(\n", + " drop=True) # 把test合并一起,同时做操作" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "for _df in [df_trn, df_tst, df_trn_tst]:\n", + " _df['A3'] = _df['A3'].fillna(405) # A3有缺失值,用众数填充" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 时间段特征处理 " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# 所有时间相关列\n", + "cols_timer = ['A5', 'A7', 'A9', 'A11', 'A14', 'A16', 'A24', 'A26', 'B5', 'B7']\n", + "# 同时对训练和测试集进行相同处理\n", + "for _df in [df_trn_tst, df_trn, df_tst]:\n", + " # 添加列名标记\n", + " _df.rename(columns={_col: _col + '_t' for _col in cols_timer},\n", + " inplace=True)\n", + " # 遍历所有持续时间相关列例如21:00-21:30\n", + " for _col in ['A20', 'A28', 'B4', 'B9', 'B10', 'B11']:\n", + " # 取到当前列的索引\n", + " _idx_col = _df.columns.tolist().index(_col)\n", + " # 添加新的一列,表示起始时间,split表示分别取开始和结束时间,用索引来指定\n", + " _df.insert(_idx_col + 1, _col + '_at',\n", + " _df[_col].str.split('-').str[0])\n", + " # 添加新的一列,表示终止时间\n", + " _df.insert(_idx_col + 2, _col + '_bt',\n", + " _df[_col].str.split('-').str[1])\n", + " # 删除持续时间\n", + " del _df[_col]\n", + " cols_timer = cols_timer + [_col + '_at', _col + '_bt']" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
样本idA1A2A3A4A5_tA6A7_tA8A9_t...B8B9_atB9_btB10_atB10_btB11_atB11_btB12B13B14
0sample_1528300NaN405.070013:30:0038.0NaNNaN15:30:00...45.011:3013:0014:0015:30NaNNaN800.00.15400
1sample_1698300NaN405.070014:00:0029.0NaNNaN16:00:00...45.06:007:307:309:009:0010:001200.00.15400
2sample_639300NaN405.070014:00:0029.0NaNNaN16:00:00...45.01:002:302:304:004:005:001200.00.15400
3sample_483300NaN405.07001:30:0038.0NaNNaN3:00:00...45.019:0020:3021:3023:00NaNNaN800.00.15400
4sample_617300NaN405.070022:00:0029.0NaNNaN0:00:00...45.09:0010:3010:3012:0012:0013:001200.00.15420
\n", + "

5 rows × 49 columns

\n", + "
" + ], + "text/plain": [ + " 样本id A1 A2 A3 A4 A5_t A6 A7_t A8 A9_t ... \\\n", + "0 sample_1528 300 NaN 405.0 700 13:30:00 38.0 NaN NaN 15:30:00 ... \n", + "1 sample_1698 300 NaN 405.0 700 14:00:00 29.0 NaN NaN 16:00:00 ... \n", + "2 sample_639 300 NaN 405.0 700 14:00:00 29.0 NaN NaN 16:00:00 ... \n", + "3 sample_483 300 NaN 405.0 700 1:30:00 38.0 NaN NaN 3:00:00 ... \n", + "4 sample_617 300 NaN 405.0 700 22:00:00 29.0 NaN NaN 0:00:00 ... \n", + "\n", + " B8 B9_at B9_bt B10_at B10_bt B11_at B11_bt B12 B13 B14 \n", + "0 45.0 11:30 13:00 14:00 15:30 NaN NaN 800.0 0.15 400 \n", + "1 45.0 6:00 7:30 7:30 9:00 9:00 10:00 1200.0 0.15 400 \n", + "2 45.0 1:00 2:30 2:30 4:00 4:00 5:00 1200.0 0.15 400 \n", + "3 45.0 19:00 20:30 21:30 23:00 NaN NaN 800.0 0.15 400 \n", + "4 45.0 9:00 10:30 10:30 12:00 12:00 13:00 1200.0 0.15 420 \n", + "\n", + "[5 rows x 49 columns]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_trn_tst.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "cols_timer = list(filter(lambda x: x.endswith('t'), df_trn_tst.columns))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['A5_t',\n", + " 'A7_t',\n", + " 'A9_t',\n", + " 'A11_t',\n", + " 'A14_t',\n", + " 'A16_t',\n", + " 'A20_at',\n", + " 'A20_bt',\n", + " 'A24_t',\n", + " 'A26_t',\n", + " 'A28_at',\n", + " 'A28_bt',\n", + " 'B4_at',\n", + " 'B4_bt',\n", + " 'B5_t',\n", + " 'B7_t',\n", + " 'B9_at',\n", + " 'B9_bt',\n", + " 'B10_at',\n", + " 'B10_bt',\n", + " 'B11_at',\n", + " 'B11_bt']" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cols_timer" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def time_to_min(x):\n", + " # 将时间全部转换成分钟形式\n", + " if x is np.nan:\n", + " return np.nan\n", + " else:\n", + " x = x.replace(';', ':').replace(';', ':')\n", + " x = x.replace('::', ':').replace('\"', ':')\n", + " h, m = x.split(':')[:2]\n", + " h = 0 if not h else h\n", + " m = 0 if not m else m\n", + " return int(h)*60 + int(m)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "for _df in [df_trn_tst, df_trn, df_tst]:\n", + " for _col in cols_timer:\n", + " _df[_col] = _df[_col].map(time_to_min)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
样本idA1A2A3A4A5_tA6A7_tA8A9_t...B8B9_atB9_btB10_atB10_btB11_atB11_btB12B13B14
0sample_1528300NaN405.070081038.0NaNNaN930...45.0690780840.0930.0NaNNaN800.00.15400
1sample_1698300NaN405.070084029.0NaNNaN960...45.0360450450.0540.0540.0600.01200.00.15400
2sample_639300NaN405.070084029.0NaNNaN960...45.060150150.0240.0240.0300.01200.00.15400
3sample_483300NaN405.07009038.0NaNNaN180...45.0114012301290.01380.0NaNNaN800.00.15400
4sample_617300NaN405.0700132029.0NaNNaN0...45.0540630630.0720.0720.0780.01200.00.15420
\n", + "

5 rows × 49 columns

\n", + "
" + ], + "text/plain": [ + " 样本id A1 A2 A3 A4 A5_t A6 A7_t A8 A9_t ... B8 \\\n", + "0 sample_1528 300 NaN 405.0 700 810 38.0 NaN NaN 930 ... 45.0 \n", + "1 sample_1698 300 NaN 405.0 700 840 29.0 NaN NaN 960 ... 45.0 \n", + "2 sample_639 300 NaN 405.0 700 840 29.0 NaN NaN 960 ... 45.0 \n", + "3 sample_483 300 NaN 405.0 700 90 38.0 NaN NaN 180 ... 45.0 \n", + "4 sample_617 300 NaN 405.0 700 1320 29.0 NaN NaN 0 ... 45.0 \n", + "\n", + " B9_at B9_bt B10_at B10_bt B11_at B11_bt B12 B13 B14 \n", + "0 690 780 840.0 930.0 NaN NaN 800.0 0.15 400 \n", + "1 360 450 450.0 540.0 540.0 600.0 1200.0 0.15 400 \n", + "2 60 150 150.0 240.0 240.0 300.0 1200.0 0.15 400 \n", + "3 1140 1230 1290.0 1380.0 NaN NaN 800.0 0.15 400 \n", + "4 540 630 630.0 720.0 720.0 780.0 1200.0 0.15 420 \n", + "\n", + "[5 rows x 49 columns]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_trn_tst.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 创建一个df来准备添加很多特征" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
样本id
0sample_1528
1sample_1698
2sample_639
3sample_483
4sample_617
\n", + "
" + ], + "text/plain": [ + " 样本id\n", + "0 sample_1528\n", + "1 sample_1698\n", + "2 sample_639\n", + "3 sample_483\n", + "4 sample_617" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "raw = df_trn_tst.copy()\n", + "df = pd.DataFrame(raw['样本id'])\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 温度相关特征" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# 加热过程\n", + "df['P1_S1_A6_0C'] = raw['A6'] # 容器初始温度\n", + "df['P1_S2_A8_1C'] = raw['A8'] # 首次测温温度\n", + "df['P1_S3_A10_2C'] = raw['A10'] # 准备水解温度\n", + "df['P1_C1_C0_D'] = raw['A8'] - raw['A6'] # 测温温差\n", + "df['P1_C2_C0_D'] = raw['A10'] - raw['A6'] # 初次沸腾温差\n", + "\n", + "# 水解过程\n", + "df['P2_S1_A12_3C'] = raw['A12'] # 水解开始温度\n", + "df['P2_S2_A15_4C'] = raw['A15'] # 水解过程测温温度\n", + "df['P2_S3_A17_5C'] = raw['A17'] # 水解结束温度\n", + "df['P2_C3_C0_D'] = raw['A12'] - raw['A6'] # 水解开始与初始温度温差\n", + "df['P2_C3_C2_D'] = raw['A12'] - raw['A10'] # 水解开始前恒温温差\n", + "df['P2_C4_C3_D'] = raw['A15'] - raw['A12'] # 水解过程中途温差\n", + "df['P2_C5_C4_D'] = raw['A17'] - raw['A15'] # 水解结束中途温差\n", + "df['P2_C5_C3_KD'] = raw['A17'] - raw['A12'] # 水解起止温差\n", + "\n", + "# 脱色过程\n", + "df['P3_S2_A25_7C'] = raw['A25'] # 脱色保温开始温度\n", + "df['P3_S3_A27_8C'] = raw['A27'] # 脱色保温结束温度\n", + "df['P3_C7_C5_D'] = raw['A25'] - raw['A17'] # 降温温差\n", + "df['P3_C8_C7_KD'] = raw['A27'] - raw['A25'] # 保温温差\n", + "\n", + "# 结晶过程\n", + "df['P4_S2_B6_11C'] = raw['B6'] # 结晶开始温度\n", + "df['P4_S3_B8_12C'] = raw['B8'] # 结晶结束温度\n", + "df['P4_C11_C8_D'] = raw['B6'] - raw['A27'] # 脱色结束到结晶温差\n", + "df['P4_C12_C11_KD'] = raw['B8'] - raw['B6'] # 结晶温差" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 温度相关统计特征" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "_funcs = ['mean', 'std', 'sum']\n", + "# 遍历每一种统计指标\n", + "for _func in _funcs:\n", + " # 对每一个样本计算各项指标\n", + " df[f'P2_C2-C5_{_func}'] = raw[['A10', 'A12', 'A15', 'A17']].\\\n", + " agg(_func, axis=1) # 沸腾过程温度\n", + " df[f'P2_D3-D5_{_func}'] = \\\n", + " df[[f'P2_C{i}_C{i-1}_D' for i in range(3, 6)]].\\\n", + " abs().agg(_func, axis=1) # 沸腾过程绝对温差\n", + " df[f'P2_C1-C12_KD_ABS_{_func}'] = \\\n", + " df[[_f for _f in df.columns if _f.endswith('KD')]].\\\n", + " abs().agg(_func, axis=1) # 关键过程绝对温差\n", + " df[f'P2_C1-C12_D_{_func}'] = \\\n", + " df[[_f for _f in df.columns if _f.endswith('D')]].\\\n", + " abs().agg(_func, axis=1) # 所有过程绝对温差\n", + " df[f'P2_LARGE_KD_{_func}'] = \\\n", + " df[['P2_C3_C0_D', 'P3_C7_C5_D', 'P4_C12_C11_KD']].\\\n", + " abs().agg(_func, axis=1) # 大温差绝对温差" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
样本idP1_S1_A6_0CP1_S2_A8_1CP1_S3_A10_2CP1_C1_C0_DP1_C2_C0_DP2_S1_A12_3CP2_S2_A15_4CP2_S3_A17_5CP2_C3_C0_D...P2_C2-C5_stdP2_D3-D5_stdP2_C1-C12_KD_ABS_stdP2_C1-C12_D_stdP2_LARGE_KD_stdP2_C2-C5_sumP2_D3-D5_sumP2_C1-C12_KD_ABS_sumP2_C1-C12_D_sumP2_LARGE_KD_sum
0sample_152838.0NaN100NaN62.0102.0103.0104.064.0...1.7078250.577359.64365124.92856523.245071409.04.027.0191.0113.0
1sample_169829.0NaN101NaN72.0103.0104.0105.074.0...1.7078250.5773517.78576228.88752125.890796413.04.044.0226.0134.0
2sample_63929.0NaN102NaN73.0103.0104.0105.074.0...1.2909940.0000018.00925729.23164225.514702414.03.043.0226.0135.0
3sample_48338.0NaN100NaN62.0102.0103.0104.064.0...1.7078250.577359.16515124.61729322.479620409.04.030.0207.0118.0
4sample_61729.0NaN101NaN72.0103.0104.0105.074.0...1.7078250.5773517.78576228.88752125.890796413.04.044.0226.0134.0
\n", + "

5 rows × 37 columns

\n", + "
" + ], + "text/plain": [ + " 样本id P1_S1_A6_0C P1_S2_A8_1C P1_S3_A10_2C P1_C1_C0_D \\\n", + "0 sample_1528 38.0 NaN 100 NaN \n", + "1 sample_1698 29.0 NaN 101 NaN \n", + "2 sample_639 29.0 NaN 102 NaN \n", + "3 sample_483 38.0 NaN 100 NaN \n", + "4 sample_617 29.0 NaN 101 NaN \n", + "\n", + " P1_C2_C0_D P2_S1_A12_3C P2_S2_A15_4C P2_S3_A17_5C P2_C3_C0_D ... \\\n", + "0 62.0 102.0 103.0 104.0 64.0 ... \n", + "1 72.0 103.0 104.0 105.0 74.0 ... \n", + "2 73.0 103.0 104.0 105.0 74.0 ... \n", + "3 62.0 102.0 103.0 104.0 64.0 ... \n", + "4 72.0 103.0 104.0 105.0 74.0 ... \n", + "\n", + " P2_C2-C5_std P2_D3-D5_std P2_C1-C12_KD_ABS_std P2_C1-C12_D_std \\\n", + "0 1.707825 0.57735 9.643651 24.928565 \n", + "1 1.707825 0.57735 17.785762 28.887521 \n", + "2 1.290994 0.00000 18.009257 29.231642 \n", + "3 1.707825 0.57735 9.165151 24.617293 \n", + "4 1.707825 0.57735 17.785762 28.887521 \n", + "\n", + " P2_LARGE_KD_std P2_C2-C5_sum P2_D3-D5_sum P2_C1-C12_KD_ABS_sum \\\n", + "0 23.245071 409.0 4.0 27.0 \n", + "1 25.890796 413.0 4.0 44.0 \n", + "2 25.514702 414.0 3.0 43.0 \n", + "3 22.479620 409.0 4.0 30.0 \n", + "4 25.890796 413.0 4.0 44.0 \n", + "\n", + " P2_C1-C12_D_sum P2_LARGE_KD_sum \n", + "0 191.0 113.0 \n", + "1 226.0 134.0 \n", + "2 226.0 135.0 \n", + "3 207.0 118.0 \n", + "4 226.0 134.0 \n", + "\n", + "[5 rows x 37 columns]" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "df_temperature = df.set_index('样本id')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
P1_S1_A6_0CP1_S2_A8_1CP1_S3_A10_2CP1_C1_C0_DP1_C2_C0_DP2_S1_A12_3CP2_S2_A15_4CP2_S3_A17_5CP2_C3_C0_DP2_C3_C2_D...P2_C2-C5_stdP2_D3-D5_stdP2_C1-C12_KD_ABS_stdP2_C1-C12_D_stdP2_LARGE_KD_stdP2_C2-C5_sumP2_D3-D5_sumP2_C1-C12_KD_ABS_sumP2_C1-C12_D_sumP2_LARGE_KD_sum
样本id
sample_152838.0NaN100NaN62.0102.0103.0104.064.02.0...1.7078250.577359.64365124.92856523.245071409.04.027.0191.0113.0
sample_169829.0NaN101NaN72.0103.0104.0105.074.02.0...1.7078250.5773517.78576228.88752125.890796413.04.044.0226.0134.0
sample_63929.0NaN102NaN73.0103.0104.0105.074.01.0...1.2909940.0000018.00925729.23164225.514702414.03.043.0226.0135.0
sample_48338.0NaN100NaN62.0102.0103.0104.064.02.0...1.7078250.577359.16515124.61729322.479620409.04.030.0207.0118.0
sample_61729.0NaN101NaN72.0103.0104.0105.074.02.0...1.7078250.5773517.78576228.88752125.890796413.04.044.0226.0134.0
\n", + "

5 rows × 36 columns

\n", + "
" + ], + "text/plain": [ + " P1_S1_A6_0C P1_S2_A8_1C P1_S3_A10_2C P1_C1_C0_D P1_C2_C0_D \\\n", + "样本id \n", + "sample_1528 38.0 NaN 100 NaN 62.0 \n", + "sample_1698 29.0 NaN 101 NaN 72.0 \n", + "sample_639 29.0 NaN 102 NaN 73.0 \n", + "sample_483 38.0 NaN 100 NaN 62.0 \n", + "sample_617 29.0 NaN 101 NaN 72.0 \n", + "\n", + " P2_S1_A12_3C P2_S2_A15_4C P2_S3_A17_5C P2_C3_C0_D P2_C3_C2_D \\\n", + "样本id \n", + "sample_1528 102.0 103.0 104.0 64.0 2.0 \n", + "sample_1698 103.0 104.0 105.0 74.0 2.0 \n", + "sample_639 103.0 104.0 105.0 74.0 1.0 \n", + "sample_483 102.0 103.0 104.0 64.0 2.0 \n", + "sample_617 103.0 104.0 105.0 74.0 2.0 \n", + "\n", + " ... P2_C2-C5_std P2_D3-D5_std P2_C1-C12_KD_ABS_std \\\n", + "样本id ... \n", + "sample_1528 ... 1.707825 0.57735 9.643651 \n", + "sample_1698 ... 1.707825 0.57735 17.785762 \n", + "sample_639 ... 1.290994 0.00000 18.009257 \n", + "sample_483 ... 1.707825 0.57735 9.165151 \n", + "sample_617 ... 1.707825 0.57735 17.785762 \n", + "\n", + " P2_C1-C12_D_std P2_LARGE_KD_std P2_C2-C5_sum P2_D3-D5_sum \\\n", + "样本id \n", + "sample_1528 24.928565 23.245071 409.0 4.0 \n", + "sample_1698 28.887521 25.890796 413.0 4.0 \n", + "sample_639 29.231642 25.514702 414.0 3.0 \n", + "sample_483 24.617293 22.479620 409.0 4.0 \n", + "sample_617 28.887521 25.890796 413.0 4.0 \n", + "\n", + " P2_C1-C12_KD_ABS_sum P2_C1-C12_D_sum P2_LARGE_KD_sum \n", + "样本id \n", + "sample_1528 27.0 191.0 113.0 \n", + "sample_1698 44.0 226.0 134.0 \n", + "sample_639 43.0 226.0 135.0 \n", + "sample_483 30.0 207.0 118.0 \n", + "sample_617 44.0 226.0 134.0 \n", + "\n", + "[5 rows x 36 columns]" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_temperature.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 时间相关特征" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "# 时间计算方式转换\n", + "def duration_outer(series1, series2):\n", + " # 处理隔了一天如21:30 - 01:30\n", + " duration = series1 - series2\n", + " duration = np.where(duration < 0, duration + 24*60, duration)\n", + " duration = np.where(duration > 12*60, 24*60 - duration, duration)\n", + " duration = np.where(duration > 6*60, 12*60 - duration, duration)\n", + " return duration" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "raw = df_trn_tst.copy()\n", + "df = pd.DataFrame(raw['样本id'])\n", + "# 加热过程\n", + "df['P1_S1_A5_0T'] = raw['A5_t'] # 初始时刻\n", + "df['P1_S2_A9_2T'] = raw['A9_t'] # 初始时刻\n", + "df['P1_T1_T0_D'] = duration_outer(raw['A7_t'], raw['A5_t'])\n", + "# 初次测温时间差\n", + "df['P1_T2_T1_D'] = duration_outer(raw['A9_t'], raw['A7_t'])\n", + "# 二次测温时间差\n", + "df['P1_T2_T0_K_D'] = duration_outer(raw['A9_t'], raw['A5_t'])\n", + "# 开始加热至沸腾时间差\n", + "\n", + "# 水解过程\n", + "df['P2_S1_A11_3T'] = raw['A11_t'] # 水解开始时刻\n", + "df['P2_S1_A16_5T'] = raw['A16_t'] # 水解结束时刻\n", + "\n", + "df['P2_T3_T0_K_D'] = duration_outer(raw['A11_t'], raw['A5_t'])\n", + "# 开始加热至投料时间差\n", + "df['P2_T3_T2_K_D'] = duration_outer(raw['A11_t'], raw['A9_t'])\n", + "# 恒温至投料投料时间差\n", + "# df['P2_T4_T3_D'] = raw['A14_t'] - raw['A11_t'] # 水解初次测温时间差\n", + "# df['P2_T5_T4_D'] = raw['A16_t'] - raw['A14_t'] # 水解结束时间差\n", + "df['P2_T5_T3_K_D'] = duration_outer(raw['A16_t'], raw['A11_t'])\n", + "# 水解时间差\n", + "\n", + "# 脱色过程\n", + "df['P3_S1_A20_6T'] = raw['A20_at'] # 中和开始时刻\n", + "df['P3_S2_A25_7T'] = raw['A24_t'] # 保温时刻\n", + "\n", + "df['P3_T6_T5_K_D'] = duration_outer(raw['A20_at'], raw['A16_t'])\n", + "# 水解结束至中和间歇时间\n", + "df['P3_T6_T6_K_D'] = duration_outer(raw['A20_bt'], raw['A20_at'])\n", + "# 酸碱度中和时间\n", + "df['P3_T7_T6_D'] = duration_outer(raw['A24_t'], raw['A20_bt'])\n", + "# 中和结束至脱色间歇时间\n", + "df['P3_T8_T7_K_D'] = duration_outer(raw['A26_t'], raw['A24_t'])\n", + "# 脱色保温时间\n", + "df['P3_T9_T8_D'] = duration_outer(raw['A28_at'], raw['A26_t'])\n", + "# 脱色至抽滤间歇时间\n", + "df['P3_T9_T9_K_D'] = duration_outer(raw['A28_bt'], raw['A28_at'])\n", + "# 抽滤时间\n", + "df['P3_T9_T5_1D'] = duration_outer(raw['A28_bt'], raw['A16_t'])\n", + "df['P3_T9_T6_2D'] = duration_outer(raw['A28_bt'], raw['A20_at'])\n", + "# 脱色总时间\n", + "\n", + "# 结晶过程\n", + "df['P4_S1_B4_10T'] = raw['B4_at'] # 酸化开始时刻\n", + "df['P4_S2_B5_11T'] = raw['B5_t'] # 结晶开始时刻\n", + "df['P4_S3_B7_12T'] = raw['B7_t'] # 结晶结束时刻\n", + "\n", + "df['P4_T10_T9_D'] = duration_outer(raw['B4_at'], raw['A28_bt'])\n", + "# 抽滤结束至酸化间歇时间\n", + "df['P4_T10_T10_K_D'] = duration_outer(raw['B4_bt'], raw['B4_at'])\n", + "# 酸化时间\n", + "df['P4_T11_T10_K_D'] = duration_outer(raw['B5_t'], raw['B4_bt'])\n", + "# 酸化至结晶间歇时间\n", + "df['P4_T12_T11_K_D'] = duration_outer(raw['B7_t'], raw['B5_t'])\n", + "# 自然结晶时间\n", + "df['P4_T12_T9_1D'] = duration_outer(raw['B7_t'], raw['A28_bt'])\n", + "df['P4_T12_T10_2D'] = duration_outer(raw['B7_t'], raw['B4_at'])\n", + "# 结晶总时间\n", + "\n", + "# 甩滤过程\n", + "df['P5_S1_B9_13T'] = raw['B9_at'] # 甩滤开始时刻\n", + "df['P5_S3_B12_15T'] = np.where(\n", + " raw['B11_bt'].isnull(),\n", + " np.where(raw['B10_bt'].isnull(), raw['B9_bt'], raw['B10_bt']),\n", + " raw['B11_bt']) # 甩滤结束时刻\n", + "df['P5_T13_T12_D'] = duration_outer(raw['B9_at'], raw['B7_t'])\n", + "# 酸化结束至甩滤间歇时间\n", + "df['P5_T13_T13_K_D'] = duration_outer(raw['B9_bt'], raw['B9_at'])\n", + "# 基本甩滤时间\n", + "df['P5_T14_T13_D'] = duration_outer(raw['B10_at'], raw['B9_bt'])\n", + "# 基本甩滤至补充甩滤1间歇时间\n", + "df['P5_T14_T14_K_D'] = duration_outer(raw['B10_bt'], raw['B10_at'])\n", + "# 补充甩滤1时间\n", + "df['P5_T15_T14_D'] = duration_outer(raw['B11_at'], raw['B10_bt'])\n", + "# 补充甩滤1至补充甩滤2间歇时间\n", + "df['P5_T15_T13_K_D'] = duration_outer(raw['B11_bt'], raw['B11_at'])\n", + "# 补充甩滤2时间\n", + "df['P5_T15_T13_1D'] = \\\n", + " df[['P5_T13_T13_K_D', 'P5_T14_T14_K_D', 'P5_T13_T13_K_D']].sum(axis=1)\n", + "df['P5_T15_T12_2D'] = duration_outer(\n", + " df['P5_S3_B12_15T'], df['P4_S3_B7_12T'])\n", + "df['P5_T15_T12_3D'] = duration_outer(\n", + " df['P5_S3_B12_15T'], df['P5_S1_B9_13T'])\n", + "# 总甩滤时间\n", + "\n", + "# 总流程时长\n", + "df['P5_T15_T1_4D'] = \\\n", + " df[['P5_T15_T12_2D', 'P4_T12_T9_1D', 'P3_T9_T5_1D',\n", + " 'P2_T3_T0_K_D', 'P2_T5_T3_K_D']].sum(axis=1)\n", + "_funcs = ['mean', 'std', 'sum']\n", + "for _func in _funcs:\n", + " df[f'P5__D_{_func}'] = \\\n", + " df[[_f for _f in df.columns if _f.endswith('_D')]].\\\n", + " abs().agg(_func, axis=1)\n", + " df[f'P5_K_D_{_func}'] = \\\n", + " df[[_f for _f in df.columns if _f.endswith('_K_D')]]. \\\n", + " abs().agg(_func, axis=1)\n", + " df[f'P5__D_{_func}'] = \\\n", + " df[[_f for _f in df.columns if _f.endswith('D')]]. \\\n", + " abs().agg(_func, axis=1)\n", + "df_duration = df.set_index('样本id')" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
P1_S1_A5_0TP1_S2_A9_2TP1_T1_T0_DP1_T2_T1_DP1_T2_T0_K_DP2_S1_A11_3TP2_S1_A16_5TP2_T3_T0_K_DP2_T3_T2_K_DP2_T5_T3_K_D...P5_T15_T13_1DP5_T15_T12_2DP5_T15_T12_3DP5_T15_T1_4DP5__D_meanP5_K_D_meanP5__D_stdP5_K_D_stdP5__D_sumP5_K_D_sum
样本id
sample_1528810930NaNNaN120990111018060120...270.0240.0240.0840.0145.38461590.000000169.85242563.6396103780.01170.0
sample_1698840960NaNNaN1201020114018060120...270.0240.0240.0960.0136.07142990.000000188.58811376.2586693810.01260.0
sample_639840960NaNNaN1201020114018060120...270.0240.0240.0900.0123.21428675.000000173.65469349.5751183450.01050.0
sample_48390180NaNNaN9024036015060120...270.0300.0240.0990.0158.07692373.846154195.44859646.8220864110.0960.0
sample_61713200NaNNaN1206018018060120...270.0240.0240.0900.0123.21428677.142857173.84653948.1070243450.01080.0
\n", + "

5 rows × 47 columns

\n", + "
" + ], + "text/plain": [ + " P1_S1_A5_0T P1_S2_A9_2T P1_T1_T0_D P1_T2_T1_D P1_T2_T0_K_D \\\n", + "样本id \n", + "sample_1528 810 930 NaN NaN 120 \n", + "sample_1698 840 960 NaN NaN 120 \n", + "sample_639 840 960 NaN NaN 120 \n", + "sample_483 90 180 NaN NaN 90 \n", + "sample_617 1320 0 NaN NaN 120 \n", + "\n", + " P2_S1_A11_3T P2_S1_A16_5T P2_T3_T0_K_D P2_T3_T2_K_D \\\n", + "样本id \n", + "sample_1528 990 1110 180 60 \n", + "sample_1698 1020 1140 180 60 \n", + "sample_639 1020 1140 180 60 \n", + "sample_483 240 360 150 60 \n", + "sample_617 60 180 180 60 \n", + "\n", + " P2_T5_T3_K_D ... P5_T15_T13_1D P5_T15_T12_2D P5_T15_T12_3D \\\n", + "样本id ... \n", + "sample_1528 120 ... 270.0 240.0 240.0 \n", + "sample_1698 120 ... 270.0 240.0 240.0 \n", + "sample_639 120 ... 270.0 240.0 240.0 \n", + "sample_483 120 ... 270.0 300.0 240.0 \n", + "sample_617 120 ... 270.0 240.0 240.0 \n", + "\n", + " P5_T15_T1_4D P5__D_mean P5_K_D_mean P5__D_std P5_K_D_std \\\n", + "样本id \n", + "sample_1528 840.0 145.384615 90.000000 169.852425 63.639610 \n", + "sample_1698 960.0 136.071429 90.000000 188.588113 76.258669 \n", + "sample_639 900.0 123.214286 75.000000 173.654693 49.575118 \n", + "sample_483 990.0 158.076923 73.846154 195.448596 46.822086 \n", + "sample_617 900.0 123.214286 77.142857 173.846539 48.107024 \n", + "\n", + " P5__D_sum P5_K_D_sum \n", + "样本id \n", + "sample_1528 3780.0 1170.0 \n", + "sample_1698 3810.0 1260.0 \n", + "sample_639 3450.0 1050.0 \n", + "sample_483 4110.0 960.0 \n", + "sample_617 3450.0 1080.0 \n", + "\n", + "[5 rows x 47 columns]" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_duration.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 水耗相关特征" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "na_value=405\n", + "\n", + "df_trn_tst = df_trn_tst.copy()\n", + "df = pd.DataFrame(raw['样本id'])\n", + "# 耗水\n", + "df['P2_W_1M'] = raw['A4']\n", + "df['P2_W_2M'] = raw['A19']\n", + "# 耗盐酸\n", + "df['P3_H_1M'] = raw['A21'].fillna(50)\n", + "df['P4_H_2M'] = raw['B1'].fillna(320)\n", + "# 氢氧化钠\n", + "df['P2_N_1M'] = raw['A3'].fillna(na_value)\n", + "# 4-氰基吡啶\n", + "df['P2_C_1M'] = raw['A1']\n", + "\n", + "df['P5_W_3M'] = raw['B12'].fillna(1200)\n", + "df['P5_W_1M'] = df['P2_W_1M'] + df['P2_W_2M']\n", + "df['P5_W_3M'] = df['P2_W_1M'] + df['P2_W_2M'] + df['P5_W_3M']\n", + "df['P5_H_1M'] = df['P3_H_1M'] + df['P4_H_2M']\n", + "df['P5_M_0M'] = raw['A1'] + df['P2_N_1M'] + df['P5_W_1M'] + df['P4_H_2M']\n", + "df['P5_M_1M'] = df['P5_M_0M'] + df['P5_W_3M']\n", + "df['P5_M_2M'] = df['P5_M_1M'] + df['P3_H_1M']\n", + "# 理论产出\n", + "df['P5_O_1M'] = raw['B14']\n", + "df['P5_O_5M'] = raw['B14'].replace(418, 420).replace(405, 400).\\\n", + " replace(395, 390).replace(392, 390).replace(387, 380).\\\n", + " replace(385, 380).replace(370, 360).replace(350, 360).\\\n", + " replace(350, 360).replace(340, 360).replace(290, 280).\\\n", + " replace(260, 280).replace(256, 280)\n", + "_fs = [_f for _f in df.columns if _f.endswith('M')]\n", + "for _f in _fs[:-2]:\n", + " df[f'{_f}_P5_O_1M_R'] = df['P5_O_1M'] / df[_f]\n", + " df[f'{_f}_P5_O_5M_R'] = df['P5_O_5M'] / df[_f]\n", + "for i in range(len(_fs[:6])):\n", + " _f, _sub_fs = _fs[i], _fs[(i+1):6]\n", + " for _f_div in _sub_fs:\n", + " df[f'{_f}_{_f_div}_R'] = df[_f] / df[_f_div]\n", + "df_materials = df.set_index('样本id')" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "raw = df_trn_tst.copy()\n", + "df = pd.DataFrame(raw['样本id'])\n", + "df['P5_NOT_NUM_N'] = raw.iloc[:, 1:-1].notnull().sum(axis=1)\n", + "df['P5_PH_1N'] = raw['A22']\n", + "df['P5_PH_2N'] = raw['A23']\n", + "df['P5_PH_2N'] = raw['B2']\n", + "df['P5_A7_1N'] = raw['A7_t'].isnull().astype(int)\n", + "df['P5_O_2M'] = (raw['B14'] <= 360).astype(int)\n", + "df['P5_1_3M'] = raw['B13']\n", + "df_interact = df.set_index('样本id')" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
P5_NOT_NUM_NP5_PH_1NP5_PH_2NP5_A7_1NP5_O_2MP5_1_3M
样本id
sample_1528429.03.5100.15
sample_1698449.03.5100.15
sample_639449.03.5100.15
sample_4834210.03.5100.15
sample_617449.03.5100.15
\n", + "
" + ], + "text/plain": [ + " P5_NOT_NUM_N P5_PH_1N P5_PH_2N P5_A7_1N P5_O_2M P5_1_3M\n", + "样本id \n", + "sample_1528 42 9.0 3.5 1 0 0.15\n", + "sample_1698 44 9.0 3.5 1 0 0.15\n", + "sample_639 44 9.0 3.5 1 0 0.15\n", + "sample_483 42 10.0 3.5 1 0 0.15\n", + "sample_617 44 9.0 3.5 1 0 0.15" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_interact.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 合并所有特征" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "df_feature = pd.concat([df_materials,\n", + " df_duration,\n", + " df_temperature,\n", + " df_interact], axis=1).reset_index()" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "df_trn = df_feature.iloc[:len(df_trn)].reset_index(drop=True)\n", + "df_trn['收率'] = df_target\n", + "df_tst = df_feature.iloc[len(df_trn):].reset_index(drop=True)\n", + "df_tst['收率'] = np.nan" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
样本idP2_W_1MP2_W_2MP3_H_1MP4_H_2MP2_N_1MP2_C_1MP5_W_3MP5_W_1MP5_H_1M...P2_C1-C12_KD_ABS_sumP2_C1-C12_D_sumP2_LARGE_KD_sumP5_NOT_NUM_NP5_PH_1NP5_PH_2NP5_A7_1NP5_O_2MP5_1_3M收率
0sample_152870030050.0350.0405.03001800.01000400.0...27.0191.0113.0429.03.5100.150.879
1sample_169870020050.0320.0405.03002100.0900370.0...44.0226.0134.0449.03.5100.150.902
2sample_63970020050.0320.0405.03002100.0900370.0...43.0226.0135.0449.03.5100.150.936
3sample_48370020050.0290.0405.03001700.0900340.0...30.0207.0118.04210.03.5100.150.902
4sample_61770020050.0320.0405.03002100.0900370.0...44.0226.0134.0449.03.5100.150.983
\n", + "

5 rows × 144 columns

\n", + "
" + ], + "text/plain": [ + " 样本id P2_W_1M P2_W_2M P3_H_1M P4_H_2M P2_N_1M P2_C_1M P5_W_3M \\\n", + "0 sample_1528 700 300 50.0 350.0 405.0 300 1800.0 \n", + "1 sample_1698 700 200 50.0 320.0 405.0 300 2100.0 \n", + "2 sample_639 700 200 50.0 320.0 405.0 300 2100.0 \n", + "3 sample_483 700 200 50.0 290.0 405.0 300 1700.0 \n", + "4 sample_617 700 200 50.0 320.0 405.0 300 2100.0 \n", + "\n", + " P5_W_1M P5_H_1M ... P2_C1-C12_KD_ABS_sum P2_C1-C12_D_sum \\\n", + "0 1000 400.0 ... 27.0 191.0 \n", + "1 900 370.0 ... 44.0 226.0 \n", + "2 900 370.0 ... 43.0 226.0 \n", + "3 900 340.0 ... 30.0 207.0 \n", + "4 900 370.0 ... 44.0 226.0 \n", + "\n", + " P2_LARGE_KD_sum P5_NOT_NUM_N P5_PH_1N P5_PH_2N P5_A7_1N P5_O_2M \\\n", + "0 113.0 42 9.0 3.5 1 0 \n", + "1 134.0 44 9.0 3.5 1 0 \n", + "2 135.0 44 9.0 3.5 1 0 \n", + "3 118.0 42 10.0 3.5 1 0 \n", + "4 134.0 44 9.0 3.5 1 0 \n", + "\n", + " P5_1_3M 收率 \n", + "0 0.15 0.879 \n", + "1 0.15 0.902 \n", + "2 0.15 0.936 \n", + "3 0.15 0.902 \n", + "4 0.15 0.983 \n", + "\n", + "[5 rows x 144 columns]" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_trn.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "for _df in [df_trn, df_tst]:\n", + " _df.insert(1, 'id', _df['样本id'].str.split('_').str[1].astype(float))" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
样本ididP2_W_1MP2_W_2MP3_H_1MP4_H_2MP2_N_1MP2_C_1MP5_W_3MP5_W_1M...P2_C1-C12_KD_ABS_sumP2_C1-C12_D_sumP2_LARGE_KD_sumP5_NOT_NUM_NP5_PH_1NP5_PH_2NP5_A7_1NP5_O_2MP5_1_3M收率
0sample_15281528.070030050.0350.0405.03001800.01000...27.0191.0113.0429.03.5100.150.879
1sample_16981698.070020050.0320.0405.03002100.0900...44.0226.0134.0449.03.5100.150.902
2sample_639639.070020050.0320.0405.03002100.0900...43.0226.0135.0449.03.5100.150.936
3sample_483483.070020050.0290.0405.03001700.0900...30.0207.0118.04210.03.5100.150.902
4sample_617617.070020050.0320.0405.03002100.0900...44.0226.0134.0449.03.5100.150.983
\n", + "

5 rows × 145 columns

\n", + "
" + ], + "text/plain": [ + " 样本id id P2_W_1M P2_W_2M P3_H_1M P4_H_2M P2_N_1M P2_C_1M \\\n", + "0 sample_1528 1528.0 700 300 50.0 350.0 405.0 300 \n", + "1 sample_1698 1698.0 700 200 50.0 320.0 405.0 300 \n", + "2 sample_639 639.0 700 200 50.0 320.0 405.0 300 \n", + "3 sample_483 483.0 700 200 50.0 290.0 405.0 300 \n", + "4 sample_617 617.0 700 200 50.0 320.0 405.0 300 \n", + "\n", + " P5_W_3M P5_W_1M ... P2_C1-C12_KD_ABS_sum P2_C1-C12_D_sum \\\n", + "0 1800.0 1000 ... 27.0 191.0 \n", + "1 2100.0 900 ... 44.0 226.0 \n", + "2 2100.0 900 ... 43.0 226.0 \n", + "3 1700.0 900 ... 30.0 207.0 \n", + "4 2100.0 900 ... 44.0 226.0 \n", + "\n", + " P2_LARGE_KD_sum P5_NOT_NUM_N P5_PH_1N P5_PH_2N P5_A7_1N P5_O_2M \\\n", + "0 113.0 42 9.0 3.5 1 0 \n", + "1 134.0 44 9.0 3.5 1 0 \n", + "2 135.0 44 9.0 3.5 1 0 \n", + "3 118.0 42 10.0 3.5 1 0 \n", + "4 134.0 44 9.0 3.5 1 0 \n", + "\n", + " P5_1_3M 收率 \n", + "0 0.15 0.879 \n", + "1 0.15 0.902 \n", + "2 0.15 0.936 \n", + "3 0.15 0.902 \n", + "4 0.15 0.983 \n", + "\n", + "[5 rows x 145 columns]" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_trn.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAD4CAYAAAAD6PrjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAATvElEQVR4nO3df7RlZX3f8fcHRkStOCADZc2gF5PRQLqKTCeW1jYmkib8qA6mkmLTOqVTp0lomqy0q46xq7FZSRes1YqhzSIhYjLQoEGtYRpoUhxBV7MKeJHfIDIihXGocyM/jKISyLd/nOduDzN3ZvYwd99zmHm/1jrrPPvZz973e/c98Jln73P2SVUhSRLAYZMuQJI0PQwFSVLHUJAkdQwFSVLHUJAkdZZNuoADceyxx9bMzMyky5CkF5Xbbrvtz6pqxULrXtShMDMzw+zs7KTLkKQXlST/d0/rPH0kSeoYCpKkjqEgSeoYCpKkjqEgSeoYCpKkjqEgSeoYCpKkjqEgSeq8qD/RLGl6zGy6bmI/++GLzpnYzz7YOFOQJHUMBUlSx1CQJHUMBUlSx1CQJHUMBUlSx1CQJHUMBUlSx1CQJHUMBUlSx1CQJHUMBUlSx1CQJHUMBUlSx1CQJHUMBUlSZ9BQSLI8ySeSfDHJ/Un+VpJjktyQ5MH2fHQbmySXJtmW5K4ka4asTZK0u6FnCr8B/HFV/QBwKnA/sAnYWlWrga1tGeAsYHV7bAQuG7g2SdIuBguFJEcBPwxcAVBVz1TVk8A6YHMbthk4t7XXAVfWyM3A8iQnDFWfJGl3Q84UXgfMAb+b5PYkH07yCuD4qnoMoD0f18avBB4d235763ueJBuTzCaZnZubG7B8STr0DBkKy4A1wGVVdRrwLb53qmghWaCvduuouryq1lbV2hUrVixOpZIkYNhQ2A5sr6pb2vInGIXE1+ZPC7XnnWPjTxzbfhWwY8D6JEm7GCwUqur/AY8meUPrOgO4D9gCrG9964FrW3sL8O72LqTTgafmTzNJkpbGsoH3//PA7yc5AngIuIBREF2TZAPwCHBeG3s9cDawDXi6jZUkLaFBQ6Gq7gDWLrDqjAXGFnDhkPVIkvbOTzRLkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpM2goJHk4yd1J7kgy2/qOSXJDkgfb89GtP0kuTbItyV1J1gxZmyRpd0sxU/jRqnpjVa1ty5uArVW1GtjalgHOAla3x0bgsiWoTZI0ZhKnj9YBm1t7M3DuWP+VNXIzsDzJCROoT5IOWUOHQgH/K8ltSTa2vuOr6jGA9nxc618JPDq27fbW9zxJNiaZTTI7Nzc3YOmSdOhZNvD+31xVO5IcB9yQ5It7GZsF+mq3jqrLgcsB1q5du9t6SdILN+hMoap2tOedwKeANwFfmz8t1J53tuHbgRPHNl8F7BiyPknS8w0WCklekeSV823gx4F7gC3A+jZsPXBta28B3t3ehXQ68NT8aSZJ0tIY8vTR8cCnksz/nKur6o+TfB64JskG4BHgvDb+euBsYBvwNHDBgLVJkhYwWChU1UPAqQv0fx04Y4H+Ai4cqh5J0r75iWZJUsdQkCR1DAVJUmfozylI0uBmNl03kZ/78EXnTOTnDsmZgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSp0ysUkvy1oQuRJE1e35nCbyW5NcnPJVk+aEWSpInpFQpV9XeAnwZOBGaTXJ3k7w1amSRpyfW+plBVDwL/Dngv8Bbg0iRfTPKTQxUnSVpafa8p/PUklwD3A28F3lZVJ7f2JQPWJ0laQn1nCv8V+AJwalVdWFVfAKiqHYxmD3uU5PAktyf5o7Z8UpJbkjyY5A+SHNH6X9qWt7X1My/0l5IkvTB9Q+Fs4Oqq+jZAksOSvBygqq7ax7a/wGiGMe9i4JKqWg08AWxo/RuAJ6rq+xnNPi7uWZskaZH0DYVPAy8bW35569urJKuAc4APt+UwOuX0iTZkM3Bua69ry7T1Z7TxkqQl0jcUjqyqb84vtPbLe2z3IeDfAn/Zll8NPFlVz7bl7cDK1l4JPNr2/yzwVBv/PEk2JplNMjs3N9ezfElSH31D4VtJ1swvJPkbwLf3tkGSvw/srKrbxrsXGFo91n2vo+ryqlpbVWtXrFix78olSb0t6znuF4GPJ9nRlk8A/uE+tnkz8PYkZwNHAkcxmjksT7KszQZWAfP73M7ocxDbkywDXgU83vs3kSQdsL4fXvs88APAzwI/B5y8ywxgoW3eV1WrqmoGOB/4TFX9NHAj8M42bD1wbWtvacu09Z+pqt1mCpKk4fSdKQD8EDDTtjktCVV15Qv4me8FPpbk14DbgSta/xXAVUm2MZohnP8C9i1JOgC9QiHJVcD3AXcAz7XuAnqFQlXdBNzU2g8Bb1pgzHeA8/rsT5I0jL4zhbXAKZ7OkaSDW993H90D/NUhC5EkTV7fmcKxwH1JbgW+O99ZVW8fpCpJ0kT0DYUPDFmEJGk69AqFqvpsktcCq6vq0+2+R4cPW5okaan1vXX2exjdj+i3W9dK4A+HKkqSNBl9LzRfyOgTyt+A7gt3jhuqKEnSZPQNhe9W1TPzC+02FL49VZIOMn1D4bNJfhl4Wftu5o8D/2O4siRJk9A3FDYBc8DdwL8Armcf37gmSXrx6fvuo78Efqc9JEkHqb73PvoKC3+3wesWvSJJ0sTsz72P5h3J6MZ1xyx+OZKkSer7fQpfH3t8tao+xOi7liVJB5G+p4/WjC0exmjm8MpBKpIkTUzf00f/eaz9LPAw8FOLXo0kaaL6vvvoR4cuRJI0eX1PH/3S3tZX1QcXpxxJ0iTtz7uPfgjY0pbfBnwOeHSIoiRJk7E/X7Kzpqr+HCDJB4CPV9U/H6owSdLS63ubi9cAz4wtPwPMLHo1kqSJ6jtTuAq4NcmnGH2y+R3AlYNVJUmaiL4fXvt14ALgCeBJ4IKq+o972ybJkUluTXJnknuT/IfWf1KSW5I8mOQPkhzR+l/alre19TMH8otJkvZf39NHAC8HvlFVvwFsT3LSPsZ/F3hrVZ0KvBE4M8npwMXAJVW1mlHIbGjjNwBPVNX3A5e0cZKkJdT36zh/BXgv8L7W9RLgv+1tmxr55tj4lzA69fRWRl/tCbAZOLe117Vl2vozkqRPfZKkxdF3pvAO4O3AtwCqagc9bnOR5PAkdwA7gRuALwNPVtWzbch2Rt/3THt+tO3/WeAp4NU965MkLYK+ofBMVRXt9tlJXtFno6p6rqreCKwC3gScvNCw9rzQrGC323Un2ZhkNsns3Nxcr+IlSf30DYVrkvw2sDzJe4BPsx9fuFNVTwI3Aae3fcy/62kVsKO1twMnQvcd0K8CHl9gX5dX1dqqWrtixYq+JUiSeuj77qP/xOg8/yeBNwD/vqr+y962SbIiyfLWfhnwY8D9wI3AO9uw9cC1rb2lLdPWf6bNTiRJS2Sfn1NIcjjwJ1X1Y4yuC/R1ArC5bX8YcE1V/VGS+4CPJfk14Hbgijb+CuCqJNsYzRDO34+fJUlaBPsMhap6LsnTSV5VVU/13XFV3QWctkD/Q4yuL+za/x1G3+gmSZqQvp9o/g5wd5IbaO9AAqiqfzVIVZKkiegbCte1hyTpILbXUEjymqp6pKo2722cJOngsK93H/3hfCPJJweuRZI0YfsKhfEPlL1uyEIkSZO3r1CoPbQlSQehfV1oPjXJNxjNGF7W2rTlqqqjBq1OkrSk9hoKVXX4UhUiSZq8/fk+BUnSQc5QkCR1DAVJUsdQkCR1DAVJUsdQkCR1DAVJUsdQkCR1DAVJUsdQkCR1DAVJUsdQkCR1DAVJUsdQkCR1BguFJCcmuTHJ/UnuTfILrf+YJDckebA9H936k+TSJNuS3JVkzVC1SZIWNuRM4VngX1fVycDpwIVJTgE2AVurajWwtS0DnAWsbo+NwGUD1iZJWsBgoVBVj1XVF1r7z4H7gZXAOmBzG7YZOLe11wFX1sjNwPIkJwxVnyRpd0tyTSHJDHAacAtwfFU9BqPgAI5rw1YCj45ttr31SZKWyOChkOSvAJ8EfrGqvrG3oQv01QL725hkNsns3NzcYpUpSWLgUEjyEkaB8PtV9d9b99fmTwu1552tfztw4tjmq4Adu+6zqi6vqrVVtXbFihXDFS9Jh6Ah330U4Arg/qr64NiqLcD61l4PXDvW/+72LqTTgafmTzNJkpbGsgH3/WbgnwB3J7mj9f0ycBFwTZINwCPAeW3d9cDZwDbgaeCCAWuTJC1gsFCoqv/NwtcJAM5YYHwBFw5VjyRp3/xEsySpYyhIkjqGgiSpYyhIkjpDvvtIkg5qM5uum9jPfviicwbZrzMFSVLHUJAkdQwFSVLHUJAkdQwFSVLHUJAkdQwFSVLHUJAkdQwFSVLHUJAkdQwFSVLHUJAkdQwFSVLHUJAkdQwFSVLHUJAkdQwFSVLHUJAkdQYLhSQfSbIzyT1jfcckuSHJg+356NafJJcm2ZbkriRrhqpLkrRnQ84Ufg84c5e+TcDWqloNbG3LAGcBq9tjI3DZgHVJkvZgsFCoqs8Bj+/SvQ7Y3NqbgXPH+q+skZuB5UlOGKo2SdLClvqawvFV9RhAez6u9a8EHh0bt7317SbJxiSzSWbn5uYGLVaSDjXTcqE5C/TVQgOr6vKqWltVa1esWDFwWZJ0aFnqUPja/Gmh9ryz9W8HThwbtwrYscS1SdIhb6lDYQuwvrXXA9eO9b+7vQvpdOCp+dNMkqSls2yoHSf5KPAjwLFJtgO/AlwEXJNkA/AIcF4bfj1wNrANeBq4YKi6JEl7NlgoVNW79rDqjAXGFnDhULVIh5KZTddNugS9iE3LhWZJ0hQwFCRJHUNBktQxFCRJHUNBktQxFCRJHUNBktQxFCRJHUNBktQxFCRJHUNBktQxFCRJHUNBktQxFCRJHUNBktQxFCRJHUNBktQxFCRJHUNBktQxFCRJHUNBktQxFCRJnakKhSRnJnkgybYkmyZdjyQdaqYmFJIcDvwmcBZwCvCuJKdMtipJOrQsm3QBY94EbKuqhwCSfAxYB9w3xA+b2XTdELudag9fdM6kS1hyh+LfWToQ0xQKK4FHx5a3A39z10FJNgIb2+I3kzywBLX1dSzwZ5MuYk9yMTDlNWJ9i2Haa5z2+mD6azw2Fx9Qfa/d04ppCoUs0Fe7dVRdDlw+fDn7L8lsVa2ddB17M+01Wt+Bm/Yap70+mP4ah6xvaq4pMJoZnDi2vArYMaFaJOmQNE2h8HlgdZKTkhwBnA9smXBNknRImZrTR1X1bJJ/CfwJcDjwkaq6d8Jl7a+pPK21i2mv0foO3LTXOO31wfTXOFh9qdrttL0k6RA1TaePJEkTZihIkjqGQk99bsGR5KeS3Jfk3iRXj/U/l+SO9hjk4vm+6ktyyVgNX0ry5Ni69UkebI/1Q9S3CDVOwzF8TZIbk9ye5K4kZ4+te1/b7oEkPzFN9SWZSfLtseP3W0PU17PG1ybZ2uq7KcmqsXWDvw4PsL6leA1+JMnOJPfsYX2SXNrqvyvJmrF1i3P8qsrHPh6MLnx/GXgdcARwJ3DKLmNWA7cDR7fl48bWfXPS9e0y/ucZXcgHOAZ4qD0f3dpHT1ON03IMGV3c+9nWPgV4eKx9J/BS4KS2n8OnqL4Z4J4hj99+1PhxYH1rvxW4aqlehwdS31K8BtvP+GFgzZ7+XsDZwP9k9Lmu04FbFvv4OVPop7sFR1U9A8zfgmPce4DfrKonAKpq55TVN+5dwEdb+yeAG6rq8Vb7DcCZU1bjUuhTXwFHtfar+N7naNYBH6uq71bVV4BtbX/TUt9S6VPjKcDW1r5xbP1SvA4PpL4lUVWfAx7fy5B1wJU1cjOwPMkJLOLxMxT6WegWHCt3GfN64PVJ/jTJzUnG/yBHJplt/edOqD5gND1m9K/Zz+zvthOsEabjGH4A+MdJtgPXM5rN9N12kvUBnNROK302yd9d5Nr2p8Y7gX/Q2u8AXpnk1T23nWR9MPxrsI89/Q6LdvwMhX763IJjGaNTSD/C6F+5H06yvK17TY0+kv6PgA8l+b4J1DfvfOATVfXcC9j2QBxIjTAdx/BdwO9V1SpG0/irkhzWc9tJ1vcYo+N3GvBLwNVJjmLx9anx3wBvSXI78Bbgq8CzPbc9UAdSHwz/GuxjT7/Doh0/Q6GfPrfg2A5cW1V/0U4hPMAoJKiqHe35IeAm4LQJ1DfvfJ5/Wmapbi9yIDVOyzHcAFzT6vg/wJGMbpy2FMfwBdfXTmt9vfXfxui8+usXub5eNVbVjqr6yRZQ7299T/XZdsL1LcVrsI89/Q6Ld/yGvnByMDwYzQIeYnRKY/4C1Q/uMuZMYHNrH8toKvdqRhd9XjrW/yB7ucA6VH1t3BuAh2kfWqzvXaD6Sqvz6NY+ZhLHcC81TsUxZHSB75+29sntP7oAP8jzLzQ/xOJfaD6Q+lbM18PoIutXJ/U3bn+/w1r714FfXarX4QHWN/hrcKyGGfZ8ofkcnn+h+dbFPn6L/gsdrA9G0/EvMfpX1vtb368Cb2/tAB9k9P0PdwPnt/6/3ZbvbM8bJlFfW/4AcNEC2/4zRhdHtwEXTOoY7qnGaTmGjC5C/mmr4w7gx8e2fX/b7gHgrGmqj9E58ntb/xeAt03qbwy8s/0P9UvAh2n/o12q1+ELrW8JX4MfZXS67y8Y/et/A/AzwM+09WH0ZWRfbnWsXezj520uJEkdrylIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjr/H+ez4bfNKr74AAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "df_trn['收率'].plot(kind='hist')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "df_trn = df_trn.query('收率 > 0.8671').reset_index(drop=True) # 筛选常规数据\n", + "df_trn = df_trn.query('收率 < 0.9861').reset_index(drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAD4CAYAAAAD6PrjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAATa0lEQVR4nO3df7BfdX3n8eeL8FtUoFxYTMCLNnaNnRpsZNl1XSnWVnEt2pYK3dbIsqaz4rbOup1G1lnZzjJDd1W2jjuucVEjW0vxR5UtWA0s1mkHxCDIr2iJmIWYDEkriogFwff+8f3c4zW5Sb7Jvef7vTf3+Zj5zvdzPuec73l/5t7kdc+P7zmpKiRJAjhk3AVIkuYPQ0GS1DEUJEkdQ0GS1DEUJEmdQ8ddwGyccMIJNTk5Oe4yJGlBue222/6uqiZmmregQ2FycpKNGzeOuwxJWlCS/L89zfPwkSSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSpYyhIkjqGgiSps6C/0az9M7n2urFte8vlrx7btiUNzz0FSVLHUJAkdQwFSVLHUJAkdQwFSVKnt1BIcmSSW5N8Nck9Sf5z6z8tyZeS3Jfkz5Ic3vqPaNOb2/zJvmqTJM2szz2Fx4Gzq+qFwErglUnOBP4IuKKqlgMPAxe15S8CHq6qnwauaMtJkkaot1CogUfb5GHtVcDZwCda/3rgta19bpumzX95kvRVnyRpd72eU0iyJMkdwA5gA/AN4DtV9WRbZCuwtLWXAg8CtPnfBX6qz/okST+p11CoqqeqaiWwDDgDeP5Mi7X3mfYKateOJGuSbEyycefOnXNXrCRpNFcfVdV3gC8AZwLHJpm6vcYyYFtrbwVOAWjznwl8e4bPWldVq6pq1cTERN+lS9Ki0ufVRxNJjm3to4BfBDYBNwG/3hZbDXymta9t07T5/7eqdttTkCT1p88b4p0MrE+yhEH4XFNVf5HkXuDqJP8FuB24si1/JXBVks0M9hDO77E2SdIMeguFqroTOH2G/vsZnF/Ytf8fgPP6qkeStG9+o1mS1DEUJEkdQ0GS1DEUJEkdQ0GS1DEUJEkdQ0GS1DEUJEkdQ0GS1DEUJEmdPu99JC1qk2uvG8t2t1z+6rFsVwcH9xQkSR1DQZLUMRQkSR1DQZLUMRQkSR1DQZLUMRQkSR1DQZLUMRQkSR1DQZLUMRQkSR1DQZLUMRQkSZ3eQiHJKUluSrIpyT1Jfq/1X5rkW0nuaK9zpq3z9iSbk3w9yS/3VZskaWZ93jr7SeBtVfWVJE8Hbkuyoc27oqreNX3hJCuA84EXAM8CbkjyvKp6qscaJUnT9LanUFXbq+orrf09YBOwdC+rnAtcXVWPV9U3gc3AGX3VJ0na3UjOKSSZBE4HvtS63pLkziQfSnJc61sKPDhtta3MECJJ1iTZmGTjzp07e6xakhaf3kMhyTHAJ4G3VtUjwPuB5wIrge3Au6cWnWH12q2jal1VraqqVRMTEz1VLUmLU6+hkOQwBoHwJ1X1KYCqeqiqnqqqHwEf5MeHiLYCp0xbfRmwrc/6JEk/qc+rjwJcCWyqqvdM6z952mKvA+5u7WuB85MckeQ0YDlwa1/1SZJ21+fVRy8Bfhu4K8kdre8S4IIkKxkcGtoC/A5AVd2T5BrgXgZXLl3slUeSNFq9hUJV/TUznye4fi/rXAZc1ldNkqS98xvNkqSOoSBJ6hgKkqSOoSBJ6hgKkqSOoSBJ6hgKkqSOoSBJ6hgKkqSOoSBJ6hgKkqSOoSBJ6hgKkqSOoSBJ6hgKkqSOoSBJ6hgKkqSOoSBJ6hgKkqSOoSBJ6hgKkqSOoSBJ6hgKkqSOoSBJ6vQWCklOSXJTkk1J7knye63/+CQbktzX3o9r/Uny3iSbk9yZ5EV91SZJmlmfewpPAm+rqucDZwIXJ1kBrAVurKrlwI1tGuBVwPL2WgO8v8faJEkzGCoUkvzs/n5wVW2vqq+09veATcBS4FxgfVtsPfDa1j4X+GgN3AIcm+Tk/d2uJOnADbun8D+T3JrkzUmO3d+NJJkETge+BJxUVdthEBzAiW2xpcCD01bb2vp2/aw1STYm2bhz5879LUWStBdDhUJV/XPgXwGnABuTfCzJK4ZZN8kxwCeBt1bVI3tbdKZNz1DLuqpaVVWrJiYmhilBkjSkoc8pVNV9wDuAPwBeBrw3ydeS/Oqe1klyGINA+JOq+lTrfmjqsFB739H6tzIInSnLgG3D1idJmr1hzyn8XJIrGJwXOBt4TTuBfDZwxR7WCXAlsKmq3jNt1rXA6tZeDXxmWv8b2lVIZwLfnTrMJEkajUOHXO59wAeBS6rqB1OdVbUtyTv2sM5LgN8G7kpyR+u7BLgcuCbJRcADwHlt3vXAOcBm4DHgwv0ZiCRp9oYNhXOAH1TVUwBJDgGOrKrHquqqmVaoqr9m5vMEAC+fYfkCLh6yHklSD4Y9p3ADcNS06aNbnyTpIDJsKBxZVY9OTbT20f2UJEkal2FD4fvTbzuR5OeBH+xleUnSAjTsOYW3Ah9PMnWJ6MnA6/spSZI0LkOFQlV9Ock/Bn6Gwcnjr1XVD3utTJI0csPuKQC8GJhs65yehKr6aC9VSZLGYqhQSHIV8FzgDuCp1l2AoSBJB5Fh9xRWASvadwkkSQepYa8+uhv4R30WIkkav2H3FE4A7k1yK/D4VGdV/UovVUmSxmLYULi0zyIkSfPDsJek/lWSZwPLq+qGJEcDS/otTZI0asPeOvtNwCeAD7SupcCn+ypKkjQew55ovpjBrbAfge6BOyfudQ1J0oIzbCg8XlVPTE0kOZQZHpUpSVrYhg2Fv0pyCXBUezbzx4H/019ZkqRxGDYU1gI7gbuA32HwlLQ9PXFNkrRADXv10Y8YPI7zg/2WI0kap2HvffRNZjiHUFXPmfOKJEljsz/3PppyJHAecPzclyNJGqehzilU1d9Pe32rqv47cHbPtUmSRmzYw0cvmjZ5CIM9h6f3UpEkaWyGPXz07mntJ4EtwG/MeTWSpLEa9uqjX+i7EEnS+A17+Ojf721+Vb1nhnU+BPxLYEdV/WzruxR4E4PvPABcUlXXt3lvBy5i8GS3362qzw05BknSHNmfq49eDFzbpl8DfBF4cC/rfAR4H7s/svOKqnrX9I4kK4DzgRcAzwJuSPK8qnoKSftlcu11Y9nulstfPZbtam7tz0N2XlRV34PuL/6PV9W/2dMKVfXFJJNDfv65wNVV9TjwzSSbgTOAm4dcX5I0B4YNhVOBJ6ZNPwFMHuA235LkDcBG4G1V9TCDW3HfMm2Zra1vN0nWAGsATj311AMsYbzG9ZecJO3LsPc+ugq4NcmlSd4JfIndDwsN4/3Ac4GVwHZ+fFVTZlh2xruwVtW6qlpVVasmJiYOoARJ0p4Me/XRZUk+C7y0dV1YVbfv78aq6qGpdpIPAn/RJrcCp0xbdBmwbX8/X5I0O8PuKQAcDTxSVX8MbE1y2v5uLMnJ0yZfB9zd2tcC5yc5on3ucuDW/f18SdLsDHtJ6jsZXIH0M8CHgcOA/83gaWx7WudPgbOAE5JsBd4JnJVkJYNDQ1sY3IabqronyTXAvQy+HHexVx5J0ugNe6L5dcDpwFcAqmpbkr3e5qKqLpih+8q9LH8ZcNmQ9UiSejBsKDxRVZWkAJI8rceapDnjlV7S/hn2nMI1ST4AHJvkTcAN+MAdSTroDHv10bvas5kfYXBe4T9V1YZeK5Mkjdw+QyHJEuBzVfWLgEEgSQexfR4+alcBPZbkmSOoR5I0RsOeaP4H4K4kG4DvT3VW1e/2UpUkaSyGDYXr2kuSdBDbaygkObWqHqiq9aMqSJI0Pvs6p/DpqUaST/ZciyRpzPYVCtPvXvqcPguRJI3fvkKh9tCWJB2E9nWi+YVJHmGwx3BUa9Omq6qe0Wt1kqSR2msoVNWSURUiSRq//XmegiTpIGcoSJI6hoIkqWMoSJI6hoIkqWMoSJI6hoIkqWMoSJI6hoIkqWMoSJI6hoIkqdNbKCT5UJIdSe6e1nd8kg1J7mvvx7X+JHlvks1J7kzyor7qkiTtWZ97Ch8BXrlL31rgxqpaDtzYpgFeBSxvrzXA+3usS5K0B72FQlV9Efj2Lt3nAlOP9lwPvHZa/0dr4Bbg2CQn91WbJGlmoz6ncFJVbQdo7ye2/qXAg9OW29r6dpNkTZKNSTbu3Lmz12IlabGZLyeaM0PfjE96q6p1VbWqqlZNTEz0XJYkLS6jDoWHpg4LtfcdrX8rcMq05ZYB20ZcmyQteqMOhWuB1a29GvjMtP43tKuQzgS+O3WYSZI0Ovt6RvMBS/KnwFnACUm2Au8ELgeuSXIR8ABwXlv8euAcYDPwGHBhX3VJkvast1Coqgv2MOvlMyxbwMV91SJJGs58OdEsSZoHDAVJUqe3w0eSNCqTa68by3a3XP7qsWy3T+4pSJI6hoIkqWMoSJI6hoIkqWMoSJI6hoIkqWMoSJI6i/Z7CuO6rlmS5jP3FCRJHUNBktQxFCRJnUV7TkGSZmuc5yb7uu+SewqSpI6hIEnqePhII+ElwNLC4J6CJKljKEiSOoaCJKljKEiSOoaCJKljKEiSOmO5JDXJFuB7wFPAk1W1KsnxwJ8Bk8AW4Deq6uFx1CdJi9U49xR+oapWVtWqNr0WuLGqlgM3tmlJ0gjNp8NH5wLrW3s98Nox1iJJi9K4QqGAzye5Lcma1ndSVW0HaO8nzrRikjVJNibZuHPnzhGVK0mLw7huc/GSqtqW5ERgQ5KvDbtiVa0D1gGsWrWq+ipQkhajsewpVNW29r4D+HPgDOChJCcDtPcd46hNkhazkYdCkqclefpUG/gl4G7gWmB1W2w18JlR1yZJi904Dh+dBPx5kqntf6yq/jLJl4FrklwEPACcN4baJGlRG3koVNX9wAtn6P974OWjrkeS9GPz6ZJUSdKY+ZAdSXPCBykdHNxTkCR1DAVJUsdQkCR1DAVJUsdQkCR1DAVJUsdQkCR1DAVJUsdQkCR1DAVJUsdQkCR1DAVJUsdQkCR1DAVJUsdQkCR1DAVJUsdQkCR1DAVJUsdQkCR1DAVJUsdQkCR1DAVJUmfehUKSVyb5epLNSdaOux5JWkzmVSgkWQL8D+BVwArggiQrxluVJC0e8yoUgDOAzVV1f1U9AVwNnDvmmiRp0Th03AXsYinw4LTprcA/mb5AkjXAmjb5aJKvj6i2uXYC8HfjLmIOOZ75zfHMb/s9nvzRrLb37D3NmG+hkBn66icmqtYB60ZTTn+SbKyqVeOuY644nvnN8cxv82k88+3w0VbglGnTy4BtY6pFkhad+RYKXwaWJzktyeHA+cC1Y65JkhaNeXX4qKqeTPIW4HPAEuBDVXXPmMvqy4I/BLYLxzO/OZ75bd6MJ1W176UkSYvCfDt8JEkaI0NBktQxFObYvm7TkeTUJDcluT3JnUnOaf2HJVmf5K4km5K8ffTV726I8Tw7yY1tLF9IsmzavNVJ7muv1aOtfGYHOp4kK5PcnOSeNu/1o69+d7P5+bT5z0jyrSTvG13VezbL37dTk3y+/fu5N8nkKGufySzH81/b79umJO9NMtMl+3OvqnzN0YvByfFvAM8BDge+CqzYZZl1wL9t7RXAltb+TeDq1j4a2AJMLoDxfBxY3dpnA1e19vHA/e39uNY+bgGP53nA8tZ+FrAdOHahjmfa/D8GPga8b5xjmYvxAF8AXtHaxwBHL9TxAP8M+Jv2GUuAm4GzRlG3ewpza5jbdBTwjNZ+Jj/+HkYBT0tyKHAU8ATwSP8l79Uw41kB3NjaN02b/8vAhqr6dlU9DGwAXjmCmvfmgMdTVX9bVfe19jZgBzAxkqr3bDY/H5L8PHAS8PkR1DqMAx5Pu0faoVW1AaCqHq2qx0ZT9h7N5udTwJEMwuQI4DDgod4rxsNHc22m23Qs3WWZS4HfSrIVuB74d63/E8D3GfwF+gDwrqr6dq/V7tsw4/kq8Gut/Trg6Ul+ash1R2024+kkOYPBP9Zv9FTnsA54PEkOAd4N/H7vVQ5vNj+f5wHfSfKpdmj2v7UbbI7TAY+nqm5mEBLb2+tzVbWp53oBQ2Gu7fM2HcAFwEeqahlwDnBV+wd6BvAUg0MTpwFvS/KcPosdwjDj+Q/Ay5LcDrwM+Bbw5JDrjtpsxjP4gORk4Crgwqr6UV+FDmk243kzcH1VPcj8MZvxHAq8tM1/MYNDNm/srdLhHPB4kvw08HwGd3VYCpyd5F/0WeyUefXltYPAMLfpuIh2GKWqbk5yJIObYf0m8JdV9UNgR5K/AVYxOBY/LvscTzuU8qsASY4Bfq2qvtv2hM7aZd0v9FnsEA54PG36GcB1wDuq6paRVLx3s/n5/FPgpUnezOD4++FJHq2qcT7DZLa/b7dX1f1t3qeBM4ErR1H4HsxmPGuAW6rq0TbvswzG88Xeqx7niZiD7cUgZO9n8Jf+1ImlF+yyzGeBN7b289svSYA/AD7c2k8D7gV+bgGM5wTgkNa+DPjD1j4e+CaDk8zHtfbxC3g8hzM49vvWcf+ezcV4dlnmjcyPE82z+fksactPtOkPAxcv4PG8HrihfcZh7XfvNSOpe9y/CAfbi8Ehob9lcLz5P7a+PwR+pbVXMLiq4KvAHcAvtf5jGFyJcE8LhN8f91iGHM+vA/e1Zf4XcMS0df81sLm9Lhz3WGYzHuC3gB+2n9nUa+VCHc8unzEvQmEOft9eAdwJ3AV8BDh8oY6HQch9ANjU/j94z6hq9jYXkqSOJ5olSR1DQZLUMRQkSR1DQZLUMRQkSR1DQZLUMRQkSZ3/DzGuKrVk9SkXAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "df_trn['收率'].plot(kind='hist')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 训练模型" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "def xgb_cv(train, test, params, fit_params, feature_names, nfold, seed):\n", + " \"\"\"\n", + " train训练数据\n", + " test测试数据\n", + " params参数\n", + " fit_params训练参数\n", + " feature_names特征名\n", + " nfold几折交叉\n", + " seed随机种子\n", + " \"\"\"\n", + " # 创建结果df\n", + " train_pred = pd.DataFrame({\n", + " 'id': train['样本id'],\n", + " 'true': train['收率'],\n", + " 'pred': np.zeros(len(train))})\n", + " # 测试提交结果\n", + " test_pred = pd.DataFrame({'id': test['样本id'], 'pred': np.zeros(len(test))})\n", + " # 交叉验证\n", + " kfolder = KFold(n_splits=nfold, shuffle=True, random_state=seed)\n", + " # 构造测试DMatrix\n", + " xgb_tst = xgb.DMatrix(data=test[feature_names])\n", + " print('\\n')\n", + " # 遍历cv中每一折数据,通过索引来指定\n", + " for fold_id, (trn_idx, val_idx) in enumerate(kfolder.split(train['收率'])):\n", + " # 构造当前训练的DMatrix\n", + " xgb_trn = xgb.DMatrix(\n", + " train.iloc[trn_idx][feature_names],\n", + " train.iloc[trn_idx]['收率'])\n", + " # 构造当前验证的DMatrix\n", + " xgb_val = xgb.DMatrix(\n", + " train.iloc[val_idx][feature_names],\n", + " train.iloc[val_idx]['收率'])\n", + " # 训练回归模型\n", + " xgb_reg = xgb.train(params=params, dtrain=xgb_trn, **fit_params,\n", + " evals=[(xgb_trn, 'train'), (xgb_val, 'valid')])\n", + " # 得到验证结果\n", + " val_pred = xgb_reg.predict(\n", + " xgb.DMatrix(train.iloc[val_idx][feature_names]),\n", + " ntree_limit=xgb_reg.best_ntree_limit)\n", + " train_pred.loc[val_idx, 'pred'] = val_pred\n", + " # print(f'Fold_{fold_id}', mse(train.iloc[val_idx]['收率'], val_pred))\n", + " test_pred['pred'] += xgb_reg.predict(\n", + " xgb_tst, ntree_limit=xgb_reg.best_ntree_limit) / nfold\n", + " print('\\nCV LOSS:', mse(train_pred['true'], train_pred['pred']), '\\n')\n", + " return test_pred\n" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "# 设置训练参数\n", + "fit_params = {'num_boost_round': 10800,\n", + " 'verbose_eval': 300,\n", + " 'early_stopping_rounds': 360}\n", + "params_xgb = {'eta': 0.01, 'max_depth': 7, 'subsample': 0.8,\n", + " 'booster': 'gbtree', 'colsample_bytree': 0.8,\n", + " 'objective': 'reg:linear', 'silent': True, 'nthread': 4}" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "[0]\ttrain-rmse:0.42052\tvalid-rmse:0.417952\n", + "Multiple eval metrics have been passed: 'valid-rmse' will be used for early stopping.\n", + "\n", + "Will train until valid-rmse hasn't improved in 360 rounds.\n", + "[300]\ttrain-rmse:0.023717\tvalid-rmse:0.023667\n", + "[600]\ttrain-rmse:0.00645\tvalid-rmse:0.011488\n", + "[900]\ttrain-rmse:0.004691\tvalid-rmse:0.011727\n", + "Stopping. Best iteration:\n", + "[600]\ttrain-rmse:0.00645\tvalid-rmse:0.011488\n", + "\n", + "[0]\ttrain-rmse:0.419812\tvalid-rmse:0.420785\n", + "Multiple eval metrics have been passed: 'valid-rmse' will be used for early stopping.\n", + "\n", + "Will train until valid-rmse hasn't improved in 360 rounds.\n", + "[300]\ttrain-rmse:0.02374\tvalid-rmse:0.025614\n", + "[600]\ttrain-rmse:0.006597\tvalid-rmse:0.01204\n", + "[900]\ttrain-rmse:0.004692\tvalid-rmse:0.01197\n", + "Stopping. Best iteration:\n", + "[810]\ttrain-rmse:0.005159\tvalid-rmse:0.011948\n", + "\n", + "[0]\ttrain-rmse:0.419963\tvalid-rmse:0.420191\n", + "Multiple eval metrics have been passed: 'valid-rmse' will be used for early stopping.\n", + "\n", + "Will train until valid-rmse hasn't improved in 360 rounds.\n", + "[300]\ttrain-rmse:0.023604\tvalid-rmse:0.025064\n", + "[600]\ttrain-rmse:0.006202\tvalid-rmse:0.01245\n", + "[900]\ttrain-rmse:0.004472\tvalid-rmse:0.012215\n", + "[1200]\ttrain-rmse:0.003453\tvalid-rmse:0.012209\n", + "Stopping. Best iteration:\n", + "[1062]\ttrain-rmse:0.003866\tvalid-rmse:0.012199\n", + "\n", + "[0]\ttrain-rmse:0.420254\tvalid-rmse:0.419025\n", + "Multiple eval metrics have been passed: 'valid-rmse' will be used for early stopping.\n", + "\n", + "Will train until valid-rmse hasn't improved in 360 rounds.\n", + "[300]\ttrain-rmse:0.02381\tvalid-rmse:0.024832\n", + "[600]\ttrain-rmse:0.006467\tvalid-rmse:0.010957\n", + "[900]\ttrain-rmse:0.004619\tvalid-rmse:0.010752\n", + "[1200]\ttrain-rmse:0.003542\tvalid-rmse:0.010815\n", + "Stopping. Best iteration:\n", + "[873]\ttrain-rmse:0.004751\tvalid-rmse:0.01075\n", + "\n", + "[0]\ttrain-rmse:0.419487\tvalid-rmse:0.422069\n", + "Multiple eval metrics have been passed: 'valid-rmse' will be used for early stopping.\n", + "\n", + "Will train until valid-rmse hasn't improved in 360 rounds.\n", + "[300]\ttrain-rmse:0.023859\tvalid-rmse:0.024063\n", + "[600]\ttrain-rmse:0.006739\tvalid-rmse:0.0102\n", + "[900]\ttrain-rmse:0.004817\tvalid-rmse:0.010053\n", + "[1200]\ttrain-rmse:0.003709\tvalid-rmse:0.010089\n", + "Stopping. Best iteration:\n", + "[872]\ttrain-rmse:0.004956\tvalid-rmse:0.010047\n", + "\n", + "\n", + "CV LOSS: 0.0001280110217167903 \n", + "\n" + ] + } + ], + "source": [ + "# 开始训练\n", + "pred_xgb_a = xgb_cv(df_trn, df_tst, \n", + " params_xgb, fit_params,\n", + " df_trn.columns.tolist()[1:-1], 5, 0)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "# 得到预测结果\n", + "df_tst_a['收率'] = pred_xgb_a['pred'].values" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
样本idA1A2A3A4A5A6A7A8A9...B6B7B8B9B10B11B12B13B14收率
0sample_1656300NaN405.07006:00:0029NaNNaN8:00:00...7917:00:004517:00-18:3018:30-20:0020:00-21:0012000.154000.905793
1sample_1548300NaN405.070012:30:003912:50:0080.014:20:00...6510:00:004512:00-13:0014:00-15:30NaN8000.153850.879575
2sample_769300NaN405.07006:00:0080NaNNaN8:00:00...8017:00:004517:00-20:00NaNNaN12000.154400.934695
3sample_1881300NaN405.070022:00:0029NaNNaN0:00:00...809:00:00459:00-10:3010:30-12:0012:00-13:0012000.154000.903490
4sample_1807300NaN405.070022:00:0030NaNNaN0:00:00...799:00:00459:00-10:3010:30-12:0012:00-13:0012000.154000.928534
\n", + "

5 rows × 44 columns

\n", + "
" + ], + "text/plain": [ + " 样本id A1 A2 A3 A4 A5 A6 A7 A8 A9 \\\n", + "0 sample_1656 300 NaN 405.0 700 6:00:00 29 NaN NaN 8:00:00 \n", + "1 sample_1548 300 NaN 405.0 700 12:30:00 39 12:50:00 80.0 14:20:00 \n", + "2 sample_769 300 NaN 405.0 700 6:00:00 80 NaN NaN 8:00:00 \n", + "3 sample_1881 300 NaN 405.0 700 22:00:00 29 NaN NaN 0:00:00 \n", + "4 sample_1807 300 NaN 405.0 700 22:00:00 30 NaN NaN 0:00:00 \n", + "\n", + " ... B6 B7 B8 B9 B10 B11 B12 B13 \\\n", + "0 ... 79 17:00:00 45 17:00-18:30 18:30-20:00 20:00-21:00 1200 0.15 \n", + "1 ... 65 10:00:00 45 12:00-13:00 14:00-15:30 NaN 800 0.15 \n", + "2 ... 80 17:00:00 45 17:00-20:00 NaN NaN 1200 0.15 \n", + "3 ... 80 9:00:00 45 9:00-10:30 10:30-12:00 12:00-13:00 1200 0.15 \n", + "4 ... 79 9:00:00 45 9:00-10:30 10:30-12:00 12:00-13:00 1200 0.15 \n", + "\n", + " B14 收率 \n", + "0 400 0.905793 \n", + "1 385 0.879575 \n", + "2 440 0.934695 \n", + "3 400 0.903490 \n", + "4 400 0.928534 \n", + "\n", + "[5 rows x 44 columns]" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_tst_a.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/机器学习竞赛实战_优胜解决方案/工业生产预测/assets/20201130145942327.png b/机器学习竞赛实战_优胜解决方案/工业生产预测/assets/20201130145942327.png new file mode 100644 index 0000000000000000000000000000000000000000..c04cdd965f9d7282967d22f710493bc02553d618 GIT binary patch literal 296286 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%0DvbyHTJ64 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�i?)c?u{QlD_iiE#&qVTA!B2 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 z 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

KrI@b%`(IO?T_gO^s0hTyd1H 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\n", + "

  • 数据集包括工程中10各步骤的参数,样本id、A1-A28、B1-B14包括原料、辅料、时间、温度、压强以及收率。\n", + "
  • 冠军ATCG解决方案\n", + "\n", + "\n", + "**预测具体的值:回归任务**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 数据处理" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import warnings\n", + "import xgboost as xgb\n", + "from sklearn.model_selection import KFold\n", + "from sklearn.metrics import mean_squared_error as mse\n", + "\n", + "warnings.simplefilter('ignore')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"导入数据集\"\"\"\n", + "df_trn = pd.read_csv('jinnan_round1_train_20181227.csv', encoding='GB2312') # encoding进行编码\n", + "df_tst_a = pd.read_csv('jinnan_round1_testA_20181227.csv', encoding='GB2312')\n", + "df_tst_b = pd.read_csv('jinnan_round1_testB_20190121.csv', encoding='GB2312') " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    样本idA1A2A3A4A5A6A7A8A9...B6B7B8B9B10B11B12B13B14收率
    0sample_1528300NaN405.070013:30:0038.0NaNNaN15:30:00...6511:30:0045.011:30-13:0014:00-15:30NaN800.00.154000.879
    1sample_1698300NaN405.070014:00:0029.0NaNNaN16:00:00...806:00:0045.06:00-7:307:30-9:009:00-10:001200.00.154000.902
    2sample_639300NaN405.070014:00:0029.0NaNNaN16:00:00...801:00:0045.01:00-2:302:30-4:004:00-5:001200.00.154000.936
    3sample_483300NaN405.07001:30:0038.0NaNNaN3:00:00...6518:00:0045.019:00-20:3021:30-23:00NaN800.00.154000.902
    4sample_617300NaN405.070022:00:0029.0NaNNaN0:00:00...809:00:0045.09:00-10:3010:30-12:0012:00-13:001200.00.154200.983
    \n", + "

    5 rows × 44 columns

    \n", + "
    " + ], + "text/plain": [ + " 样本id A1 A2 A3 A4 A5 A6 A7 A8 A9 ... \\\n", + "0 sample_1528 300 NaN 405.0 700 13:30:00 38.0 NaN NaN 15:30:00 ... \n", + "1 sample_1698 300 NaN 405.0 700 14:00:00 29.0 NaN NaN 16:00:00 ... \n", + "2 sample_639 300 NaN 405.0 700 14:00:00 29.0 NaN NaN 16:00:00 ... \n", + "3 sample_483 300 NaN 405.0 700 1:30:00 38.0 NaN NaN 3:00:00 ... \n", + "4 sample_617 300 NaN 405.0 700 22:00:00 29.0 NaN NaN 0:00:00 ... \n", + "\n", + " B6 B7 B8 B9 B10 B11 B12 B13 \\\n", + "0 65 11:30:00 45.0 11:30-13:00 14:00-15:30 NaN 800.0 0.15 \n", + "1 80 6:00:00 45.0 6:00-7:30 7:30-9:00 9:00-10:00 1200.0 0.15 \n", + "2 80 1:00:00 45.0 1:00-2:30 2:30-4:00 4:00-5:00 1200.0 0.15 \n", + "3 65 18:00:00 45.0 19:00-20:30 21:30-23:00 NaN 800.0 0.15 \n", + "4 80 9:00:00 45.0 9:00-10:30 10:30-12:00 12:00-13:00 1200.0 0.15 \n", + "\n", + " B14 收率 \n", + "0 400 0.879 \n", + "1 400 0.902 \n", + "2 400 0.936 \n", + "3 400 0.902 \n", + "4 420 0.983 \n", + "\n", + "[5 rows x 44 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 观察数据\n", + "df_trn.head() # 可以发现A2、A7等有NaN缺失值" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 1396 entries, 0 to 1395\n", + "Data columns (total 44 columns):\n", + "样本id 1396 non-null object\n", + "A1 1396 non-null int64\n", + "A2 42 non-null float64\n", + "A3 1354 non-null float64\n", + "A4 1396 non-null int64\n", + "A5 1396 non-null object\n", + "A6 1396 non-null float64\n", + "A7 149 non-null object\n", + "A8 149 non-null float64\n", + "A9 1396 non-null object\n", + "A10 1396 non-null int64\n", + "A11 1396 non-null object\n", + "A12 1396 non-null int64\n", + "A13 1396 non-null float64\n", + "A14 1396 non-null object\n", + "A15 1396 non-null float64\n", + "A16 1396 non-null object\n", + "A17 1396 non-null float64\n", + "A18 1396 non-null float64\n", + "A19 1396 non-null int64\n", + "A20 1396 non-null object\n", + "A21 1393 non-null float64\n", + "A22 1396 non-null float64\n", + "A23 1393 non-null float64\n", + "A24 1395 non-null object\n", + "A25 1396 non-null object\n", + "A26 1394 non-null object\n", + "A27 1396 non-null int64\n", + "A28 1396 non-null object\n", + "B1 1386 non-null float64\n", + "B2 1394 non-null float64\n", + "B3 1394 non-null float64\n", + "B4 1396 non-null object\n", + "B5 1395 non-null object\n", + "B6 1396 non-null int64\n", + "B7 1396 non-null object\n", + "B8 1395 non-null float64\n", + "B9 1396 non-null object\n", + "B10 1152 non-null object\n", + "B11 547 non-null object\n", + "B12 1395 non-null float64\n", + "B13 1395 non-null float64\n", + "B14 1396 non-null int64\n", + "收率 1396 non-null float64\n", + "dtypes: float64(18), int64(8), object(18)\n", + "memory usage: 480.0+ KB\n" + ] + } + ], + "source": [ + "df_trn.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "我们需要解决一些异常值,如某值相对其它值过大的离群点" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def train_abnormal_revise(data):\n", + " df_trn = data.copy() # 复制一份数据,不改变原数据\n", + " df_trn.loc[(df_trn['A1'] == 200) & (df_trn['A3'] == 405), 'A1'] = 300\n", + " # A5会发现三个不合法值,比如1900/1/21 0:00可能要表达的是21:00:00,我们替换掉\n", + " df_trn['A5'] = df_trn['A5'].replace('1900/1/21 0:00', '21:00:00')\n", + " df_trn['A5'] = df_trn['A5'].replace('1900/1/29 0:00', '14:00:00')\n", + " df_trn['A9'] = df_trn['A9'].replace('1900/1/9 7:00', '23:00:00')\n", + " # A9有两个不合法值\n", + " df_trn['A9'] = df_trn['A9'].replace('1900/1/9 7:00', '23:00:00')\n", + " df_trn['A9'] = df_trn['A9'].replace('700', '7:00:00')\n", + " # A11有一个不合法值\n", + " df_trn['A11'] = df_trn['A11'].replace('1900/1/1 2:30', '2:30:00')\n", + " df_trn['A11'] = df_trn['A11'].replace(':30:00', '00:30:00')\n", + " df_trn['A16'] = df_trn['A16'].replace('1900/1/12 0:00', '12:00:00')\n", + " df_trn['A20'] = df_trn['A20'].replace('6:00-6:30分', '6:00-6:30')\n", + " df_trn['A20'] = df_trn['A20'].replace('18:30-15:00', '18:30-19:00')\n", + " # A22有个不合法值\n", + " df_trn['A22'] = df_trn['A22'].replace(3.5, np.nan)\n", + " df_trn['A25'] = df_trn['A25'].replace('1900/3/10 0:00', 70).astype(int)\n", + " df_trn['A26'] = df_trn['A26'].replace('1900/3/13 0:00', '13:00:00')\n", + " df_trn['B1'] = df_trn['B1'].replace(3.5, np.nan)\n", + " df_trn['B4'] = df_trn['B4'].replace('15:00-1600', '15:00-16:00')\n", + " df_trn['B4'] = df_trn['B4'].replace('18:00-17:00', '16:00-17:00')\n", + " df_trn['B4'] = df_trn['B4'].replace('19:-20:05', '19:05-20:05')\n", + " df_trn['B9'] = df_trn['B9'].replace('23:00-7:30', '23:00-00:30')\n", + " df_trn['B14'] = df_trn['B14'].replace(40, 400)\n", + " return df_trn\n", + "\n", + "\n", + "def test_a_abnormal_revise(data):\n", + " df_tst = data.copy()\n", + " df_tst['A5'] = df_tst['A5'].replace('1900/1/22 0:00', '22:00:00')\n", + " df_tst['A7'] = df_tst['A7'].replace('0:50:00', '21:50:00')\n", + " df_tst['B14'] = df_tst['B14'].replace(785, 385)\n", + " return df_tst\n", + "\n", + "\n", + "def train_abnormal_adjust(data):\n", + " df_trn = data.copy()\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1894', 'A5'] = '14:00:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1234', 'A9'] = '0:00:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1020', 'A9'] = '18:30:00'\n", + "\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1380', 'A11'] = '15:30:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_844', 'A11'] = '10:00:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1348', 'A11'] = '17:00:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_25', 'A11'] = '00:30:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1105', 'A11'] = '4:00:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_313', 'A11'] = '15:30:00'\n", + "\n", + " df_trn.loc[df_trn['样本id'] == 'sample_291', 'A14'] = '19:30:00'\n", + "\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1398', 'A16'] = '11:00:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1177', 'A20'] = '19:00-20:00'\n", + "\n", + " df_trn.loc[df_trn['样本id'] == 'sample_71', 'A20'] = '16:20-16:50'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_14', 'A20'] = '18:00-18:30'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_69', 'A20'] = '6:10-6:50'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1500', 'A20'] = '23:00-23:30'\n", + "\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1524', 'A24'] = '15:00:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1524', 'A26'] = '15:30:00'\n", + "\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1046', 'A28'] = '18:00-18:30'\n", + "\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1230', 'B5'] = '17:00:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_97', 'B7'] = '1:00:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_752', 'B9'] = '11:00-14:00'\n", + "\n", + " df_trn.loc[df_trn['样本id'] == 'sample_609', 'B11'] = '11:00-12:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_643', 'B11'] = '12:00-13:00'\n", + " df_trn.loc[df_trn['样本id'] == 'sample_1164', 'B11'] = '5:00-6:00'\n", + " return df_trn\n", + "\n", + "\n", + "def test_a_abnormal_adjust(data):\n", + " df_tst = data.copy()\n", + " df_tst.loc[df_tst['样本id'] == 'sample_919', 'A9'] = '19:50:00'\n", + " return df_tst\n", + "\n", + "\n", + "def test_b_abnormal_adjust(data):\n", + " df_tst = data.copy()\n", + " df_tst.loc[df_tst['样本id'] == 'sample_566', 'A5'] = '18:00:00'\n", + " df_tst.loc[df_tst['样本id'] == 'sample_40', 'A20'] = '5:00-5:30'\n", + " df_tst.loc[df_tst['样本id'] == 'sample_531', 'B5'] = '1:00'\n", + " return df_tst" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "df_trn = train_abnormal_revise(df_trn).pipe(train_abnormal_adjust)\n", + "df_tst_a = test_a_abnormal_revise(df_tst_a).pipe(test_a_abnormal_adjust)\n", + "df_tst_b = test_b_abnormal_adjust(df_tst_b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 标签与数据集整合" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "df_trn, df_tst = df_trn.copy(), df_tst_a.copy()\n", + "df_target = df_trn['收率'] # 获取数据标签\n", + "del df_trn['收率'] # 删除掉训练集的标签,即是训练数据\n", + "df_trn_tst = df_trn.append(df_tst, ignore_index=False).reset_index(\n", + " drop=True) # 把test合并一起,同时做操作" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "for _df in [df_trn, df_tst, df_trn_tst]:\n", + " _df['A3'] = _df['A3'].fillna(405) # A3有缺失值,用众数填充" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 时间段特征处理 " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# 所有时间相关列\n", + "cols_timer = ['A5', 'A7', 'A9', 'A11', 'A14', 'A16', 'A24', 'A26', 'B5', 'B7']\n", + "# 同时对训练和测试集进行相同处理\n", + "for _df in [df_trn_tst, df_trn, df_tst]:\n", + " # 添加列名标记\n", + " _df.rename(columns={_col: _col + '_t' for _col in cols_timer},\n", + " inplace=True)\n", + " # 遍历所有持续时间相关列例如21:00-21:30\n", + " for _col in ['A20', 'A28', 'B4', 'B9', 'B10', 'B11']:\n", + " # 取到当前列的索引\n", + " _idx_col = _df.columns.tolist().index(_col)\n", + " # 添加新的一列,表示起始时间,split表示分别取开始和结束时间,用索引来指定\n", + " _df.insert(_idx_col + 1, _col + '_at',\n", + " _df[_col].str.split('-').str[0])\n", + " # 添加新的一列,表示终止时间\n", + " _df.insert(_idx_col + 2, _col + '_bt',\n", + " _df[_col].str.split('-').str[1])\n", + " # 删除持续时间\n", + " del _df[_col]\n", + " cols_timer = cols_timer + [_col + '_at', _col + '_bt']" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    样本idA1A2A3A4A5_tA6A7_tA8A9_t...B8B9_atB9_btB10_atB10_btB11_atB11_btB12B13B14
    0sample_1528300NaN405.070013:30:0038.0NaNNaN15:30:00...45.011:3013:0014:0015:30NaNNaN800.00.15400
    1sample_1698300NaN405.070014:00:0029.0NaNNaN16:00:00...45.06:007:307:309:009:0010:001200.00.15400
    2sample_639300NaN405.070014:00:0029.0NaNNaN16:00:00...45.01:002:302:304:004:005:001200.00.15400
    3sample_483300NaN405.07001:30:0038.0NaNNaN3:00:00...45.019:0020:3021:3023:00NaNNaN800.00.15400
    4sample_617300NaN405.070022:00:0029.0NaNNaN0:00:00...45.09:0010:3010:3012:0012:0013:001200.00.15420
    \n", + "

    5 rows × 49 columns

    \n", + "
    " + ], + "text/plain": [ + " 样本id A1 A2 A3 A4 A5_t A6 A7_t A8 A9_t ... \\\n", + "0 sample_1528 300 NaN 405.0 700 13:30:00 38.0 NaN NaN 15:30:00 ... \n", + "1 sample_1698 300 NaN 405.0 700 14:00:00 29.0 NaN NaN 16:00:00 ... \n", + "2 sample_639 300 NaN 405.0 700 14:00:00 29.0 NaN NaN 16:00:00 ... \n", + "3 sample_483 300 NaN 405.0 700 1:30:00 38.0 NaN NaN 3:00:00 ... \n", + "4 sample_617 300 NaN 405.0 700 22:00:00 29.0 NaN NaN 0:00:00 ... \n", + "\n", + " B8 B9_at B9_bt B10_at B10_bt B11_at B11_bt B12 B13 B14 \n", + "0 45.0 11:30 13:00 14:00 15:30 NaN NaN 800.0 0.15 400 \n", + "1 45.0 6:00 7:30 7:30 9:00 9:00 10:00 1200.0 0.15 400 \n", + "2 45.0 1:00 2:30 2:30 4:00 4:00 5:00 1200.0 0.15 400 \n", + "3 45.0 19:00 20:30 21:30 23:00 NaN NaN 800.0 0.15 400 \n", + "4 45.0 9:00 10:30 10:30 12:00 12:00 13:00 1200.0 0.15 420 \n", + "\n", + "[5 rows x 49 columns]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_trn_tst.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "cols_timer = list(filter(lambda x: x.endswith('t'), df_trn_tst.columns))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['A5_t',\n", + " 'A7_t',\n", + " 'A9_t',\n", + " 'A11_t',\n", + " 'A14_t',\n", + " 'A16_t',\n", + " 'A20_at',\n", + " 'A20_bt',\n", + " 'A24_t',\n", + " 'A26_t',\n", + " 'A28_at',\n", + " 'A28_bt',\n", + " 'B4_at',\n", + " 'B4_bt',\n", + " 'B5_t',\n", + " 'B7_t',\n", + " 'B9_at',\n", + " 'B9_bt',\n", + " 'B10_at',\n", + " 'B10_bt',\n", + " 'B11_at',\n", + " 'B11_bt']" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cols_timer" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def time_to_min(x):\n", + " # 将时间全部转换成分钟形式\n", + " if x is np.nan:\n", + " return np.nan\n", + " else:\n", + " x = x.replace(';', ':').replace(';', ':')\n", + " x = x.replace('::', ':').replace('\"', ':')\n", + " h, m = x.split(':')[:2]\n", + " h = 0 if not h else h\n", + " m = 0 if not m else m\n", + " return int(h)*60 + int(m)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "for _df in [df_trn_tst, df_trn, df_tst]:\n", + " for _col in cols_timer:\n", + " _df[_col] = _df[_col].map(time_to_min)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    样本idA1A2A3A4A5_tA6A7_tA8A9_t...B8B9_atB9_btB10_atB10_btB11_atB11_btB12B13B14
    0sample_1528300NaN405.070081038.0NaNNaN930...45.0690780840.0930.0NaNNaN800.00.15400
    1sample_1698300NaN405.070084029.0NaNNaN960...45.0360450450.0540.0540.0600.01200.00.15400
    2sample_639300NaN405.070084029.0NaNNaN960...45.060150150.0240.0240.0300.01200.00.15400
    3sample_483300NaN405.07009038.0NaNNaN180...45.0114012301290.01380.0NaNNaN800.00.15400
    4sample_617300NaN405.0700132029.0NaNNaN0...45.0540630630.0720.0720.0780.01200.00.15420
    \n", + "

    5 rows × 49 columns

    \n", + "
    " + ], + "text/plain": [ + " 样本id A1 A2 A3 A4 A5_t A6 A7_t A8 A9_t ... B8 \\\n", + "0 sample_1528 300 NaN 405.0 700 810 38.0 NaN NaN 930 ... 45.0 \n", + "1 sample_1698 300 NaN 405.0 700 840 29.0 NaN NaN 960 ... 45.0 \n", + "2 sample_639 300 NaN 405.0 700 840 29.0 NaN NaN 960 ... 45.0 \n", + "3 sample_483 300 NaN 405.0 700 90 38.0 NaN NaN 180 ... 45.0 \n", + "4 sample_617 300 NaN 405.0 700 1320 29.0 NaN NaN 0 ... 45.0 \n", + "\n", + " B9_at B9_bt B10_at B10_bt B11_at B11_bt B12 B13 B14 \n", + "0 690 780 840.0 930.0 NaN NaN 800.0 0.15 400 \n", + "1 360 450 450.0 540.0 540.0 600.0 1200.0 0.15 400 \n", + "2 60 150 150.0 240.0 240.0 300.0 1200.0 0.15 400 \n", + "3 1140 1230 1290.0 1380.0 NaN NaN 800.0 0.15 400 \n", + "4 540 630 630.0 720.0 720.0 780.0 1200.0 0.15 420 \n", + "\n", + "[5 rows x 49 columns]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_trn_tst.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 创建一个df来准备添加很多特征" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    样本id
    0sample_1528
    1sample_1698
    2sample_639
    3sample_483
    4sample_617
    \n", + "
    " + ], + "text/plain": [ + " 样本id\n", + "0 sample_1528\n", + "1 sample_1698\n", + "2 sample_639\n", + "3 sample_483\n", + "4 sample_617" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "raw = df_trn_tst.copy()\n", + "df = pd.DataFrame(raw['样本id'])\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 温度相关特征" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# 加热过程\n", + "df['P1_S1_A6_0C'] = raw['A6'] # 容器初始温度\n", + "df['P1_S2_A8_1C'] = raw['A8'] # 首次测温温度\n", + "df['P1_S3_A10_2C'] = raw['A10'] # 准备水解温度\n", + "df['P1_C1_C0_D'] = raw['A8'] - raw['A6'] # 测温温差\n", + "df['P1_C2_C0_D'] = raw['A10'] - raw['A6'] # 初次沸腾温差\n", + "\n", + "# 水解过程\n", + "df['P2_S1_A12_3C'] = raw['A12'] # 水解开始温度\n", + "df['P2_S2_A15_4C'] = raw['A15'] # 水解过程测温温度\n", + "df['P2_S3_A17_5C'] = raw['A17'] # 水解结束温度\n", + "df['P2_C3_C0_D'] = raw['A12'] - raw['A6'] # 水解开始与初始温度温差\n", + "df['P2_C3_C2_D'] = raw['A12'] - raw['A10'] # 水解开始前恒温温差\n", + "df['P2_C4_C3_D'] = raw['A15'] - raw['A12'] # 水解过程中途温差\n", + "df['P2_C5_C4_D'] = raw['A17'] - raw['A15'] # 水解结束中途温差\n", + "df['P2_C5_C3_KD'] = raw['A17'] - raw['A12'] # 水解起止温差\n", + "\n", + "# 脱色过程\n", + "df['P3_S2_A25_7C'] = raw['A25'] # 脱色保温开始温度\n", + "df['P3_S3_A27_8C'] = raw['A27'] # 脱色保温结束温度\n", + "df['P3_C7_C5_D'] = raw['A25'] - raw['A17'] # 降温温差\n", + "df['P3_C8_C7_KD'] = raw['A27'] - raw['A25'] # 保温温差\n", + "\n", + "# 结晶过程\n", + "df['P4_S2_B6_11C'] = raw['B6'] # 结晶开始温度\n", + "df['P4_S3_B8_12C'] = raw['B8'] # 结晶结束温度\n", + "df['P4_C11_C8_D'] = raw['B6'] - raw['A27'] # 脱色结束到结晶温差\n", + "df['P4_C12_C11_KD'] = raw['B8'] - raw['B6'] # 结晶温差" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 温度相关统计特征" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "_funcs = ['mean', 'std', 'sum']\n", + "# 遍历每一种统计指标\n", + "for _func in _funcs:\n", + " # 对每一个样本计算各项指标\n", + " df[f'P2_C2-C5_{_func}'] = raw[['A10', 'A12', 'A15', 'A17']].\\\n", + " agg(_func, axis=1) # 沸腾过程温度\n", + " df[f'P2_D3-D5_{_func}'] = \\\n", + " df[[f'P2_C{i}_C{i-1}_D' for i in range(3, 6)]].\\\n", + " abs().agg(_func, axis=1) # 沸腾过程绝对温差\n", + " df[f'P2_C1-C12_KD_ABS_{_func}'] = \\\n", + " df[[_f for _f in df.columns if _f.endswith('KD')]].\\\n", + " abs().agg(_func, axis=1) # 关键过程绝对温差\n", + " df[f'P2_C1-C12_D_{_func}'] = \\\n", + " df[[_f for _f in df.columns if _f.endswith('D')]].\\\n", + " abs().agg(_func, axis=1) # 所有过程绝对温差\n", + " df[f'P2_LARGE_KD_{_func}'] = \\\n", + " df[['P2_C3_C0_D', 'P3_C7_C5_D', 'P4_C12_C11_KD']].\\\n", + " abs().agg(_func, axis=1) # 大温差绝对温差" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    样本idP1_S1_A6_0CP1_S2_A8_1CP1_S3_A10_2CP1_C1_C0_DP1_C2_C0_DP2_S1_A12_3CP2_S2_A15_4CP2_S3_A17_5CP2_C3_C0_D...P2_C2-C5_stdP2_D3-D5_stdP2_C1-C12_KD_ABS_stdP2_C1-C12_D_stdP2_LARGE_KD_stdP2_C2-C5_sumP2_D3-D5_sumP2_C1-C12_KD_ABS_sumP2_C1-C12_D_sumP2_LARGE_KD_sum
    0sample_152838.0NaN100NaN62.0102.0103.0104.064.0...1.7078250.577359.64365124.92856523.245071409.04.027.0191.0113.0
    1sample_169829.0NaN101NaN72.0103.0104.0105.074.0...1.7078250.5773517.78576228.88752125.890796413.04.044.0226.0134.0
    2sample_63929.0NaN102NaN73.0103.0104.0105.074.0...1.2909940.0000018.00925729.23164225.514702414.03.043.0226.0135.0
    3sample_48338.0NaN100NaN62.0102.0103.0104.064.0...1.7078250.577359.16515124.61729322.479620409.04.030.0207.0118.0
    4sample_61729.0NaN101NaN72.0103.0104.0105.074.0...1.7078250.5773517.78576228.88752125.890796413.04.044.0226.0134.0
    \n", + "

    5 rows × 37 columns

    \n", + "
    " + ], + "text/plain": [ + " 样本id P1_S1_A6_0C P1_S2_A8_1C P1_S3_A10_2C P1_C1_C0_D \\\n", + "0 sample_1528 38.0 NaN 100 NaN \n", + "1 sample_1698 29.0 NaN 101 NaN \n", + "2 sample_639 29.0 NaN 102 NaN \n", + "3 sample_483 38.0 NaN 100 NaN \n", + "4 sample_617 29.0 NaN 101 NaN \n", + "\n", + " P1_C2_C0_D P2_S1_A12_3C P2_S2_A15_4C P2_S3_A17_5C P2_C3_C0_D ... \\\n", + "0 62.0 102.0 103.0 104.0 64.0 ... \n", + "1 72.0 103.0 104.0 105.0 74.0 ... \n", + "2 73.0 103.0 104.0 105.0 74.0 ... \n", + "3 62.0 102.0 103.0 104.0 64.0 ... \n", + "4 72.0 103.0 104.0 105.0 74.0 ... \n", + "\n", + " P2_C2-C5_std P2_D3-D5_std P2_C1-C12_KD_ABS_std P2_C1-C12_D_std \\\n", + "0 1.707825 0.57735 9.643651 24.928565 \n", + "1 1.707825 0.57735 17.785762 28.887521 \n", + "2 1.290994 0.00000 18.009257 29.231642 \n", + "3 1.707825 0.57735 9.165151 24.617293 \n", + "4 1.707825 0.57735 17.785762 28.887521 \n", + "\n", + " P2_LARGE_KD_std P2_C2-C5_sum P2_D3-D5_sum P2_C1-C12_KD_ABS_sum \\\n", + "0 23.245071 409.0 4.0 27.0 \n", + "1 25.890796 413.0 4.0 44.0 \n", + "2 25.514702 414.0 3.0 43.0 \n", + "3 22.479620 409.0 4.0 30.0 \n", + "4 25.890796 413.0 4.0 44.0 \n", + "\n", + " P2_C1-C12_D_sum P2_LARGE_KD_sum \n", + "0 191.0 113.0 \n", + "1 226.0 134.0 \n", + "2 226.0 135.0 \n", + "3 207.0 118.0 \n", + "4 226.0 134.0 \n", + "\n", + "[5 rows x 37 columns]" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "df_temperature = df.set_index('样本id')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    P1_S1_A6_0CP1_S2_A8_1CP1_S3_A10_2CP1_C1_C0_DP1_C2_C0_DP2_S1_A12_3CP2_S2_A15_4CP2_S3_A17_5CP2_C3_C0_DP2_C3_C2_D...P2_C2-C5_stdP2_D3-D5_stdP2_C1-C12_KD_ABS_stdP2_C1-C12_D_stdP2_LARGE_KD_stdP2_C2-C5_sumP2_D3-D5_sumP2_C1-C12_KD_ABS_sumP2_C1-C12_D_sumP2_LARGE_KD_sum
    样本id
    sample_152838.0NaN100NaN62.0102.0103.0104.064.02.0...1.7078250.577359.64365124.92856523.245071409.04.027.0191.0113.0
    sample_169829.0NaN101NaN72.0103.0104.0105.074.02.0...1.7078250.5773517.78576228.88752125.890796413.04.044.0226.0134.0
    sample_63929.0NaN102NaN73.0103.0104.0105.074.01.0...1.2909940.0000018.00925729.23164225.514702414.03.043.0226.0135.0
    sample_48338.0NaN100NaN62.0102.0103.0104.064.02.0...1.7078250.577359.16515124.61729322.479620409.04.030.0207.0118.0
    sample_61729.0NaN101NaN72.0103.0104.0105.074.02.0...1.7078250.5773517.78576228.88752125.890796413.04.044.0226.0134.0
    \n", + "

    5 rows × 36 columns

    \n", + "
    " + ], + "text/plain": [ + " P1_S1_A6_0C P1_S2_A8_1C P1_S3_A10_2C P1_C1_C0_D P1_C2_C0_D \\\n", + "样本id \n", + "sample_1528 38.0 NaN 100 NaN 62.0 \n", + "sample_1698 29.0 NaN 101 NaN 72.0 \n", + "sample_639 29.0 NaN 102 NaN 73.0 \n", + "sample_483 38.0 NaN 100 NaN 62.0 \n", + "sample_617 29.0 NaN 101 NaN 72.0 \n", + "\n", + " P2_S1_A12_3C P2_S2_A15_4C P2_S3_A17_5C P2_C3_C0_D P2_C3_C2_D \\\n", + "样本id \n", + "sample_1528 102.0 103.0 104.0 64.0 2.0 \n", + "sample_1698 103.0 104.0 105.0 74.0 2.0 \n", + "sample_639 103.0 104.0 105.0 74.0 1.0 \n", + "sample_483 102.0 103.0 104.0 64.0 2.0 \n", + "sample_617 103.0 104.0 105.0 74.0 2.0 \n", + "\n", + " ... P2_C2-C5_std P2_D3-D5_std P2_C1-C12_KD_ABS_std \\\n", + "样本id ... \n", + "sample_1528 ... 1.707825 0.57735 9.643651 \n", + "sample_1698 ... 1.707825 0.57735 17.785762 \n", + "sample_639 ... 1.290994 0.00000 18.009257 \n", + "sample_483 ... 1.707825 0.57735 9.165151 \n", + "sample_617 ... 1.707825 0.57735 17.785762 \n", + "\n", + " P2_C1-C12_D_std P2_LARGE_KD_std P2_C2-C5_sum P2_D3-D5_sum \\\n", + "样本id \n", + "sample_1528 24.928565 23.245071 409.0 4.0 \n", + "sample_1698 28.887521 25.890796 413.0 4.0 \n", + "sample_639 29.231642 25.514702 414.0 3.0 \n", + "sample_483 24.617293 22.479620 409.0 4.0 \n", + "sample_617 28.887521 25.890796 413.0 4.0 \n", + "\n", + " P2_C1-C12_KD_ABS_sum P2_C1-C12_D_sum P2_LARGE_KD_sum \n", + "样本id \n", + "sample_1528 27.0 191.0 113.0 \n", + "sample_1698 44.0 226.0 134.0 \n", + "sample_639 43.0 226.0 135.0 \n", + "sample_483 30.0 207.0 118.0 \n", + "sample_617 44.0 226.0 134.0 \n", + "\n", + "[5 rows x 36 columns]" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_temperature.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 时间相关特征" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "# 时间计算方式转换\n", + "def duration_outer(series1, series2):\n", + " # 处理隔了一天如21:30 - 01:30\n", + " duration = series1 - series2\n", + " duration = np.where(duration < 0, duration + 24*60, duration)\n", + " duration = np.where(duration > 12*60, 24*60 - duration, duration)\n", + " duration = np.where(duration > 6*60, 12*60 - duration, duration)\n", + " return duration" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "raw = df_trn_tst.copy()\n", + "df = pd.DataFrame(raw['样本id'])\n", + "# 加热过程\n", + "df['P1_S1_A5_0T'] = raw['A5_t'] # 初始时刻\n", + "df['P1_S2_A9_2T'] = raw['A9_t'] # 初始时刻\n", + "df['P1_T1_T0_D'] = duration_outer(raw['A7_t'], raw['A5_t'])\n", + "# 初次测温时间差\n", + "df['P1_T2_T1_D'] = duration_outer(raw['A9_t'], raw['A7_t'])\n", + "# 二次测温时间差\n", + "df['P1_T2_T0_K_D'] = duration_outer(raw['A9_t'], raw['A5_t'])\n", + "# 开始加热至沸腾时间差\n", + "\n", + "# 水解过程\n", + "df['P2_S1_A11_3T'] = raw['A11_t'] # 水解开始时刻\n", + "df['P2_S1_A16_5T'] = raw['A16_t'] # 水解结束时刻\n", + "\n", + "df['P2_T3_T0_K_D'] = duration_outer(raw['A11_t'], raw['A5_t'])\n", + "# 开始加热至投料时间差\n", + "df['P2_T3_T2_K_D'] = duration_outer(raw['A11_t'], raw['A9_t'])\n", + "# 恒温至投料投料时间差\n", + "# df['P2_T4_T3_D'] = raw['A14_t'] - raw['A11_t'] # 水解初次测温时间差\n", + "# df['P2_T5_T4_D'] = raw['A16_t'] - raw['A14_t'] # 水解结束时间差\n", + "df['P2_T5_T3_K_D'] = duration_outer(raw['A16_t'], raw['A11_t'])\n", + "# 水解时间差\n", + "\n", + "# 脱色过程\n", + "df['P3_S1_A20_6T'] = raw['A20_at'] # 中和开始时刻\n", + "df['P3_S2_A25_7T'] = raw['A24_t'] # 保温时刻\n", + "\n", + "df['P3_T6_T5_K_D'] = duration_outer(raw['A20_at'], raw['A16_t'])\n", + "# 水解结束至中和间歇时间\n", + "df['P3_T6_T6_K_D'] = duration_outer(raw['A20_bt'], raw['A20_at'])\n", + "# 酸碱度中和时间\n", + "df['P3_T7_T6_D'] = duration_outer(raw['A24_t'], raw['A20_bt'])\n", + "# 中和结束至脱色间歇时间\n", + "df['P3_T8_T7_K_D'] = duration_outer(raw['A26_t'], raw['A24_t'])\n", + "# 脱色保温时间\n", + "df['P3_T9_T8_D'] = duration_outer(raw['A28_at'], raw['A26_t'])\n", + "# 脱色至抽滤间歇时间\n", + "df['P3_T9_T9_K_D'] = duration_outer(raw['A28_bt'], raw['A28_at'])\n", + "# 抽滤时间\n", + "df['P3_T9_T5_1D'] = duration_outer(raw['A28_bt'], raw['A16_t'])\n", + "df['P3_T9_T6_2D'] = duration_outer(raw['A28_bt'], raw['A20_at'])\n", + "# 脱色总时间\n", + "\n", + "# 结晶过程\n", + "df['P4_S1_B4_10T'] = raw['B4_at'] # 酸化开始时刻\n", + "df['P4_S2_B5_11T'] = raw['B5_t'] # 结晶开始时刻\n", + "df['P4_S3_B7_12T'] = raw['B7_t'] # 结晶结束时刻\n", + "\n", + "df['P4_T10_T9_D'] = duration_outer(raw['B4_at'], raw['A28_bt'])\n", + "# 抽滤结束至酸化间歇时间\n", + "df['P4_T10_T10_K_D'] = duration_outer(raw['B4_bt'], raw['B4_at'])\n", + "# 酸化时间\n", + "df['P4_T11_T10_K_D'] = duration_outer(raw['B5_t'], raw['B4_bt'])\n", + "# 酸化至结晶间歇时间\n", + "df['P4_T12_T11_K_D'] = duration_outer(raw['B7_t'], raw['B5_t'])\n", + "# 自然结晶时间\n", + "df['P4_T12_T9_1D'] = duration_outer(raw['B7_t'], raw['A28_bt'])\n", + "df['P4_T12_T10_2D'] = duration_outer(raw['B7_t'], raw['B4_at'])\n", + "# 结晶总时间\n", + "\n", + "# 甩滤过程\n", + "df['P5_S1_B9_13T'] = raw['B9_at'] # 甩滤开始时刻\n", + "df['P5_S3_B12_15T'] = np.where(\n", + " raw['B11_bt'].isnull(),\n", + " np.where(raw['B10_bt'].isnull(), raw['B9_bt'], raw['B10_bt']),\n", + " raw['B11_bt']) # 甩滤结束时刻\n", + "df['P5_T13_T12_D'] = duration_outer(raw['B9_at'], raw['B7_t'])\n", + "# 酸化结束至甩滤间歇时间\n", + "df['P5_T13_T13_K_D'] = duration_outer(raw['B9_bt'], raw['B9_at'])\n", + "# 基本甩滤时间\n", + "df['P5_T14_T13_D'] = duration_outer(raw['B10_at'], raw['B9_bt'])\n", + "# 基本甩滤至补充甩滤1间歇时间\n", + "df['P5_T14_T14_K_D'] = duration_outer(raw['B10_bt'], raw['B10_at'])\n", + "# 补充甩滤1时间\n", + "df['P5_T15_T14_D'] = duration_outer(raw['B11_at'], raw['B10_bt'])\n", + "# 补充甩滤1至补充甩滤2间歇时间\n", + "df['P5_T15_T13_K_D'] = duration_outer(raw['B11_bt'], raw['B11_at'])\n", + "# 补充甩滤2时间\n", + "df['P5_T15_T13_1D'] = \\\n", + " df[['P5_T13_T13_K_D', 'P5_T14_T14_K_D', 'P5_T13_T13_K_D']].sum(axis=1)\n", + "df['P5_T15_T12_2D'] = duration_outer(\n", + " df['P5_S3_B12_15T'], df['P4_S3_B7_12T'])\n", + "df['P5_T15_T12_3D'] = duration_outer(\n", + " df['P5_S3_B12_15T'], df['P5_S1_B9_13T'])\n", + "# 总甩滤时间\n", + "\n", + "# 总流程时长\n", + "df['P5_T15_T1_4D'] = \\\n", + " df[['P5_T15_T12_2D', 'P4_T12_T9_1D', 'P3_T9_T5_1D',\n", + " 'P2_T3_T0_K_D', 'P2_T5_T3_K_D']].sum(axis=1)\n", + "_funcs = ['mean', 'std', 'sum']\n", + "for _func in _funcs:\n", + " df[f'P5__D_{_func}'] = \\\n", + " df[[_f for _f in df.columns if _f.endswith('_D')]].\\\n", + " abs().agg(_func, axis=1)\n", + " df[f'P5_K_D_{_func}'] = \\\n", + " df[[_f for _f in df.columns if _f.endswith('_K_D')]]. \\\n", + " abs().agg(_func, axis=1)\n", + " df[f'P5__D_{_func}'] = \\\n", + " df[[_f for _f in df.columns if _f.endswith('D')]]. \\\n", + " abs().agg(_func, axis=1)\n", + "df_duration = df.set_index('样本id')" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    P1_S1_A5_0TP1_S2_A9_2TP1_T1_T0_DP1_T2_T1_DP1_T2_T0_K_DP2_S1_A11_3TP2_S1_A16_5TP2_T3_T0_K_DP2_T3_T2_K_DP2_T5_T3_K_D...P5_T15_T13_1DP5_T15_T12_2DP5_T15_T12_3DP5_T15_T1_4DP5__D_meanP5_K_D_meanP5__D_stdP5_K_D_stdP5__D_sumP5_K_D_sum
    样本id
    sample_1528810930NaNNaN120990111018060120...270.0240.0240.0840.0145.38461590.000000169.85242563.6396103780.01170.0
    sample_1698840960NaNNaN1201020114018060120...270.0240.0240.0960.0136.07142990.000000188.58811376.2586693810.01260.0
    sample_639840960NaNNaN1201020114018060120...270.0240.0240.0900.0123.21428675.000000173.65469349.5751183450.01050.0
    sample_48390180NaNNaN9024036015060120...270.0300.0240.0990.0158.07692373.846154195.44859646.8220864110.0960.0
    sample_61713200NaNNaN1206018018060120...270.0240.0240.0900.0123.21428677.142857173.84653948.1070243450.01080.0
    \n", + "

    5 rows × 47 columns

    \n", + "
    " + ], + "text/plain": [ + " P1_S1_A5_0T P1_S2_A9_2T P1_T1_T0_D P1_T2_T1_D P1_T2_T0_K_D \\\n", + "样本id \n", + "sample_1528 810 930 NaN NaN 120 \n", + "sample_1698 840 960 NaN NaN 120 \n", + "sample_639 840 960 NaN NaN 120 \n", + "sample_483 90 180 NaN NaN 90 \n", + "sample_617 1320 0 NaN NaN 120 \n", + "\n", + " P2_S1_A11_3T P2_S1_A16_5T P2_T3_T0_K_D P2_T3_T2_K_D \\\n", + "样本id \n", + "sample_1528 990 1110 180 60 \n", + "sample_1698 1020 1140 180 60 \n", + "sample_639 1020 1140 180 60 \n", + "sample_483 240 360 150 60 \n", + "sample_617 60 180 180 60 \n", + "\n", + " P2_T5_T3_K_D ... P5_T15_T13_1D P5_T15_T12_2D P5_T15_T12_3D \\\n", + "样本id ... \n", + "sample_1528 120 ... 270.0 240.0 240.0 \n", + "sample_1698 120 ... 270.0 240.0 240.0 \n", + "sample_639 120 ... 270.0 240.0 240.0 \n", + "sample_483 120 ... 270.0 300.0 240.0 \n", + "sample_617 120 ... 270.0 240.0 240.0 \n", + "\n", + " P5_T15_T1_4D P5__D_mean P5_K_D_mean P5__D_std P5_K_D_std \\\n", + "样本id \n", + "sample_1528 840.0 145.384615 90.000000 169.852425 63.639610 \n", + "sample_1698 960.0 136.071429 90.000000 188.588113 76.258669 \n", + "sample_639 900.0 123.214286 75.000000 173.654693 49.575118 \n", + "sample_483 990.0 158.076923 73.846154 195.448596 46.822086 \n", + "sample_617 900.0 123.214286 77.142857 173.846539 48.107024 \n", + "\n", + " P5__D_sum P5_K_D_sum \n", + "样本id \n", + "sample_1528 3780.0 1170.0 \n", + "sample_1698 3810.0 1260.0 \n", + "sample_639 3450.0 1050.0 \n", + "sample_483 4110.0 960.0 \n", + "sample_617 3450.0 1080.0 \n", + "\n", + "[5 rows x 47 columns]" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_duration.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 水耗相关特征" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "na_value=405\n", + "\n", + "df_trn_tst = df_trn_tst.copy()\n", + "df = pd.DataFrame(raw['样本id'])\n", + "# 耗水\n", + "df['P2_W_1M'] = raw['A4']\n", + "df['P2_W_2M'] = raw['A19']\n", + "# 耗盐酸\n", + "df['P3_H_1M'] = raw['A21'].fillna(50)\n", + "df['P4_H_2M'] = raw['B1'].fillna(320)\n", + "# 氢氧化钠\n", + "df['P2_N_1M'] = raw['A3'].fillna(na_value)\n", + "# 4-氰基吡啶\n", + "df['P2_C_1M'] = raw['A1']\n", + "\n", + "df['P5_W_3M'] = raw['B12'].fillna(1200)\n", + "df['P5_W_1M'] = df['P2_W_1M'] + df['P2_W_2M']\n", + "df['P5_W_3M'] = df['P2_W_1M'] + df['P2_W_2M'] + df['P5_W_3M']\n", + "df['P5_H_1M'] = df['P3_H_1M'] + df['P4_H_2M']\n", + "df['P5_M_0M'] = raw['A1'] + df['P2_N_1M'] + df['P5_W_1M'] + df['P4_H_2M']\n", + "df['P5_M_1M'] = df['P5_M_0M'] + df['P5_W_3M']\n", + "df['P5_M_2M'] = df['P5_M_1M'] + df['P3_H_1M']\n", + "# 理论产出\n", + "df['P5_O_1M'] = raw['B14']\n", + "df['P5_O_5M'] = raw['B14'].replace(418, 420).replace(405, 400).\\\n", + " replace(395, 390).replace(392, 390).replace(387, 380).\\\n", + " replace(385, 380).replace(370, 360).replace(350, 360).\\\n", + " replace(350, 360).replace(340, 360).replace(290, 280).\\\n", + " replace(260, 280).replace(256, 280)\n", + "_fs = [_f for _f in df.columns if _f.endswith('M')]\n", + "for _f in _fs[:-2]:\n", + " df[f'{_f}_P5_O_1M_R'] = df['P5_O_1M'] / df[_f]\n", + " df[f'{_f}_P5_O_5M_R'] = df['P5_O_5M'] / df[_f]\n", + "for i in range(len(_fs[:6])):\n", + " _f, _sub_fs = _fs[i], _fs[(i+1):6]\n", + " for _f_div in _sub_fs:\n", + " df[f'{_f}_{_f_div}_R'] = df[_f] / df[_f_div]\n", + "df_materials = df.set_index('样本id')" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "raw = df_trn_tst.copy()\n", + "df = pd.DataFrame(raw['样本id'])\n", + "df['P5_NOT_NUM_N'] = raw.iloc[:, 1:-1].notnull().sum(axis=1)\n", + "df['P5_PH_1N'] = raw['A22']\n", + "df['P5_PH_2N'] = raw['A23']\n", + "df['P5_PH_2N'] = raw['B2']\n", + "df['P5_A7_1N'] = raw['A7_t'].isnull().astype(int)\n", + "df['P5_O_2M'] = (raw['B14'] <= 360).astype(int)\n", + "df['P5_1_3M'] = raw['B13']\n", + "df_interact = df.set_index('样本id')" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    P5_NOT_NUM_NP5_PH_1NP5_PH_2NP5_A7_1NP5_O_2MP5_1_3M
    样本id
    sample_1528429.03.5100.15
    sample_1698449.03.5100.15
    sample_639449.03.5100.15
    sample_4834210.03.5100.15
    sample_617449.03.5100.15
    \n", + "
    " + ], + "text/plain": [ + " P5_NOT_NUM_N P5_PH_1N P5_PH_2N P5_A7_1N P5_O_2M P5_1_3M\n", + "样本id \n", + "sample_1528 42 9.0 3.5 1 0 0.15\n", + "sample_1698 44 9.0 3.5 1 0 0.15\n", + "sample_639 44 9.0 3.5 1 0 0.15\n", + "sample_483 42 10.0 3.5 1 0 0.15\n", + "sample_617 44 9.0 3.5 1 0 0.15" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_interact.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 合并所有特征" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "df_feature = pd.concat([df_materials,\n", + " df_duration,\n", + " df_temperature,\n", + " df_interact], axis=1).reset_index()" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "df_trn = df_feature.iloc[:len(df_trn)].reset_index(drop=True)\n", + "df_trn['收率'] = df_target\n", + "df_tst = df_feature.iloc[len(df_trn):].reset_index(drop=True)\n", + "df_tst['收率'] = np.nan" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    样本idP2_W_1MP2_W_2MP3_H_1MP4_H_2MP2_N_1MP2_C_1MP5_W_3MP5_W_1MP5_H_1M...P2_C1-C12_KD_ABS_sumP2_C1-C12_D_sumP2_LARGE_KD_sumP5_NOT_NUM_NP5_PH_1NP5_PH_2NP5_A7_1NP5_O_2MP5_1_3M收率
    0sample_152870030050.0350.0405.03001800.01000400.0...27.0191.0113.0429.03.5100.150.879
    1sample_169870020050.0320.0405.03002100.0900370.0...44.0226.0134.0449.03.5100.150.902
    2sample_63970020050.0320.0405.03002100.0900370.0...43.0226.0135.0449.03.5100.150.936
    3sample_48370020050.0290.0405.03001700.0900340.0...30.0207.0118.04210.03.5100.150.902
    4sample_61770020050.0320.0405.03002100.0900370.0...44.0226.0134.0449.03.5100.150.983
    \n", + "

    5 rows × 144 columns

    \n", + "
    " + ], + "text/plain": [ + " 样本id P2_W_1M P2_W_2M P3_H_1M P4_H_2M P2_N_1M P2_C_1M P5_W_3M \\\n", + "0 sample_1528 700 300 50.0 350.0 405.0 300 1800.0 \n", + "1 sample_1698 700 200 50.0 320.0 405.0 300 2100.0 \n", + "2 sample_639 700 200 50.0 320.0 405.0 300 2100.0 \n", + "3 sample_483 700 200 50.0 290.0 405.0 300 1700.0 \n", + "4 sample_617 700 200 50.0 320.0 405.0 300 2100.0 \n", + "\n", + " P5_W_1M P5_H_1M ... P2_C1-C12_KD_ABS_sum P2_C1-C12_D_sum \\\n", + "0 1000 400.0 ... 27.0 191.0 \n", + "1 900 370.0 ... 44.0 226.0 \n", + "2 900 370.0 ... 43.0 226.0 \n", + "3 900 340.0 ... 30.0 207.0 \n", + "4 900 370.0 ... 44.0 226.0 \n", + "\n", + " P2_LARGE_KD_sum P5_NOT_NUM_N P5_PH_1N P5_PH_2N P5_A7_1N P5_O_2M \\\n", + "0 113.0 42 9.0 3.5 1 0 \n", + "1 134.0 44 9.0 3.5 1 0 \n", + "2 135.0 44 9.0 3.5 1 0 \n", + "3 118.0 42 10.0 3.5 1 0 \n", + "4 134.0 44 9.0 3.5 1 0 \n", + "\n", + " P5_1_3M 收率 \n", + "0 0.15 0.879 \n", + "1 0.15 0.902 \n", + "2 0.15 0.936 \n", + "3 0.15 0.902 \n", + "4 0.15 0.983 \n", + "\n", + "[5 rows x 144 columns]" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_trn.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "for _df in [df_trn, df_tst]:\n", + " _df.insert(1, 'id', _df['样本id'].str.split('_').str[1].astype(float))" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    样本ididP2_W_1MP2_W_2MP3_H_1MP4_H_2MP2_N_1MP2_C_1MP5_W_3MP5_W_1M...P2_C1-C12_KD_ABS_sumP2_C1-C12_D_sumP2_LARGE_KD_sumP5_NOT_NUM_NP5_PH_1NP5_PH_2NP5_A7_1NP5_O_2MP5_1_3M收率
    0sample_15281528.070030050.0350.0405.03001800.01000...27.0191.0113.0429.03.5100.150.879
    1sample_16981698.070020050.0320.0405.03002100.0900...44.0226.0134.0449.03.5100.150.902
    2sample_639639.070020050.0320.0405.03002100.0900...43.0226.0135.0449.03.5100.150.936
    3sample_483483.070020050.0290.0405.03001700.0900...30.0207.0118.04210.03.5100.150.902
    4sample_617617.070020050.0320.0405.03002100.0900...44.0226.0134.0449.03.5100.150.983
    \n", + "

    5 rows × 145 columns

    \n", + "
    " + ], + "text/plain": [ + " 样本id id P2_W_1M P2_W_2M P3_H_1M P4_H_2M P2_N_1M P2_C_1M \\\n", + "0 sample_1528 1528.0 700 300 50.0 350.0 405.0 300 \n", + "1 sample_1698 1698.0 700 200 50.0 320.0 405.0 300 \n", + "2 sample_639 639.0 700 200 50.0 320.0 405.0 300 \n", + "3 sample_483 483.0 700 200 50.0 290.0 405.0 300 \n", + "4 sample_617 617.0 700 200 50.0 320.0 405.0 300 \n", + "\n", + " P5_W_3M P5_W_1M ... P2_C1-C12_KD_ABS_sum P2_C1-C12_D_sum \\\n", + "0 1800.0 1000 ... 27.0 191.0 \n", + "1 2100.0 900 ... 44.0 226.0 \n", + "2 2100.0 900 ... 43.0 226.0 \n", + "3 1700.0 900 ... 30.0 207.0 \n", + "4 2100.0 900 ... 44.0 226.0 \n", + "\n", + " P2_LARGE_KD_sum P5_NOT_NUM_N P5_PH_1N P5_PH_2N P5_A7_1N P5_O_2M \\\n", + "0 113.0 42 9.0 3.5 1 0 \n", + "1 134.0 44 9.0 3.5 1 0 \n", + "2 135.0 44 9.0 3.5 1 0 \n", + "3 118.0 42 10.0 3.5 1 0 \n", + "4 134.0 44 9.0 3.5 1 0 \n", + "\n", + " P5_1_3M 收率 \n", + "0 0.15 0.879 \n", + "1 0.15 0.902 \n", + "2 0.15 0.936 \n", + "3 0.15 0.902 \n", + "4 0.15 0.983 \n", + "\n", + "[5 rows x 145 columns]" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_trn.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "df_trn['收率'].plot(kind='hist')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "df_trn = df_trn.query('收率 > 0.8671').reset_index(drop=True) # 筛选常规数据\n", + "df_trn = df_trn.query('收率 < 0.9861').reset_index(drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "df_trn['收率'].plot(kind='hist')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 训练模型" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "def xgb_cv(train, test, params, fit_params, feature_names, nfold, seed):\n", + " \"\"\"\n", + " train训练数据\n", + " test测试数据\n", + " params参数\n", + " fit_params训练参数\n", + " feature_names特征名\n", + " nfold几折交叉\n", + " seed随机种子\n", + " \"\"\"\n", + " # 创建结果df\n", + " train_pred = pd.DataFrame({\n", + " 'id': train['样本id'],\n", + " 'true': train['收率'],\n", + " 'pred': np.zeros(len(train))})\n", + " # 测试提交结果\n", + " test_pred = pd.DataFrame({'id': test['样本id'], 'pred': np.zeros(len(test))})\n", + " # 交叉验证\n", + " kfolder = KFold(n_splits=nfold, shuffle=True, random_state=seed)\n", + " # 构造测试DMatrix\n", + " xgb_tst = xgb.DMatrix(data=test[feature_names])\n", + " print('\\n')\n", + " # 遍历cv中每一折数据,通过索引来指定\n", + " for fold_id, (trn_idx, val_idx) in enumerate(kfolder.split(train['收率'])):\n", + " # 构造当前训练的DMatrix\n", + " xgb_trn = xgb.DMatrix(\n", + " train.iloc[trn_idx][feature_names],\n", + " train.iloc[trn_idx]['收率'])\n", + " # 构造当前验证的DMatrix\n", + " xgb_val = xgb.DMatrix(\n", + " train.iloc[val_idx][feature_names],\n", + " train.iloc[val_idx]['收率'])\n", + " # 训练回归模型\n", + " xgb_reg = xgb.train(params=params, dtrain=xgb_trn, **fit_params,\n", + " evals=[(xgb_trn, 'train'), (xgb_val, 'valid')])\n", + " # 得到验证结果\n", + " val_pred = xgb_reg.predict(\n", + " xgb.DMatrix(train.iloc[val_idx][feature_names]),\n", + " ntree_limit=xgb_reg.best_ntree_limit)\n", + " train_pred.loc[val_idx, 'pred'] = val_pred\n", + " # print(f'Fold_{fold_id}', mse(train.iloc[val_idx]['收率'], val_pred))\n", + " test_pred['pred'] += xgb_reg.predict(\n", + " xgb_tst, ntree_limit=xgb_reg.best_ntree_limit) / nfold\n", + " print('\\nCV LOSS:', mse(train_pred['true'], train_pred['pred']), '\\n')\n", + " return test_pred\n" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "# 设置训练参数\n", + "fit_params = {'num_boost_round': 10800,\n", + " 'verbose_eval': 300,\n", + " 'early_stopping_rounds': 360}\n", + "params_xgb = {'eta': 0.01, 'max_depth': 7, 'subsample': 0.8,\n", + " 'booster': 'gbtree', 'colsample_bytree': 0.8,\n", + " 'objective': 'reg:linear', 'silent': True, 'nthread': 4}" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "[0]\ttrain-rmse:0.42052\tvalid-rmse:0.417952\n", + "Multiple eval metrics have been passed: 'valid-rmse' will be used for early stopping.\n", + "\n", + "Will train until valid-rmse hasn't improved in 360 rounds.\n", + "[300]\ttrain-rmse:0.023717\tvalid-rmse:0.023667\n", + "[600]\ttrain-rmse:0.00645\tvalid-rmse:0.011488\n", + "[900]\ttrain-rmse:0.004691\tvalid-rmse:0.011727\n", + "Stopping. Best iteration:\n", + "[600]\ttrain-rmse:0.00645\tvalid-rmse:0.011488\n", + "\n", + "[0]\ttrain-rmse:0.419812\tvalid-rmse:0.420785\n", + "Multiple eval metrics have been passed: 'valid-rmse' will be used for early stopping.\n", + "\n", + "Will train until valid-rmse hasn't improved in 360 rounds.\n", + "[300]\ttrain-rmse:0.02374\tvalid-rmse:0.025614\n", + "[600]\ttrain-rmse:0.006597\tvalid-rmse:0.01204\n", + "[900]\ttrain-rmse:0.004692\tvalid-rmse:0.01197\n", + "Stopping. Best iteration:\n", + "[810]\ttrain-rmse:0.005159\tvalid-rmse:0.011948\n", + "\n", + "[0]\ttrain-rmse:0.419963\tvalid-rmse:0.420191\n", + "Multiple eval metrics have been passed: 'valid-rmse' will be used for early stopping.\n", + "\n", + "Will train until valid-rmse hasn't improved in 360 rounds.\n", + "[300]\ttrain-rmse:0.023604\tvalid-rmse:0.025064\n", + "[600]\ttrain-rmse:0.006202\tvalid-rmse:0.01245\n", + "[900]\ttrain-rmse:0.004472\tvalid-rmse:0.012215\n", + "[1200]\ttrain-rmse:0.003453\tvalid-rmse:0.012209\n", + "Stopping. Best iteration:\n", + "[1062]\ttrain-rmse:0.003866\tvalid-rmse:0.012199\n", + "\n", + "[0]\ttrain-rmse:0.420254\tvalid-rmse:0.419025\n", + "Multiple eval metrics have been passed: 'valid-rmse' will be used for early stopping.\n", + "\n", + "Will train until valid-rmse hasn't improved in 360 rounds.\n", + "[300]\ttrain-rmse:0.02381\tvalid-rmse:0.024832\n", + "[600]\ttrain-rmse:0.006467\tvalid-rmse:0.010957\n", + "[900]\ttrain-rmse:0.004619\tvalid-rmse:0.010752\n", + "[1200]\ttrain-rmse:0.003542\tvalid-rmse:0.010815\n", + "Stopping. Best iteration:\n", + "[873]\ttrain-rmse:0.004751\tvalid-rmse:0.01075\n", + "\n", + "[0]\ttrain-rmse:0.419487\tvalid-rmse:0.422069\n", + "Multiple eval metrics have been passed: 'valid-rmse' will be used for early stopping.\n", + "\n", + "Will train until valid-rmse hasn't improved in 360 rounds.\n", + "[300]\ttrain-rmse:0.023859\tvalid-rmse:0.024063\n", + "[600]\ttrain-rmse:0.006739\tvalid-rmse:0.0102\n", + "[900]\ttrain-rmse:0.004817\tvalid-rmse:0.010053\n", + "[1200]\ttrain-rmse:0.003709\tvalid-rmse:0.010089\n", + "Stopping. Best iteration:\n", + "[872]\ttrain-rmse:0.004956\tvalid-rmse:0.010047\n", + "\n", + "\n", + "CV LOSS: 0.0001280110217167903 \n", + "\n" + ] + } + ], + "source": [ + "# 开始训练\n", + "pred_xgb_a = xgb_cv(df_trn, df_tst, \n", + " params_xgb, fit_params,\n", + " df_trn.columns.tolist()[1:-1], 5, 0)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "# 得到预测结果\n", + "df_tst_a['收率'] = pred_xgb_a['pred'].values" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    样本idA1A2A3A4A5A6A7A8A9...B6B7B8B9B10B11B12B13B14收率
    0sample_1656300NaN405.07006:00:0029NaNNaN8:00:00...7917:00:004517:00-18:3018:30-20:0020:00-21:0012000.154000.905793
    1sample_1548300NaN405.070012:30:003912:50:0080.014:20:00...6510:00:004512:00-13:0014:00-15:30NaN8000.153850.879575
    2sample_769300NaN405.07006:00:0080NaNNaN8:00:00...8017:00:004517:00-20:00NaNNaN12000.154400.934695
    3sample_1881300NaN405.070022:00:0029NaNNaN0:00:00...809:00:00459:00-10:3010:30-12:0012:00-13:0012000.154000.903490
    4sample_1807300NaN405.070022:00:0030NaNNaN0:00:00...799:00:00459:00-10:3010:30-12:0012:00-13:0012000.154000.928534
    \n", + "

    5 rows × 44 columns

    \n", + "
    " + ], + "text/plain": [ + " 样本id A1 A2 A3 A4 A5 A6 A7 A8 A9 \\\n", + "0 sample_1656 300 NaN 405.0 700 6:00:00 29 NaN NaN 8:00:00 \n", + "1 sample_1548 300 NaN 405.0 700 12:30:00 39 12:50:00 80.0 14:20:00 \n", + "2 sample_769 300 NaN 405.0 700 6:00:00 80 NaN NaN 8:00:00 \n", + "3 sample_1881 300 NaN 405.0 700 22:00:00 29 NaN NaN 0:00:00 \n", + "4 sample_1807 300 NaN 405.0 700 22:00:00 30 NaN NaN 0:00:00 \n", + "\n", + " ... B6 B7 B8 B9 B10 B11 B12 B13 \\\n", + "0 ... 79 17:00:00 45 17:00-18:30 18:30-20:00 20:00-21:00 1200 0.15 \n", + "1 ... 65 10:00:00 45 12:00-13:00 14:00-15:30 NaN 800 0.15 \n", + "2 ... 80 17:00:00 45 17:00-20:00 NaN NaN 1200 0.15 \n", + "3 ... 80 9:00:00 45 9:00-10:30 10:30-12:00 12:00-13:00 1200 0.15 \n", + "4 ... 79 9:00:00 45 9:00-10:30 10:30-12:00 12:00-13:00 1200 0.15 \n", + "\n", + " B14 收率 \n", + "0 400 0.905793 \n", + "1 385 0.879575 \n", + "2 440 0.934695 \n", + "3 400 0.903490 \n", + "4 400 0.928534 \n", + "\n", + "[5 rows x 44 columns]" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_tst_a.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}