{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import datetime\nimport os,sys\nimport numpy as np\nimport pandas as pd\nimport gresearch_crypto\n\nenv = gresearch_crypto.make_env()\niter_test = env.iter_test()\n\n\nclass gresearch_guada():\n    \"\"\"docstring for gresearch_guada\"\"\"\n    def __init__(self):\n        #super(gresearch_guada, self).__init__()\n        ### 训练集\n        self.train = '/kaggle/input/g-research-crypto-forecasting/train.csv'\n        ### 补充训练数据集——（验证集）\n        self.supplemental_train = '/kaggle/input/g-research-crypto-forecasting/supplemental_train.csv'\n        ### 资产信息数据集，包含14个虚拟货币资产\n        self.asset_details = '/kaggle/input/g-research-crypto-forecasting/asset_details.csv'\n        ### 测试数据样例\n        self.example_test = '/kaggle/input/g-research-crypto-forecasting/example_test.csv'\n        #self.env = gresearch_crypto.make_env()\n        #self.iter_test = self.env.iter_test()\n\n    def dataReader(self, datasetName):\n        ### 数据集读取\n        if datasetName == 'train':\n            ### 获取train数据集\n            df = pd.read_csv(self.train, usecols=['Target', 'Asset_ID', 'timestamp'], dtype={'Asset_ID': 'int8'})\n        elif datasetName == 'supplemental_train':\n            ### 获取supplemental_train\n            df = pd.read_csv(self.supplemental_train, usecols=['Target', 'Asset_ID', 'timestamp'], dtype={'Asset_ID': 'int8'})\n        else:\n            print(\"ERROR [1018] - message: 数据集传入参数错误!\")\n        return df\n\n    def dataFillNan(self, train_data, columns, fillType):\n        ## 空缺值填充\n        if fillType == \"0\":\n            ### fixed value fillnan\n            fixed_value = input(\"请输入\" + columns + \"列固定填充值：(eg: 推荐值：\" + str(Counter(train_data[columns]).most_common(3)) + \")：\")\n            #self.logging.info(\"kaggle.\" + sys._getframe().f_code.co_name + \".service Message: 已获取缺失值填充参数：{'缺失值填充方法':'固定值填充','固定值':\" + fixed_value + \"},准备开始缺失值填充......\")\n            train_data[columns].fillna(fixed_value, inplace=True)\n            if train_data[columns].isnull().any():\n                print(\"仍旧有空值\")\n                #self.logging.error(\"kaggle.\" + sys._getframe().f_code.co_name + \".service Message: 数据集列\" + columns +\"缺失值以固定值方式填充失败，请查看原因！\")\n            else:\n                print(\"该列无空值\")\n                #self.logging.info(\"kaggle.\" + sys._getframe().f_code.co_name + \".service Message: 数据集列\" + columns +\"缺失值以固定值方式填充成功！\")\n            return train_data\n        elif fillType == \"1\":\n            ### before value fillnan\n            return \"前值填充法 暂未开放......\"\n        elif fillType == \"2\":\n            ### 中位数填补\n            if train_data[columns].dtypes == 'float64' :\n                train_data[columns].fillna(train_data[columns].median(),inplace=True)\n            else:\n                print(\"该列数据类型不支持中位数填充！\")\n            return train_data\n        elif fillType == \"3\":\n            ## 众数填补法\n            if train_data[columns].dtypes == 'float64' :\n                train_data[columns].fillna(train_data[columns].mode(),inplace=True)\n            else:\n                print(\"该列数据类型不支持众数填充！\")\n                #continue\n            return train_data\n            #train_data[columns].fillna(train_data[columns].mode(),inplace=True)\n        elif fillType == \"4\":\n            ## 回归填补法\n            #self.logging.info(\"kaggle.\" + sys._getframe().f_code.co_name + \".service Message: 已获取缺失值填充参数：{'缺失值填充方法':'回归填充','当前列回归':\" + str(train_data[columns].mode()) + \"},准备开始缺失值填充......\")\n            if train_data[columns].dtypes == 'float64':\n                #self.logging.info(\"kaggle.\" + sys._getframe().f_code.co_name + \".service Message: 已获取缺失值填充参数：{'缺失值填充方法':'回归填补法','填充值':}\")\n                imp = IterativeImputer(max_iter=10, random_state=0)\n                imp.fit(train_data)\n                np.round(imp.transform(train_data))\n            else:\n                print(\"数据类型不支持回归填充法！\")\n                #self.logging.info(\"kaggle.\" + sys._getframe().f_code.co_name + \".service Message: 数据类型不支持回归填充法！（说明*：该方法仅适用于缺失值为定量的数据类型）\")\n        else:\n            ### 其他填充法\n            return \"其他填充法 暂未开放......\"\n\n    def datetimeProc(self, datasetName):\n        ## 数据集时间处理\n        datasetName['datetime'] = pd.to_datetime(datasetName['timestamp'], unit='s')\n        #print(datasetName['datetime'])\n        datasetName = datasetName.set_index('datetime').drop('timestamp', axis=1)\n        datasetName = datasetName[(datasetName.index.year == 2021) & (datasetName.index.month > 5)]\n        #print(datasetName)\n        \n        dfs = {asset_id:datasetName[datasetName['Asset_ID'] == asset_id].resample('1min').interpolate().copy() for asset_id in datasetName['Asset_ID'].unique()}\n        #print(dfs)\n        ## delete $datasetName dataset\n        del datasetName\n        return dfs\n        \n\n## 类实例化\ngresearch_guada = gresearch_guada()\n\n## 读取train.csv\ndf = gresearch_guada.dataReader(\"train\")\n\n## 初步处理datetime字段\ndfs = gresearch_guada.datetimeProc(df)\n\nfor df_test, df_pred in iter_test:\n    print(df_pred)\n    df_test['datetime'] = pd.to_datetime(df_test['timestamp'], unit='s')\n    print(df_test)\n    for _, row in df_test.iterrows():\n        try:\n            df = dfs[row['Asset_ID']]\n            closest_train_sample = df.iloc[df.index.get_loc(row['datetime'], method='nearest')]\n            df_pred.loc[df_pred['row_id'] == row['row_id'], 'Target'] = closest_train_sample['Target']\n        except:\n            df_pred.loc[df_pred['row_id'] == row['row_id'], 'Target'] = 0\n    #df_pred['Target'] = df_pred['Target'].fillna(0)\n    df_pred = gresearch_guada.dataFillNan(df_pred, 'Target', '2')\n    print(df_pred)\n    env.predict(df_pred)\n\n","metadata":{"execution":{"iopub.status.busy":"2021-11-30T05:41:46.156807Z","iopub.execute_input":"2021-11-30T05:41:46.157398Z","iopub.status.idle":"2021-11-30T05:42:42.301445Z","shell.execute_reply.started":"2021-11-30T05:41:46.157305Z","shell.execute_reply":"2021-11-30T05:42:42.300493Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* median fillnan \n* mode fillnan\n* “0” fillnan","metadata":{}}]}