From fe96c5f1be73fb79b1cec812dbf967355323d65d Mon Sep 17 00:00:00 2001 From: workpc Date: Fri, 1 Nov 2024 17:33:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9F=83=E6=A3=AE=E5=93=B2?= =?UTF-8?q?=E4=BB=B7=E6=A0=BC=E9=A2=84=E6=B5=8B=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aisenzhecode/沥青/定性模型数据项12-11.xls | Bin 0 -> 162304 bytes .../沥青/沥青定性模型每日推送-ytj.ipynb | 530 +++++++ .../沥青/沥青定量价格预测每日推送-ytj.ipynb | 913 +++++++++++ aisenzhecode/沥青/沥青数据项.xls | Bin 0 -> 558592 bytes .../液化石油气/液化气价格预测ytj.ipynb | 1240 +++++++++++++++ aisenzhecode/液化石油气/液化气数据.xls | Bin 0 -> 129024 bytes .../石油苯/纯苯价格预测-自定义日期ytj.ipynb | 1210 +++++++++++++++ aisenzhecode/石油苯/纯苯数据项.xls | Bin 0 -> 147968 bytes aisenzhecode/聚合级丙烯/丙烯价格预测yij.ipynb | 1367 +++++++++++++++++ .../聚合级丙烯/丙烯基础数据收集表.xls | Bin 0 -> 190976 bytes 10 files changed, 5260 insertions(+) create mode 100644 aisenzhecode/沥青/定性模型数据项12-11.xls create mode 100644 aisenzhecode/沥青/沥青定性模型每日推送-ytj.ipynb create mode 100644 aisenzhecode/沥青/沥青定量价格预测每日推送-ytj.ipynb create mode 100644 aisenzhecode/沥青/沥青数据项.xls create mode 100644 aisenzhecode/液化石油气/液化气价格预测ytj.ipynb create mode 100644 aisenzhecode/液化石油气/液化气数据.xls create mode 100644 aisenzhecode/石油苯/纯苯价格预测-自定义日期ytj.ipynb create mode 100644 aisenzhecode/石油苯/纯苯数据项.xls create mode 100644 aisenzhecode/聚合级丙烯/丙烯价格预测yij.ipynb create mode 100644 aisenzhecode/聚合级丙烯/丙烯基础数据收集表.xls diff --git a/aisenzhecode/沥青/定性模型数据项12-11.xls b/aisenzhecode/沥青/定性模型数据项12-11.xls new file mode 100644 index 0000000000000000000000000000000000000000..b7737a5250f2717ab458c92c5ce9e263792edf3a GIT binary patch literal 162304 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 w8kuQip^=qFHX7M!T zp+R4<2rEW|9_STDAGC(i2T5VHs1Kuu>4ni{br?O$CX5~^9Y!sR!Ya^snZ_$LD$=M# zqcV*uG^)~wpizxRbs9Bj)TBWzFvDuos6!)?#;Y{y(x^wHK8*%68q#P)qcM#pG@8q_O%%brcjn`?sLE}vtZ_#+0#%vmMXuLyXE{%CK=F@nW#sV4( zX)L0#n8tfFme5#A<9!;-Xe_6(g2o3lR?=8SV>OL6G(M!Umc}|7AJJG(V*`ziG&a%r zn8qhGHq-c&#ugf%(fFLkRvKT>*hXVJjW22Jps|z2E*iUOd_`jqjlDF!rm>I4ei{d8 zd_&_~8sE`4NaK4NKhQWt<1mdMX&j+(l*Ta{KhZc&;{=V9G)~btP2*=8XK4IF<5wDI zX`G{Rp2lx9ey4GP#zh)`(D;+aB^sA${6*smjjJ@S(fFIjbs9Hl+@x`f#%&sRX#7Lt zE{%IM{-trB#seA;X*{Cwn8p(tPiZ`(5%vQ8KN_)U&|_7@=(0F0E{%9J;?qb#BO#4M zG!oNDLgPgmNogdbk(@?2jTAIe(nv+)B^s$|q@j_PMmieQuqG@6jf^xh(a20A3yrKa zveC#+BL|I~G;-0%O(PGDyfpIB$WNmHje;}^(I`x#2#umN=%G1b#c7nFQIbX}8l`EJ zq4D(Dvu95{1ONa3{l~ut8qt}gADua}(wVO>{qKQ%#=ybx-~A^w9Wl|rk#_li^&h+r z(f_bH=>zHP)`@fUiZ1`x|2qX8z0p4Y_kaC=*gw{P{ZC`~hyTBQ@Ak*=yZ@X2`v1!R EKf2J8x&QzG literal 0 HcmV?d00001 diff --git a/aisenzhecode/沥青/沥青定性模型每日推送-ytj.ipynb b/aisenzhecode/沥青/沥青定性模型每日推送-ytj.ipynb new file mode 100644 index 0000000..24d8db5 --- /dev/null +++ b/aisenzhecode/沥青/沥青定性模型每日推送-ytj.ipynb @@ -0,0 +1,530 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "import json\n", + "import xlrd\n", + "import xlwt\n", + "from datetime import datetime, timedelta \n", + "import time\n", + "import pandas as pd\n", + "import numpy as np\n", + "# 变量定义\n", + "login_url = \"http://10.200.32.39/jingbo-api/api/server/login\"\n", + "search_url = \"http://10.200.32.39/jingbo-api/api/warehouse/dwDataItem/queryByItemNos\"\n", + "\n", + "login_push_url = \"http://10.200.32.39/jingbo-api/api/server/login\"\n", + "upload_url = \"http://10.200.32.39/jingbo-api/api/dw/dataValue/pushDataValueList\"\n", + "\n", + "login_data = {\n", + " \"data\": {\n", + " \"account\": \"api_dev\",\n", + " \"password\": \"ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U=\",\n", + " \"tenantHashCode\": \"8a4577dbd919675758d57999a1e891fe\",\n", + " \"terminal\": \"API\"\n", + " },\n", + " \"funcModule\": \"API\",\n", + " \"funcOperation\": \"获取token\"\n", + "}\n", + "\n", + "login_push_data = {\n", + " \"data\": {\n", + " \"account\": \"api_dev\",\n", + " \"password\": \"ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U=\",\n", + " \"tenantHashCode\": \"8a4577dbd919675758d57999a1e891fe\",\n", + " \"terminal\": \"API\"\n", + " },\n", + " \"funcModule\": \"API\",\n", + " \"funcOperation\": \"获取token\"\n", + "}\n", + "\n", + "read_file_path_name = \"定性模型数据项12-11.xls\"\n", + "one_cols = []\n", + "two_cols = []\n", + "\n", + "\n", + "\n", + "\n", + "def start(date=''):\n", + " workbook = xlrd.open_workbook(read_file_path_name)\n", + "\n", + "\n", + "\n", + " # 选择第一个表格\n", + " sheet = workbook.sheet_by_index(0)\n", + "\n", + " # 获取行数和列数\n", + " num_rows = sheet.nrows\n", + "\n", + "\n", + "\n", + " row_data = sheet.row_values(1)\n", + " one_cols = row_data\n", + "\n", + "\n", + " login_res = requests.post(url=login_url, json=login_data, timeout=(3, 5))\n", + " text = json.loads(login_res.text)\n", + " if text[\"status\"]:\n", + " token = text[\"data\"][\"accessToken\"]\n", + " else:\n", + " print(\"获取认证失败\")\n", + " token = None\n", + "\n", + " if date == '':\n", + " now = datetime.now()\n", + " else:\n", + " now = date\n", + " year = now.year\n", + " month = now.month\n", + " day = now.day\n", + "\n", + " if month < 10:\n", + " month = \"0\" + str(month)\n", + " if day < 10:\n", + " day = \"0\" + str(day)\n", + " cur_time = str(year) + str(month) + str(day)\n", + " cur_time2 = str(year) + \"-\" + str(month) + \"-\" + str(day)\n", + " search_data = {\n", + " \"data\": {\n", + " \"date\": cur_time,\n", + " \"dataItemNoList\": one_cols[1:]\n", + " },\n", + " \"funcModule\": \"数据项\",\n", + " \"funcOperation\": \"查询\"\n", + " }\n", + " headers = {\"Authorization\": token}\n", + " search_res = requests.post(url=search_url, headers=headers, json=search_data, timeout=(3, 5))\n", + " search_value = json.loads(search_res.text)[\"data\"]\n", + "# datas = search_value\n", + " if search_value:\n", + " datas = search_value\n", + " else :\n", + " datas = None\n", + " \n", + "\n", + " append_rows = [cur_time2]\n", + " dataItemNo_dataValue = {}\n", + "# for data_value in datas:\n", + "# dataItemNo_dataValue[data_value[\"dataItemNo\"]] = data_value[\"dataValue\"]\n", + " for data_value in datas:\n", + " if \"dataValue\" not in data_value:\n", + " print(data_value)\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = \"\"\n", + " else:\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = data_value[\"dataValue\"]\n", + " for value in one_cols[1:]:\n", + " if value in dataItemNo_dataValue:\n", + " append_rows.append(dataItemNo_dataValue[value])\n", + " else:\n", + " append_rows.append(\"\")\n", + "\n", + " workbook = xlrd.open_workbook('定性模型数据项12-11.xls')\n", + "\n", + " # 获取所有sheet的个数\n", + " sheet_count = len(workbook.sheet_names())\n", + "\n", + " # 获取所有sheet的名称\n", + " sheet_names = workbook.sheet_names()\n", + "\n", + " new_workbook = xlwt.Workbook()\n", + " for i in range(sheet_count):\n", + " # 获取当前sheet\n", + " sheet = workbook.sheet_by_index(i)\n", + "\n", + " # 获取sheet的行数和列数\n", + " row_count = sheet.nrows\n", + " col_count = sheet.ncols\n", + " # 获取原有数据\n", + " data = []\n", + " for row in range(row_count):\n", + " row_data = []\n", + " for col in range(col_count):\n", + " row_data.append(sheet.cell_value(row, col))\n", + " data.append(row_data)\n", + " # 创建xlwt的Workbook对象\n", + " # 创建sheet\n", + " new_sheet = new_workbook.add_sheet(sheet_names[i])\n", + "\n", + " # 将原有的数据写入新的sheet\n", + " for row in range(row_count):\n", + " for col in range(col_count):\n", + " new_sheet.write(row, col, data[row][col])\n", + "\n", + " if i == 0:\n", + " # 在新的sheet中添加数据\n", + " for col in range(col_count):\n", + " new_sheet.write(row_count, col, append_rows[col])\n", + "\n", + " # 保存新的xls文件\n", + " new_workbook.save(\"定性模型数据项12-11.xls\")\n", + "\n", + " df = pd.read_excel('定性模型数据项12-11.xls')\n", + " df=df.fillna(df.ffill())\n", + " df1 = df[-2:].reset_index()\n", + " if df1.loc[1,'70号沥青开工率'] > 0.3:\n", + " a = (df1.loc[1,'70号沥青开工率']-0.2)*5/0.1\n", + " else :\n", + " a = 0\n", + " b = df1.loc[1,'资金因素']\n", + " if df1.loc[1,'昨日计划提货偏差']>0:\n", + " c = df1.loc[1,'昨日计划提货偏差']*10/2000\n", + " else :\n", + " c = df1.loc[1,'昨日计划提货偏差']*10/3000\n", + " d = df1.loc[1,'生产情况']\n", + " if df1.loc[1,'基质沥青库存']/265007 >0.8:\n", + " e = (df1.loc[1,'基质沥青库存'] - df1.loc[0,'基质沥青库存'])*10/-5000\n", + " else : \n", + " e = 0\n", + " f = df1.loc[1,'下游客户价格预期']\n", + " if abs(df1.loc[1,'即期成本'] - df1.loc[0,'即期成本'])>=100:\n", + " g = (df1.loc[1,'即期成本'] - df1.loc[0,'即期成本'])*50/100\n", + " else :\n", + " g = 0\n", + " h = df1.loc[1,'订单结构']\n", + " x = round(0.08*a+0*b+0.15*c+0.08*d +0.03*e +0.08*f +0.4*g+0.18*h+df1.loc[0,'京博指导价'],2)\n", + "\n", + "\n", + " login_res1 = requests.post(url=login_push_url, json=login_push_data, timeout=(3, 5))\n", + " text1 = json.loads(login_res1.text)\n", + " token_push = text1[\"data\"][\"accessToken\"]\n", + "\n", + "\n", + " data1 = {\n", + " \"funcModule\": \"数据表信息列表\",\n", + " \"funcOperation\": \"新增\",\n", + " \"data\": [\n", + " {\"dataItemNo\": \"C01100036|Forecast_Price|DX|ACN\",\n", + " \"dataDate\": cur_time,\n", + " \"dataStatus\": \"add\",\n", + " \"dataValue\": x\n", + " }\n", + "\n", + " ]\n", + " }\n", + " headers1 = {\"Authorization\": token_push}\n", + " res = requests.post(url=upload_url, headers=headers1, json=data1, timeout=(3, 5))\n", + " \n", + " \n", + " \n", + " \n", + "def start_1():\n", + " workbook = xlrd.open_workbook(read_file_path_name)\n", + "\n", + "\n", + "\n", + " # 选择第一个表格\n", + " sheet = workbook.sheet_by_index(0)\n", + "\n", + " # 获取行数和列数\n", + " num_rows = sheet.nrows\n", + "\n", + "\n", + "\n", + " row_data = sheet.row_values(1)\n", + " one_cols = row_data\n", + "\n", + "\n", + " login_res = requests.post(url=login_url, json=login_data, timeout=(3, 5))\n", + " text = json.loads(login_res.text)\n", + " if text[\"status\"]:\n", + " token = text[\"data\"][\"accessToken\"]\n", + " else:\n", + " print(\"获取认证失败\")\n", + " token = None\n", + "\n", + "\n", + " now = datetime.now() - timedelta(days=1) \n", + " year = now.year\n", + " month = now.month\n", + " day = now.day\n", + "\n", + " if month < 10:\n", + " month = \"0\" + str(month)\n", + " if day < 10:\n", + " day = \"0\" + str(day)\n", + " cur_time = str(year) + str(month) + str(day)\n", + " cur_time2 = str(year) + \"-\" + str(month) + \"-\" + str(day)\n", + " search_data = {\n", + " \"data\": {\n", + " \"date\": cur_time,\n", + " \"dataItemNoList\": one_cols[1:]\n", + " },\n", + " \"funcModule\": \"数据项\",\n", + " \"funcOperation\": \"查询\"\n", + " }\n", + " headers = {\"Authorization\": token}\n", + " search_res = requests.post(url=search_url, headers=headers, json=search_data, timeout=(3, 5))\n", + " search_value = json.loads(search_res.text)[\"data\"]\n", + "# datas = search_value\n", + " if search_value:\n", + " datas = search_value\n", + " else :\n", + " datas = None\n", + " \n", + " \n", + "\n", + " append_rows = [cur_time2]\n", + " dataItemNo_dataValue = {}\n", + "# for data_value in datas:\n", + "# dataItemNo_dataValue[data_value[\"dataItemNo\"]] = data_value[\"dataValue\"]\n", + " for data_value in datas:\n", + " if \"dataValue\" not in data_value:\n", + " print(data_value)\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = \"\"\n", + " else:\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = data_value[\"dataValue\"]\n", + " for value in one_cols[1:]:\n", + " if value in dataItemNo_dataValue:\n", + " append_rows.append(dataItemNo_dataValue[value])\n", + " else:\n", + " append_rows.append(\"\")\n", + "\n", + " workbook = xlrd.open_workbook('定性模型数据项12-11.xls')\n", + "\n", + " # 获取所有sheet的个数\n", + " sheet_count = len(workbook.sheet_names())\n", + "\n", + " # 获取所有sheet的名称\n", + " sheet_names = workbook.sheet_names()\n", + "\n", + " new_workbook = xlwt.Workbook()\n", + " for i in range(sheet_count):\n", + " # 获取当前sheet\n", + " sheet = workbook.sheet_by_index(i)\n", + "\n", + " # 获取sheet的行数和列数\n", + " row_count = sheet.nrows - 1\n", + " col_count = sheet.ncols\n", + " # 获取原有数据\n", + " data = []\n", + " for row in range(row_count):\n", + " row_data = []\n", + " for col in range(col_count):\n", + " row_data.append(sheet.cell_value(row, col))\n", + " data.append(row_data)\n", + " # 创建xlwt的Workbook对象\n", + " # 创建sheet\n", + " new_sheet = new_workbook.add_sheet(sheet_names[i])\n", + "\n", + " # 将原有的数据写入新的sheet\n", + " for row in range(row_count):\n", + " for col in range(col_count):\n", + " new_sheet.write(row, col, data[row][col])\n", + "\n", + " if i == 0:\n", + " # 在新的sheet中添加数据\n", + " for col in range(col_count):\n", + " new_sheet.write(row_count, col, append_rows[col])\n", + "\n", + " # 保存新的xls文件\n", + " new_workbook.save(\"定性模型数据项12-11.xls\")\n", + "\n", + "\n", + "def start_2(date):\n", + " workbook = xlrd.open_workbook(read_file_path_name)\n", + "\n", + "\n", + "\n", + " # 选择第一个表格\n", + " sheet = workbook.sheet_by_index(0)\n", + "\n", + " # 获取行数和列数\n", + " num_rows = sheet.nrows\n", + "\n", + "\n", + "\n", + " row_data = sheet.row_values(1)\n", + " one_cols = row_data\n", + "\n", + "\n", + " login_res = requests.post(url=login_url, json=login_data, timeout=(3, 5))\n", + " text = json.loads(login_res.text)\n", + " if text[\"status\"]:\n", + " token = text[\"data\"][\"accessToken\"]\n", + " else:\n", + " print(\"获取认证失败\")\n", + " token = None\n", + "\n", + "\n", + " now = date\n", + " year = now.year\n", + " month = now.month\n", + " day = now.day\n", + "\n", + " if month < 10:\n", + " month = \"0\" + str(month)\n", + " if day < 10:\n", + " day = \"0\" + str(day)\n", + " cur_time = str(year) + str(month) + str(day)\n", + " cur_time2 = str(year) + \"-\" + str(month) + \"-\" + str(day)\n", + " search_data = {\n", + " \"data\": {\n", + " \"date\": cur_time,\n", + " \"dataItemNoList\": one_cols[1:]\n", + " },\n", + " \"funcModule\": \"数据项\",\n", + " \"funcOperation\": \"查询\"\n", + " }\n", + " headers = {\"Authorization\": token}\n", + " search_res = requests.post(url=search_url, headers=headers, json=search_data, timeout=(3, 5))\n", + " search_value = json.loads(search_res.text)[\"data\"]\n", + "# datas = search_value\n", + " if search_value:\n", + " datas = search_value\n", + " else :\n", + " datas = None\n", + " \n", + "\n", + " append_rows = [cur_time2]\n", + " dataItemNo_dataValue = {}\n", + "# for data_value in datas:\n", + "# dataItemNo_dataValue[data_value[\"dataItemNo\"]] = data_value[\"dataValue\"]\n", + " for data_value in datas:\n", + " if \"dataValue\" not in data_value:\n", + " print(data_value)\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = \"\"\n", + " else:\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = data_value[\"dataValue\"]\n", + " for value in one_cols[1:]:\n", + " if value in dataItemNo_dataValue:\n", + " append_rows.append(dataItemNo_dataValue[value])\n", + " else:\n", + " append_rows.append(\"\")\n", + "\n", + " workbook = xlrd.open_workbook('定性模型数据项12-11.xls')\n", + "\n", + " # 获取所有sheet的个数\n", + " sheet_count = len(workbook.sheet_names())\n", + "\n", + " # 获取所有sheet的名称\n", + " sheet_names = workbook.sheet_names()\n", + "\n", + " new_workbook = xlwt.Workbook()\n", + " for i in range(sheet_count):\n", + " # 获取当前sheet\n", + " sheet = workbook.sheet_by_index(i)\n", + "\n", + " # 获取sheet的行数和列数\n", + " row_count = sheet.nrows\n", + " col_count = sheet.ncols\n", + " # 获取原有数据\n", + " data = []\n", + " for row in range(row_count):\n", + " row_data = []\n", + " for col in range(col_count):\n", + " row_data.append(sheet.cell_value(row, col))\n", + " data.append(row_data)\n", + " # 创建xlwt的Workbook对象\n", + " # 创建sheet\n", + " new_sheet = new_workbook.add_sheet(sheet_names[i])\n", + "\n", + " # 将原有的数据写入新的sheet\n", + " for row in range(row_count):\n", + " for col in range(col_count):\n", + " new_sheet.write(row, col, data[row][col])\n", + "\n", + " if i == 0:\n", + " # 在新的sheet中添加数据\n", + " for col in range(col_count):\n", + " new_sheet.write(row_count, col, append_rows[col])\n", + "\n", + " # 保存新的xls文件\n", + " new_workbook.save(\"定性模型数据项12-11.xls\")\n", + " print('关闭文件')\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "if __name__ == \"__main__\":\n", + " pass\n", + " # 需要单独运行放开\n", + " \n", + " # start_1()\n", + "\n", + " # 每天定时12点运行\n", + " # while True:\n", + " # # 获取当前时间\n", + " # current_time = time.strftime(\"%H:%M:%S\", time.localtime())\n", + " # current_time_1 = time.strftime(\"%H:%M:%S\", time.localtime())\n", + "\n", + " # # 判断当前时间是否为执行任务的时间点\n", + " # if current_time == \"12:00:00\":\n", + " # print(\"执行定时任务\")\n", + " # start()\n", + "\n", + " # # 休眠1秒钟,避免过多占用CPU资源\n", + " # time.sleep(1)\n", + " \n", + " # elif current_time_1 == \"20:00:00\":\n", + " # print(\"更新数据\")\n", + " # start_1()\n", + " # time.sleep(1)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20241031\n", + "20241101\n" + ] + } + ], + "source": [ + "from datetime import datetime, timedelta\n", + "\n", + "start_date = datetime(2024, 10, 31)\n", + "end_date = datetime(2024, 11, 2)\n", + "\n", + "while start_date < end_date:\n", + " print(start_date.strftime('%Y%m%d'))\n", + " start(start_date)\n", + " start_date += timedelta(days=1)\n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "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.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/aisenzhecode/沥青/沥青定量价格预测每日推送-ytj.ipynb b/aisenzhecode/沥青/沥青定量价格预测每日推送-ytj.ipynb new file mode 100644 index 0000000..c0e6d0e --- /dev/null +++ b/aisenzhecode/沥青/沥青定量价格预测每日推送-ytj.ipynb @@ -0,0 +1,913 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + " \n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import requests\n", + "import json\n", + "import xlrd\n", + "import xlwt\n", + "from datetime import datetime\n", + "import time\n", + "# 变量定义\n", + "login_url = \"http://10.200.32.39/jingbo-api/api/server/login\"\n", + "search_url = \"http://10.200.32.39/jingbo-api/api/warehouse/dwDataItem/queryByItemNos\"\n", + "\n", + "login_push_url = \"http://10.200.32.39/jingbo-api/api/server/login\"\n", + "upload_url = \"http://10.200.32.39/jingbo-api/api/dw/dataValue/pushDataValueList\"\n", + "\n", + "login_data = {\n", + " \"data\": {\n", + " \"account\": \"api_dev\",\n", + " \"password\": \"ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U=\",\n", + " \"tenantHashCode\": \"8a4577dbd919675758d57999a1e891fe\",\n", + " \"terminal\": \"API\"\n", + " },\n", + " \"funcModule\": \"API\",\n", + " \"funcOperation\": \"获取token\"\n", + "}\n", + "\n", + "login_push_data = {\n", + " \"data\": {\n", + " \"account\": \"api_dev\",\n", + " \"password\": \"ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U=\",\n", + " \"tenantHashCode\": \"8a4577dbd919675758d57999a1e891fe\",\n", + " \"terminal\": \"API\"\n", + " },\n", + " \"funcModule\": \"API\",\n", + " \"funcOperation\": \"获取token\"\n", + "}\n", + "\n", + "read_file_path_name = \"沥青数据项.xls\"\n", + "one_cols = []\n", + "two_cols = []\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sn\n", + "import random\n", + "import time\n", + "\n", + "\n", + "\n", + "\n", + "from plotly import __version__\n", + "from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot\n", + "\n", + "from sklearn import preprocessing\n", + "\n", + "from pandas import Series,DataFrame\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import sklearn.datasets as datasets\n", + "\n", + "#导入机器学习算法模型\n", + "from sklearn.linear_model import Lasso\n", + "from xgboost import XGBRegressor\n", + "\n", + "import datetime\n", + "import statsmodels.api as sm\n", + "# from keras.preprocessing.sequence import TimeseriesGenerator\n", + "from tensorflow.keras.preprocessing.sequence import TimeseriesGenerator\n", + "\n", + "import plotly.express as px\n", + "import plotly.graph_objects as go\n", + "\n", + "import xgboost as xgb\n", + "from xgboost import plot_importance, plot_tree\n", + "from sklearn.metrics import mean_absolute_error\n", + "from statsmodels.tools.eval_measures import mse,rmse\n", + "from sklearn.model_selection import GridSearchCV\n", + "from xgboost import XGBRegressor\n", + "import warnings\n", + "import pickle\n", + "\n", + "from sklearn.metrics import mean_squared_error\n", + "\n", + "#切割训练数据和样本数据\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "#用于模型评分\n", + "from sklearn.metrics import r2_score\n", + "\n", + "le = preprocessing.LabelEncoder()\n", + "\n", + "# print(__version__) # requires version >= 1.9.0\n", + "\n", + "\n", + "import cufflinks as cf\n", + "cf.go_offline()\n", + "\n", + "random.seed(100)\n", + "\n", + "%matplotlib inline\n", + "\n", + "# 数据获取\n", + "\n", + "def get_head_auth():\n", + " login_res = requests.post(url=login_url, json=login_data, timeout=(3, 5))\n", + " text = json.loads(login_res.text)\n", + " if text[\"status\"]:\n", + " token = text[\"data\"][\"accessToken\"]\n", + " return token\n", + " else:\n", + " print(\"获取认证失败\")\n", + " return None\n", + "\n", + "\n", + "def get_data_value(token, dataItemNoList,date=''):\n", + "\n", + " search_data = {\n", + " \"data\": {\n", + " \"date\": get_cur_time(date)[0],\n", + " \"dataItemNoList\": dataItemNoList\n", + " },\n", + " \"funcModule\": \"数据项\",\n", + " \"funcOperation\": \"查询\"\n", + " }\n", + " headers = {\"Authorization\": token}\n", + " search_res = requests.post(url=search_url, headers=headers, json=search_data, timeout=(3, 5))\n", + " search_value = json.loads(search_res.text)[\"data\"]\n", + " if search_value:\n", + " return search_value\n", + " else:\n", + " print(\"今天没有新数据\")\n", + " return None\n", + "\n", + "\n", + "# xls文件处理\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "def write_xls(data,date):\n", + " # 创建一个Workbook对象\n", + " workbook = xlwt.Workbook()\n", + "\n", + " # 创建一个Sheet对象,可指定名称\n", + " sheet = workbook.load('Sheet1')\n", + "\n", + " # 写入数据行\n", + " for row_index, row_data in enumerate(data):\n", + " for col_index, cell_data in enumerate(row_data):\n", + " sheet.write(row_index, col_index, cell_data)\n", + "\n", + " # 保存Workbook到文件\n", + " workbook.save(get_cur_time(date)[0] + '.xls')\n", + "\n", + "\n", + "def get_cur_time(date = ''):\n", + " if date == '':\n", + " import datetime\n", + " now = datetime.datetime.now()\n", + " else:\n", + " now = date\n", + " year = now.year\n", + " month = now.month\n", + " day = now.day\n", + "\n", + " if month < 10:\n", + " month = \"0\" + str(month)\n", + " if day < 10:\n", + " day = \"0\" + str(day)\n", + " cur_time = str(year) + str(month) + str(day)\n", + " cur_time2 = str(year) + \"-\" + str(month) + \"-\" + str(day)\n", + "# cur_time = '20231007'\n", + "# cur_time2 = '2023-10-07'\n", + " return cur_time, cur_time2\n", + "\n", + "\n", + "def get_head_push_auth():\n", + " login_res = requests.post(url=login_push_url, json=login_push_data, timeout=(3, 5))\n", + " text = json.loads(login_res.text)\n", + " if text[\"status\"]:\n", + " token = text[\"data\"][\"accessToken\"]\n", + " return token\n", + " else:\n", + " print(\"获取认证失败\")\n", + " return None\n", + "\n", + "\n", + "\n", + "def upload_data_to_system(token_push,date):\n", + " data = {\n", + " \"funcModule\": \"数据表信息列表\",\n", + " \"funcOperation\": \"新增\",\n", + " \"data\": [\n", + " {\"dataItemNo\": \"C01100036|Forecast_Price|ACN\",\n", + " \"dataDate\": get_cur_time(date)[0],\n", + " \"dataStatus\": \"add\",\n", + " \"dataValue\": forecast_price()\n", + " }\n", + "\n", + " ]\n", + " }\n", + " headers = {\"Authorization\": token_push}\n", + " res = requests.post(url=upload_url, headers=headers, json=data, timeout=(3, 5))\n", + " print(res.text)\n", + "\n", + " \n", + "# def upload_data_to_system(token):\n", + "# data = {\n", + "# \"funcModule\": \"数据表信息列表\",\n", + "# \"funcOperation\": \"新增\",\n", + "# \"data\": [\n", + "# {\"dataItemNo\": \"C01100036|Forecast_ Price|ACN\",\n", + "# \"dataDate\": '20230706',\n", + "# \"dataStatus\": \"add\",\n", + "# \"dataValue\": 3780.0\n", + "# }\n", + "\n", + "# ]\n", + "# }\n", + "# headers = {\"Authorization\": token}\n", + "# res = requests.post(url=upload_url, headers=headers, json=data, timeout=(3, 5))\n", + "# print(res.text)\n", + "\n", + "def forecast_price():\n", + " df_test = pd.read_excel('沥青数据项.xls',sheet_name='数据项历史数据')\n", + " df_test.drop([0],inplace=True)\n", + " df_test[['汽油执行价','柴油执行价','齐鲁石化销量','齐鲁石化产量','齐鲁石化成交价','齐鲁石化库存','科力达销量',\n", + " '科力达产量','科力达成交价','科力达库存','弘润销量','弘润产量','弘润成交价','弘润库存','市场成交价','京博指导价',\n", + " '布伦特上周收盘价','布伦特昨日收盘价','布伦特收盘价','上期所沥青主力合约','隆重资讯沥青日开工率','隆重资讯沥青月库存',\n", + " '隆重资讯沥青月产量','隆重资讯沥青表观消费量','隆重资讯社会库存率','厂区库容','京博提货量','即期成本','异地库库存',\n", + " '京博签单量','京博库存量','京博产量','加权平均成交价']] = df_test[['汽油执行价','柴油执行价','齐鲁石化销量',\n", + " '齐鲁石化产量','齐鲁石化成交价','齐鲁石化库存','科力达销量',\n", + " '科力达产量','科力达成交价','科力达库存','弘润销量','弘润产量','弘润成交价','弘润库存','市场成交价','京博指导价',\n", + " '布伦特上周收盘价','布伦特昨日收盘价','布伦特收盘价','上期所沥青主力合约','隆重资讯沥青日开工率','隆重资讯沥青月库存',\n", + " '隆重资讯沥青月产量','隆重资讯沥青表观消费量','隆重资讯社会库存率','厂区库容','京博提货量','即期成本','异地库库存',\n", + " '京博签单量','京博库存量','京博产量','加权平均成交价']].astype('float')\n", + " # df_test['日期']=pd.to_datetime(df_test['日期'], format='%d/%m/%Y',infer_datetime_format=True)\n", + " df_test['日期']=pd.to_datetime(df_test['日期'], format='%Y-%m-%d',infer_datetime_format=True)\n", + "\n", + " #查看每个特征缺失值数量\n", + " MisVal_Check=df_test.isnull().sum().sort_values(ascending=False)\n", + " #去掉缺失值百分比>0.4的特征,去掉这些特征后的新表格命名为df_test_1\n", + " df_MisVal_Check = pd.DataFrame(MisVal_Check,)#\n", + " df_MisVal_Check_1=df_MisVal_Check.reset_index()\n", + " df_MisVal_Check_1.columns=['Variable_Name','Missing_Number'] \n", + " df_MisVal_Check_1['Missing_Number']=df_MisVal_Check_1['Missing_Number']/len(df_test)\n", + " df_test_1=df_test.drop(df_MisVal_Check_1[df_MisVal_Check_1['Missing_Number']>0.4].Variable_Name,axis = 1)\n", + "\n", + " #将缺失值补为前一个或者后一个数值\n", + " df_test_1=df_test_1.fillna(df_test.ffill())\n", + " df_test_1=df_test_1.fillna(df_test_1.bfill())\n", + "\n", + " # 选择用于模型训练的列名称\n", + " col_for_training = df_test_1.columns\n", + " import joblib\n", + " Best_model_DalyLGPrice = joblib.load(\"日度价格预测_最佳模型.pkl\")\n", + " # 最新的一天为最后一行的数据\n", + " df_test_1_Day = df_test_1.tail(1)\n", + " # 移除不需要的列\n", + " df_test_1_Day.index = df_test_1_Day[\"日期\"]\n", + " df_test_1_Day = df_test_1_Day.drop([\"日期\"], axis= 1)\n", + " df_test_1_Day=df_test_1_Day.drop('京博指导价',axis=1)\n", + " df_test_1_Day=df_test_1_Day.dropna()\n", + "\n", + " # df_test_1_Day\n", + " #预测今日价格,显示至小数点后两位\n", + " Ypredict_Today=Best_model_DalyLGPrice.predict(df_test_1_Day)\n", + "\n", + " df_test_1_Day['日度预测价格']=Ypredict_Today\n", + " print(df_test_1_Day['日度预测价格'])\n", + " a = df_test_1_Day['日度预测价格']\n", + " a = a[0]\n", + " a = float(a)\n", + " a = round(a,2)\n", + " return a\n", + "def optimize_Model():\n", + " from sklearn.model_selection import train_test_split\n", + " from sklearn.impute import SimpleImputer\n", + " from sklearn.preprocessing import OrdinalEncoder\n", + " from sklearn.feature_selection import SelectFromModel\n", + " from sklearn.metrics import mean_squared_error, r2_score\n", + "\n", + " pd.set_option('display.max_rows',40) \n", + " pd.set_option('display.max_columns',40) \n", + " df_test = pd.read_excel('沥青数据项.xls',sheet_name='数据项历史数据')\n", + " df_test.drop([0],inplace=True)\n", + " df_test[['汽油执行价','柴油执行价','齐鲁石化销量','齐鲁石化产量','齐鲁石化成交价','齐鲁石化库存','科力达销量',\n", + " '科力达产量','科力达成交价','科力达库存','弘润销量','弘润产量','弘润成交价','弘润库存','市场成交价','京博指导价',\n", + " '布伦特上周收盘价','布伦特昨日收盘价','布伦特收盘价','上期所沥青主力合约','隆重资讯沥青日开工率','隆重资讯沥青月库存',\n", + " '隆重资讯沥青月产量','隆重资讯沥青表观消费量','隆重资讯社会库存率','厂区库容','京博提货量','即期成本','异地库库存',\n", + " '京博签单量','京博库存量','京博产量','加权平均成交价']] = df_test[['汽油执行价','柴油执行价','齐鲁石化销量','齐鲁石化产量','齐鲁石化成交价','齐鲁石化库存','科力达销量',\n", + " '科力达产量','科力达成交价','科力达库存','弘润销量','弘润产量','弘润成交价','弘润库存','市场成交价','京博指导价',\n", + " '布伦特上周收盘价','布伦特昨日收盘价','布伦特收盘价','上期所沥青主力合约','隆重资讯沥青日开工率','隆重资讯沥青月库存',\n", + " '隆重资讯沥青月产量','隆重资讯沥青表观消费量','隆重资讯社会库存率','厂区库容','京博提货量','即期成本','异地库库存',\n", + " '京博签单量','京博库存量','京博产量','加权平均成交价']].astype('float')\n", + " # df_test = pd.read_csv('定价模型数据收集20190901-20230615.csv',encoding = 'gbk',engine = 'python')\n", + " # df_test['日期']=pd.to_datetime(df_test['日期'], format='%m/%d/%Y',infer_datetime_format=True)\n", + " df_test['日期']=pd.to_datetime(df_test['日期'], format='%Y-%m-%d',infer_datetime_format=True)\n", + " # df_test.tail(3)\n", + " MisVal_Check=df_test.isnull().sum().sort_values(ascending=False)\n", + " #去掉缺失值百分比>0.4的特征,去掉这些特征后的新表格命名为df_test_1\n", + " df_MisVal_Check = pd.DataFrame(MisVal_Check,)#\n", + " df_MisVal_Check_1=df_MisVal_Check.reset_index()\n", + " df_MisVal_Check_1.columns=['Variable_Name','Missing_Number'] \n", + " df_MisVal_Check_1['Missing_Number']=df_MisVal_Check_1['Missing_Number']/len(df_test)\n", + " df_test_1=df_test.drop(df_MisVal_Check_1[df_MisVal_Check_1['Missing_Number']>0.4].Variable_Name,axis = 1)\n", + " #将缺失值补为前一个或者后一个数值\n", + " df_test_1=df_test_1.fillna(df_test.ffill())\n", + " df_test_1=df_test_1.fillna(df_test_1.bfill())\n", + " df_test_1[\"日期\"] = pd.to_datetime(df_test_1[\"日期\"])\n", + " df_test_1.index = df_test_1[\"日期\"]\n", + " df_test_1 = df_test_1.drop([\"日期\"], axis= 1)\n", + " dataset1=df_test_1.drop('京博指导价',axis=1)#.astype(float)\n", + "\n", + " y=df_test_1['京博指导价']\n", + "\n", + " x=dataset1 \n", + "\n", + " train = x\n", + " target = y\n", + "\n", + " #切割数据样本集合测试集\n", + " X_train,x_test,y_train,y_true = train_test_split(train,target,test_size=0.2,random_state=0)\n", + " \n", + " \n", + " from sklearn.linear_model import Lasso\n", + " from xgboost import XGBRegressor\n", + "\n", + " from datetime import datetime\n", + " import statsmodels.api as sm\n", + " # from keras.preprocessing.sequence import TimeseriesGenerator\n", + " from tensorflow.keras.preprocessing.sequence import TimeseriesGenerator\n", + "\n", + " import plotly.express as px\n", + " import plotly.graph_objects as go\n", + "\n", + " import xgboost as xgb\n", + " from xgboost import plot_importance, plot_tree\n", + " from sklearn.metrics import mean_absolute_error\n", + " from statsmodels.tools.eval_measures import mse,rmse\n", + " from sklearn.model_selection import GridSearchCV\n", + " from xgboost import XGBRegressor\n", + " import warnings\n", + " import pickle\n", + "\n", + " from sklearn.metrics import mean_squared_error\n", + "\n", + " #切割训练数据和样本数据\n", + " from sklearn.model_selection import train_test_split\n", + "\n", + " #用于模型评分\n", + " from sklearn.metrics import r2_score\n", + "\n", + " #模型缩写\n", + " Lasso = Lasso(random_state=0)\n", + " XGBR = XGBRegressor(random_state=0)\n", + " Lasso.fit(X_train,y_train)\n", + " XGBR.fit(X_train,y_train)\n", + " y_pre_Lasso = Lasso.predict(x_test)\n", + " y_pre_XGBR = XGBR.predict(x_test)\n", + "\n", + " #计算Lasso、XGBR、RandomForestR、AdaBoostR、GradientBoostingR、BaggingRegressor各模型的R²\n", + " Lasso_score = r2_score(y_true,y_pre_Lasso)\n", + " XGBR_score=r2_score(y_true,y_pre_XGBR)\n", + "\n", + " #计算Lasso、XGBR的MSE和RMSE\n", + " Lasso_MSE=mean_squared_error(y_true, y_pre_Lasso)\n", + " XGBR_MSE=mean_squared_error(y_true, y_pre_XGBR)\n", + "\n", + " Lasso_RMSE=np.sqrt(Lasso_MSE)\n", + " XGBR_RMSE=np.sqrt(XGBR_MSE)\n", + " model_results = pd.DataFrame([['Lasso', Lasso_RMSE, Lasso_score],\n", + " ['XgBoost', XGBR_RMSE, XGBR_score]],\n", + " columns = ['模型(Model)','均方根误差(RMSE)', 'R^2 score'])\n", + " model_results1=model_results.set_index('模型(Model)')\n", + "\n", + " model_results1\n", + " def plot_feature_importance(importance,names,model_type):\n", + " feature_importance = np.array(importance)\n", + " feature_names = np.array(names)\n", + "\n", + " data={'feature_names':feature_names,'feature_importance':feature_importance}\n", + " fi_df = pd.DataFrame(data)\n", + "\n", + " fi_df.sort_values(by=['feature_importance'], ascending=False,inplace=True)\n", + "\n", + " plt.figure(figsize=(10,8))\n", + " sn.barplot(x=fi_df['feature_importance'], y=fi_df['feature_names'])\n", + "\n", + " plt.title(model_type + \" \"+'FEATURE IMPORTANCE')\n", + " plt.xlabel('FEATURE IMPORTANCE')\n", + " plt.ylabel('FEATURE NAMES')\n", + " from pylab import mpl\n", + " %pylab\n", + " mpl.rcParams['font.sans-serif'] = ['SimHei']\n", + " from xgboost import XGBRegressor\n", + " from sklearn.model_selection import GridSearchCV\n", + "\n", + " estimator = XGBRegressor(random_state=0,\n", + " nthread=4,\n", + " seed=0\n", + " )\n", + " parameters = {\n", + " 'max_depth': range (2, 11, 2), # 树的最大深度\n", + " 'n_estimators': range (50, 101, 10), # 迭代次数\n", + " 'learning_rate': [0.01, 0.03, 0.1, 0.3, 0.5, 1]\n", + " }\n", + "\n", + " grid_search_XGB = GridSearchCV(\n", + " estimator=estimator,\n", + " param_grid=parameters,\n", + " # n_jobs = 10,\n", + " cv = 3,\n", + " verbose=True\n", + " )\n", + "\n", + " grid_search_XGB.fit(X_train, y_train)\n", + " print(\"Best score: %0.3f\" % grid_search_XGB.best_score_)\n", + " print(\"Best parameters set:\")\n", + " best_parameters = grid_search_XGB.best_estimator_.get_params()\n", + " for param_name in sorted(parameters.keys()):\n", + " print(\"\\t%s: %r\" % (param_name, best_parameters[param_name]))\n", + " y_pred = grid_search_XGB.predict(x_test)\n", + "\n", + " op_XGBR_score = r2_score(y_true,y_pred)\n", + " op_XGBR_MSE= mean_squared_error(y_true, y_pred)\n", + " op_XGBR_RMSE= np.sqrt(op_XGBR_MSE)\n", + "\n", + " model_results2 = pd.DataFrame([['Optimized_Xgboost', op_XGBR_RMSE, op_XGBR_score]],\n", + " columns = ['模型(Model)', '均方根误差(RMSE)', 'R^2 score'])\n", + " model_results2=model_results2.set_index('模型(Model)')\n", + "\n", + " # results = model_results1.append(model_results2, ignore_index = False)\n", + " results = pd.concat([model_results1,model_results2],ignore_index=True)\n", + " results\n", + " import pickle\n", + "\n", + " Pkl_Filename = \"日度价格预测_最佳模型.pkl\" \n", + "\n", + " with open(Pkl_Filename, 'wb') as file: \n", + " pickle.dump(grid_search_XGB, file)\n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "def read_xls_data():\n", + " global one_cols, two_cols\n", + " # 打开 XLS 文件\n", + " workbook = xlrd.open_workbook(read_file_path_name)\n", + "\n", + " # 获取所有表格名称\n", + " # sheet_names = workbook.sheet_names()\n", + "\n", + " # 选择第一个表格\n", + " sheet = workbook.sheet_by_index(0)\n", + "\n", + " # 获取行数和列数\n", + " num_rows = sheet.nrows\n", + " # num_cols = sheet.ncols\n", + "\n", + " # 遍历每一行,获取单元格数据\n", + " # for i in range(num_rows):\n", + " # row_data = sheet.row_values(i)\n", + " # one_cols.append(row_data)\n", + " # two_cols.append(row_data[1])\n", + "\n", + " row_data = sheet.row_values(1)\n", + " one_cols = row_data\n", + "\n", + " # 关闭 XLS 文件\n", + " # workbook.close()\n", + "\n", + "\n", + "\n", + "\n", + "def start():\n", + " '''预测上传数据'''\n", + " read_xls_data()\n", + "\n", + " token = get_head_auth()\n", + " if not token:\n", + " return\n", + " token_push = get_head_push_auth()\n", + " if not token_push:\n", + " return\n", + "\n", + " datas = get_data_value(token, one_cols[1:])\n", + " if not datas:\n", + " return\n", + "\n", + " # data_list = [two_cols, one_cols]\n", + " append_rows = [get_cur_time()[1]]\n", + " dataItemNo_dataValue = {}\n", + " for data_value in datas:\n", + " if \"dataValue\" not in data_value:\n", + " print(data_value)\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = \"\"\n", + " else:\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = data_value[\"dataValue\"]\n", + " \n", + " for value in one_cols[1:]:\n", + " if value in dataItemNo_dataValue:\n", + " append_rows.append(dataItemNo_dataValue[value])\n", + " else:\n", + " append_rows.append(\"\")\n", + " save_xls(append_rows)\n", + " optimize_Model()\n", + " upload_data_to_system(token_push)\n", + " # data_list.append(three_cols)\n", + " # write_xls(data_list)\n", + "\n", + "\n", + "def start_3(date):\n", + " '''预测上传数据'''\n", + " read_xls_data()\n", + "\n", + " token = get_head_auth()\n", + " if not token:\n", + " return\n", + " token_push = get_head_push_auth()\n", + " if not token_push:\n", + " return\n", + "\n", + " datas = get_data_value(token, one_cols[1:],date)\n", + " if not datas:\n", + " return\n", + "\n", + " # data_list = [two_cols, one_cols]\n", + " append_rows = [get_cur_time(date)[1]]\n", + " dataItemNo_dataValue = {}\n", + " for data_value in datas:\n", + " if \"dataValue\" not in data_value:\n", + " print(data_value)\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = \"\"\n", + " else:\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = data_value[\"dataValue\"]\n", + " \n", + " for value in one_cols[1:]:\n", + " if value in dataItemNo_dataValue:\n", + " append_rows.append(dataItemNo_dataValue[value])\n", + " else:\n", + " append_rows.append(\"\")\n", + " save_xls(append_rows)\n", + " optimize_Model()\n", + " upload_data_to_system(token_push,date)\n", + " # data_list.append(three_cols)\n", + " # write_xls(data_list)\n", + "\n", + "\n", + "\n", + "def start_1():\n", + " '''更新数据'''\n", + " read_xls_data()\n", + "\n", + " token = get_head_auth()\n", + " if not token:\n", + " return\n", + " \n", + "\n", + " datas = get_data_value(token, one_cols[1:])\n", + " if not datas:\n", + " return\n", + "\n", + " # data_list = [two_cols, one_cols]\n", + " append_rows = [get_cur_time()[1]]\n", + " dataItemNo_dataValue = {}\n", + " for data_value in datas:\n", + " if \"dataValue\" not in data_value:\n", + " print(data_value)\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = \"\"\n", + " else:\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = data_value[\"dataValue\"]\n", + " \n", + " for value in one_cols[1:]:\n", + " if value in dataItemNo_dataValue:\n", + " append_rows.append(dataItemNo_dataValue[value])\n", + " else:\n", + " append_rows.append(\"\")\n", + " save_xls_1(append_rows)\n", + "\n", + " \n", + " # data_list.append(three_cols)\n", + " # write_xls(data_list)\n", + "\n", + "\n", + "def start_2(date):\n", + " '''更新数据'''\n", + " read_xls_data()\n", + "\n", + " token = get_head_auth()\n", + " if not token:\n", + " return\n", + " \n", + "\n", + " datas = get_data_value(token, one_cols[1:],date)\n", + " if not datas:\n", + " return\n", + "\n", + " # data_list = [two_cols, one_cols]\n", + " append_rows = [get_cur_time(date=date)[1]]\n", + " dataItemNo_dataValue = {}\n", + " for data_value in datas:\n", + " if \"dataValue\" not in data_value:\n", + " print(data_value)\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = \"\"\n", + " else:\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = data_value[\"dataValue\"]\n", + " \n", + " for value in one_cols[1:]:\n", + " if value in dataItemNo_dataValue:\n", + " append_rows.append(dataItemNo_dataValue[value])\n", + " else:\n", + " append_rows.append(\"\")\n", + " print('新增数据:',append_rows)\n", + " save_xls_1(append_rows)\n", + "\n", + " \n", + " # data_list.append(three_cols)\n", + " # write_xls(data_list)\n", + " \n", + "def save_xls_1(append_rows):\n", + "\n", + " # 打开xls文件\n", + " workbook = xlrd.open_workbook('沥青数据项.xls')\n", + "\n", + " # 获取所有sheet的个数\n", + " sheet_count = len(workbook.sheet_names())\n", + "\n", + " # 获取所有sheet的名称\n", + " sheet_names = workbook.sheet_names()\n", + "\n", + " new_workbook = xlwt.Workbook()\n", + " for i in range(sheet_count):\n", + " # 获取当前sheet\n", + " sheet = workbook.sheet_by_index(i)\n", + "\n", + " # 获取sheet的行数和列数\n", + " row_count = sheet.nrows - 1\n", + " col_count = sheet.ncols\n", + " # 获取原有数据\n", + " data = []\n", + " for row in range(row_count):\n", + " row_data = []\n", + " for col in range(col_count):\n", + " row_data.append(sheet.cell_value(row, col))\n", + " data.append(row_data)\n", + " # 创建xlwt的Workbook对象\n", + " # 创建sheet\n", + " new_sheet = new_workbook.add_sheet(sheet_names[i])\n", + "\n", + " # 将原有的数据写入新的sheet\n", + " for row in range(row_count):\n", + " for col in range(col_count):\n", + " new_sheet.write(row, col, data[row][col])\n", + "\n", + " if i == 0:\n", + " # 在新的sheet中添加数据\n", + " for col in range(col_count):\n", + " new_sheet.write(row_count, col, append_rows[col])\n", + "\n", + " # 保存新的xls文件\n", + " new_workbook.save(\"沥青数据项.xls\") \n", + "\n", + " \n", + " \n", + " \n", + "def check_data(dataItemNo):\n", + " token = get_head_auth()\n", + " if not token:\n", + " return\n", + "\n", + " datas = get_data_value(token, dataItemNo)\n", + " if not datas:\n", + " return\n", + "\n", + "\n", + "def save_xls(append_rows):\n", + "\n", + " # 打开xls文件\n", + " workbook = xlrd.open_workbook('沥青数据项.xls')\n", + "\n", + " # 获取所有sheet的个数\n", + " sheet_count = len(workbook.sheet_names())\n", + "\n", + " # 获取所有sheet的名称\n", + " sheet_names = workbook.sheet_names()\n", + "\n", + " new_workbook = xlwt.Workbook()\n", + " for i in range(sheet_count):\n", + " # 获取当前sheet\n", + " sheet = workbook.sheet_by_index(i)\n", + "\n", + " # 获取sheet的行数和列数\n", + " row_count = sheet.nrows\n", + " col_count = sheet.ncols\n", + " # 获取原有数据\n", + " data = []\n", + " for row in range(row_count):\n", + " row_data = []\n", + " for col in range(col_count):\n", + " row_data.append(sheet.cell_value(row, col))\n", + " data.append(row_data)\n", + " # 创建xlwt的Workbook对象\n", + " # 创建sheet\n", + " new_sheet = new_workbook.add_sheet(sheet_names[i])\n", + "\n", + " # 将原有的数据写入新的sheet\n", + " for row in range(row_count):\n", + " for col in range(col_count):\n", + " new_sheet.write(row, col, data[row][col])\n", + "\n", + " if i == 0:\n", + " # 在新的sheet中添加数据\n", + " for col in range(col_count):\n", + " new_sheet.write(row_count, col, append_rows[col])\n", + "\n", + " # 保存新的xls文件\n", + " new_workbook.save(\"沥青数据项.xls\")\n", + "\n", + "\n", + "if __name__ == \"__main__\":\n", + " pass\n", + " # 需要单独运行放开\n", + "# start()\n", + "\n", + " # 每天定时12点运行\n", + " # while True:\n", + " # # 获取当前时间\n", + " # current_time = time.strftime(\"%H:%M:%S\", time.localtime())\n", + " # current_time_1 = time.strftime(\"%H:%M:%S\", time.localtime())\n", + "\n", + " # # 判断当前时间是否为执行任务的时间点\n", + " # if current_time == \"12:00:00\":\n", + " # print(\"执行定时任务\")\n", + " # start()\n", + "\n", + " # # 休眠1秒钟,避免过多占用CPU资源\n", + " # time.sleep(1)\n", + " \n", + " # elif current_time_1 == \"20:00:00\":\n", + " # print(\"更新数据\")\n", + " # start_1()\n", + " # time.sleep(1)\n", + "\n", + "\n", + "# # 检测数据准确性, 需要检测放开\n", + "# # check_data(\"100028098|LISTING_PRICE\")\n", + "# # check_data(\"9137070016544622XB|DAY_Yield\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20241025\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_6896\\1185823687.py:299: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: \n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\magics\\pylab.py:162: UserWarning:\n", + "\n", + "pylab import has clobbered these variables: ['random', 'datetime', 'plot', '__version__']\n", + "`%matplotlib` prevents importing * from pylab and numpy\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best score: 0.997\n", + "Best parameters set:\n", + "\tlearning_rate: 0.1\n", + "\tmax_depth: 10\n", + "\tn_estimators: 100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_6896\\1185823687.py:239: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_6896\\1185823687.py:273: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "日期\n", + "2024-10-25 3538.790283\n", + "Name: 日度预测价格, dtype: float32\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "新增数据: ['2024-10-25', '', '', 0.2, 0.0, 3660.0, 1.5, 0.1, 0.0, 3450.0, 7.9, 0.2, 0.2, 3450.0, 0.3, '', 3500.0, 75.46, 72.67, '', '', '', '', '', '', '', '', '', 3065.6453, '', '', '', '', '']\n" + ] + } + ], + "source": [ + "from datetime import datetime, timedelta\n", + "\n", + "start_date = datetime(2024, 10, 25)\n", + "end_date = datetime(2024, 10, 26)\n", + "\n", + "while start_date < end_date:\n", + " print(start_date.strftime('%Y%m%d'))\n", + " start_3(start_date)\n", + " time.sleep(1)\n", + " start_2(start_date)\n", + " start_date += timedelta(days=1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "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.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/aisenzhecode/沥青/沥青数据项.xls b/aisenzhecode/沥青/沥青数据项.xls new file mode 100644 index 0000000000000000000000000000000000000000..6ba48637315c527592e5d98e3526813219d6ca9c GIT binary patch literal 558592 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

o*!35yk0|M%&&O&*Fe0! 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\n", + " window.PlotlyConfig = {MathJaxConfig: 'local'};\n", + " if (window.MathJax && window.MathJax.Hub && window.MathJax.Hub.Config) {window.MathJax.Hub.Config({SVG: {font: \"STIX-Web\"}});}\n", + " if (typeof require !== 'undefined') {\n", + " require.undef(\"plotly\");\n", + " requirejs.config({\n", + " paths: {\n", + " 'plotly': ['https://cdn.plot.ly/plotly-2.12.1.min']\n", + " }\n", + " });\n", + " require(['plotly'], function(Plotly) {\n", + " window._Plotly = Plotly;\n", + " });\n", + " }\n", + " \n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import requests\n", + "import json\n", + "import xlrd\n", + "import xlwt\n", + "from datetime import datetime\n", + "import time\n", + "# 变量定义\n", + "login_url = \"http://10.200.32.39/jingbo-api/api/server/login\"\n", + "search_url = \"http://10.200.32.39/jingbo-api/api/warehouse/dwDataItem/queryByItemNos\"\n", + "\n", + "login_push_url = \"http://10.200.32.39/jingbo-api/api/server/login\"\n", + "upload_url = \"http://10.200.32.39/jingbo-api/api/dw/dataValue/pushDataValueList\"\n", + "\n", + "login_data = {\n", + " \"data\": {\n", + " \"account\": \"api_dev\",\n", + " \"password\": \"ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U=\",\n", + " \"tenantHashCode\": \"8a4577dbd919675758d57999a1e891fe\",\n", + " \"terminal\": \"API\"\n", + " },\n", + " \"funcModule\": \"API\",\n", + " \"funcOperation\": \"获取token\"\n", + "}\n", + "\n", + "login_push_data = {\n", + " \"data\": {\n", + " \"account\": \"api_dev\",\n", + " \"password\": \"ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U=\",\n", + " \"tenantHashCode\": \"8a4577dbd919675758d57999a1e891fe\",\n", + " \"terminal\": \"API\"\n", + " },\n", + " \"funcModule\": \"API\",\n", + " \"funcOperation\": \"获取token\"\n", + "}\n", + "\n", + "read_file_path_name = \"纯苯数据项.xls\"\n", + "one_cols = []\n", + "two_cols = []\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sn\n", + "import random\n", + "import time\n", + "\n", + "\n", + "\n", + "\n", + "from plotly import __version__\n", + "from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot\n", + "\n", + "from sklearn import preprocessing\n", + "\n", + "from pandas import Series,DataFrame\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import sklearn.datasets as datasets\n", + "\n", + "#导入机器学习算法模型\n", + "from sklearn.linear_model import Lasso\n", + "from xgboost import XGBRegressor\n", + "\n", + "import datetime\n", + "import statsmodels.api as sm\n", + "try:\n", + " from keras.preprocessing.sequence import TimeseriesGenerator\n", + "except:\n", + " from tensorflow.keras.preprocessing.sequence import TimeseriesGenerator\n", + "\n", + "import plotly.express as px\n", + "import plotly.graph_objects as go\n", + "\n", + "import xgboost as xgb\n", + "from xgboost import plot_importance, plot_tree\n", + "from sklearn.metrics import mean_absolute_error\n", + "from statsmodels.tools.eval_measures import mse,rmse\n", + "from sklearn.model_selection import GridSearchCV\n", + "from xgboost import XGBRegressor\n", + "import warnings\n", + "import pickle\n", + "\n", + "from sklearn.metrics import mean_squared_error\n", + "\n", + "#切割训练数据和样本数据\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "#用于模型评分\n", + "from sklearn.metrics import r2_score\n", + "\n", + "le = preprocessing.LabelEncoder()\n", + "\n", + "# print(__version__) # requires version >= 1.9.0\n", + "\n", + "\n", + "import cufflinks as cf\n", + "cf.go_offline()\n", + "\n", + "random.seed(100)\n", + "\n", + "%matplotlib inline\n", + "\n", + "# 数据获取\n", + "\n", + "def get_head_auth():\n", + " login_res = requests.post(url=login_url, json=login_data, timeout=(3, 5))\n", + " text = json.loads(login_res.text)\n", + " if text[\"status\"]:\n", + " token = text[\"data\"][\"accessToken\"]\n", + " return token\n", + " else:\n", + " print(\"获取认证失败\")\n", + " return None\n", + "\n", + "\n", + "def get_data_value(token, dataItemNoList,date):\n", + " search_data = {\n", + " \"data\": {\n", + " \"date\": get_cur_time(date)[0],\n", + " \"dataItemNoList\": dataItemNoList\n", + " },\n", + " \"funcModule\": \"数据项\",\n", + " \"funcOperation\": \"查询\"\n", + " }\n", + " headers = {\"Authorization\": token}\n", + " search_res = requests.post(url=search_url, headers=headers, json=search_data, timeout=(3, 5))\n", + " search_value = json.loads(search_res.text)[\"data\"]\n", + " if search_value:\n", + " return search_value\n", + " else:\n", + " print(\"今天没有新数据\")\n", + " return search_value\n", + "\n", + "\n", + "# xls文件处理\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "def write_xls(data,date):\n", + " # 创建一个Workbook对象\n", + " workbook = xlwt.Workbook()\n", + "\n", + " # 创建一个Sheet对象,可指定名称\n", + " sheet = workbook.load('Sheet1')\n", + "\n", + " # 写入数据行\n", + " for row_index, row_data in enumerate(data):\n", + " for col_index, cell_data in enumerate(row_data):\n", + " sheet.write(row_index, col_index, cell_data)\n", + "\n", + " # 保存Workbook到文件\n", + " workbook.save(get_cur_time(date)[0] + '.xls')\n", + "\n", + "\n", + "def get_cur_time(date=''):\n", + " if date == '':\n", + " import datetime\n", + " now = datetime.datetime.now()\n", + " else:\n", + " now = date\n", + " year = now.year\n", + " month = now.month\n", + " day = now.day\n", + "\n", + " if month < 10:\n", + " month = \"0\" + str(month)\n", + " if day < 10:\n", + " day = \"0\" + str(day)\n", + " cur_time = str(year) + str(month) + str(day)\n", + " cur_time2 = str(year) + \"-\" + str(month) + \"-\" + str(day)\n", + " return cur_time, cur_time2\n", + "\n", + "\n", + "def get_head_push_auth():\n", + " login_res = requests.post(url=login_push_url, json=login_push_data, timeout=(3, 5))\n", + " text = json.loads(login_res.text)\n", + " if text[\"status\"]:\n", + " token = text[\"data\"][\"accessToken\"]\n", + " return token\n", + " else:\n", + " print(\"获取认证失败\")\n", + " return None\n", + "\n", + "\n", + "\n", + "def upload_data_to_system(token_push,date):\n", + " datavalue = forecast_price()\n", + " data = {\n", + " \"funcModule\": \"数据表信息列表\",\n", + " \"funcOperation\": \"新增\",\n", + " \"data\": [\n", + " {\"dataItemNo\": \"C01100047|FORECAST_PRICE\",\n", + " \"dataDate\": get_cur_time(date)[0],\n", + " \"dataStatus\": \"add\",\n", + " \"dataValue\": datavalue\n", + " }\n", + "\n", + " ]\n", + " }\n", + " print(data)\n", + " headers = {\"Authorization\": token_push}\n", + " res = requests.post(url=upload_url, headers=headers, json=data, timeout=(3, 5))\n", + " print(res.text)\n", + "\n", + " \n", + "# def upload_data_to_system(token):\n", + "# data = {\n", + "# \"funcModule\": \"数据表信息列表\",\n", + "# \"funcOperation\": \"新增\",\n", + "# \"data\": [\n", + "# {\"dataItemNo\": \"C01100036|Forecast_ Price|ACN\",\n", + "# \"dataDate\": '20230706',\n", + "# \"dataStatus\": \"add\",\n", + "# \"dataValue\": 3780.0\n", + "# }\n", + "\n", + "# ]\n", + "# }\n", + "# headers = {\"Authorization\": token}\n", + "# res = requests.post(url=upload_url, headers=headers, json=data, timeout=(3, 5))\n", + "# print(res.text)\n", + "\n", + " \n", + " \n", + "def forecast_price():\n", + " # df_test = pd.read_csv('定价模型数据收集0212.csv')\n", + " df_test = pd.read_excel('纯苯数据项.xls',sheet_name='Sheet1')\n", + " df_test.drop([0],inplace=True)\n", + " # df_test['Date']=pd.to_datetime(df_test['Date'], format='%m/%d/%Y',infer_datetime_format=True)\n", + " df_test['Date']=pd.to_datetime(df_test['Date'], format=r'%Y-%m-%d',infer_datetime_format=True)\n", + "\n", + "\n", + " df_test_1 = df_test\n", + " df_test_1=df_test_1.fillna(df_test.ffill())\n", + " df_test_1=df_test_1.fillna(df_test_1.bfill())\n", + "\n", + " # 选择用于模型训练的列名称\n", + " col_for_training = df_test_1.columns\n", + "\n", + "\n", + " import joblib\n", + " Best_model_DalyLGPrice = joblib.load(\"日度价格预测_最佳模型.pkl\")\n", + " # 最新的一天为最后一行的数据\n", + " \n", + " df_test_1_Day = df_test_1.tail(1)\n", + " # 移除不需要的列\n", + " df_test_1_Day.index = df_test_1_Day[\"Date\"]\n", + " df_test_1_Day = df_test_1_Day.drop([\"Date\"], axis= 1)\n", + " df_test_1_Day=df_test_1_Day.drop('Price',axis=1)\n", + " df_test_1_Day=df_test_1_Day.dropna()\n", + "\n", + " for col in df_test_1_Day.columns:\n", + " df_test_1_Day[col] = pd.to_numeric(df_test_1_Day[col],errors='coerce')\n", + " #预测今日价格,显示至小数点后两位\n", + " Ypredict_Today=Best_model_DalyLGPrice.predict(df_test_1_Day)\n", + "\n", + " df_test_1_Day['日度预测价格']=Ypredict_Today\n", + " print(df_test_1_Day['日度预测价格'])\n", + " a = df_test_1_Day['日度预测价格']\n", + " a = a[0]\n", + " a = float(a)\n", + " a = round(a,2)\n", + " return a\n", + "def optimize_Model():\n", + " from sklearn.model_selection import train_test_split\n", + " from sklearn.impute import SimpleImputer\n", + " from sklearn.preprocessing import OrdinalEncoder\n", + " from sklearn.feature_selection import SelectFromModel\n", + " from sklearn.metrics import mean_squared_error, r2_score\n", + " import pandas as pd\n", + "\n", + " pd.set_option('display.max_rows',40) \n", + " pd.set_option('display.max_columns',40) \n", + " df_test = pd.read_excel('纯苯数据项.xls')\n", + " df_test.drop([0],inplace=True)\n", + " # df_test['Date']=pd.to_datetime(df_test['Date'], format='%m/%d/%Y',infer_datetime_format=True)\n", + " df_test['Date']=pd.to_datetime(df_test['Date'], format='%Y-%m-%d',infer_datetime_format=True)\n", + "\n", + " \n", + " #将缺失值补为前一个或者后一个数值\n", + " df_test_1 = df_test\n", + " df_test_1=df_test_1.fillna(df_test.ffill())\n", + " df_test_1=df_test_1.fillna(df_test_1.bfill())\n", + " df_test_1[\"Date\"] = pd.to_datetime(df_test_1[\"Date\"])\n", + " df_test_1.index = df_test_1[\"Date\"]\n", + " df_test_1 = df_test_1.drop([\"Date\"], axis= 1)\n", + " df_test_1 = df_test_1.astype('float')\n", + " \n", + " \n", + " import numpy as np\n", + " import pandas as pd\n", + " from pandas import Series,DataFrame\n", + "\n", + " import matplotlib.pyplot as plt\n", + "\n", + " import sklearn.datasets as datasets\n", + "\n", + " #导入机器学习算法模型\n", + " from sklearn.linear_model import Lasso\n", + " from xgboost import XGBRegressor\n", + "\n", + " from datetime import datetime\n", + " import statsmodels.api as sm\n", + " try:\n", + " from keras.preprocessing.sequence import TimeseriesGenerator\n", + " except:\n", + " from tensorflow.keras.preprocessing.sequence import TimeseriesGenerator\n", + "\n", + " import plotly.express as px\n", + " import plotly.graph_objects as go\n", + "\n", + " import xgboost as xgb\n", + " from xgboost import plot_importance, plot_tree\n", + " from sklearn.metrics import mean_absolute_error\n", + " from statsmodels.tools.eval_measures import mse,rmse\n", + " from sklearn.model_selection import GridSearchCV\n", + " from xgboost import XGBRegressor\n", + " import warnings\n", + " import pickle\n", + "\n", + " from sklearn.metrics import mean_squared_error\n", + "\n", + " #切割训练数据和样本数据\n", + " from sklearn.model_selection import train_test_split\n", + "\n", + " #用于模型评分\n", + " from sklearn.metrics import r2_score\n", + "\n", + " dataset1=df_test_1.drop('Price',axis=1)#.astype(float)\n", + "\n", + " y=df_test_1['Price']\n", + "\n", + " x=dataset1 \n", + "\n", + " train = x\n", + " target = y\n", + "\n", + " #切割数据样本集合测试集\n", + " X_train,x_test,y_train,y_true = train_test_split(train,target,test_size=0.2,random_state=0)\n", + "\n", + " #模型缩写\n", + " Lasso = Lasso(random_state=0)\n", + " XGBR = XGBRegressor(random_state=0)\n", + " #训练模型\n", + " Lasso.fit(X_train,y_train)\n", + " XGBR.fit(X_train,y_train)\n", + " #模型拟合\n", + " y_pre_Lasso = Lasso.predict(x_test)\n", + " y_pre_XGBR = XGBR.predict(x_test)\n", + "\n", + " #计算Lasso、XGBR、RandomForestR、AdaBoostR、GradientBoostingR、BaggingRegressor各模型的R²\n", + " Lasso_score = r2_score(y_true,y_pre_Lasso)\n", + " XGBR_score=r2_score(y_true,y_pre_XGBR)\n", + "\n", + " #计算Lasso、XGBR的MSE和RMSE\n", + " Lasso_MSE=mean_squared_error(y_true, y_pre_Lasso)\n", + " XGBR_MSE=mean_squared_error(y_true, y_pre_XGBR)\n", + "\n", + " Lasso_RMSE=np.sqrt(Lasso_MSE)\n", + " XGBR_RMSE=np.sqrt(XGBR_MSE)\n", + " # 将不同模型的不同误差值整合成一个表格\n", + " model_results = pd.DataFrame([['Lasso', Lasso_RMSE, Lasso_score],\n", + " ['XgBoost', XGBR_RMSE, XGBR_score]],\n", + " columns = ['模型(Model)','均方根误差(RMSE)', 'R^2 score'])\n", + " #将模型名称(Model)列设置为索引\n", + " model_results1=model_results.set_index('模型(Model)')\n", + "\n", + " model_results1\n", + " #定义plot_feature_importance函数,该函数用于计算特征重要性。此部分代码无需调整\n", + " def plot_feature_importance(importance,names,model_type):\n", + " feature_importance = np.array(importance)\n", + " feature_names = np.array(names)\n", + "\n", + " data={'feature_names':feature_names,'feature_importance':feature_importance}\n", + " fi_df = pd.DataFrame(data)\n", + "\n", + " fi_df.sort_values(by=['feature_importance'], ascending=False,inplace=True)\n", + "\n", + " plt.figure(figsize=(10,8))\n", + " sn.barplot(x=fi_df['feature_importance'], y=fi_df['feature_names'])\n", + "\n", + " plt.title(model_type + \" \"+'FEATURE IMPORTANCE')\n", + " plt.xlabel('FEATURE IMPORTANCE')\n", + " plt.ylabel('FEATURE NAMES')\n", + " from pylab import mpl\n", + " %pylab\n", + " mpl.rcParams['font.sans-serif'] = ['SimHei']\n", + " ## Xgboost 模型参数优化-初步\n", + " #参考: https://juejin.im/post/6844903661013827598 \n", + " #每次调参时,备选参数数值以同数量级的1、3、10设置即可(比如设置1、3、10,或0.1、0.3、1.0,或0.01,0.03,0.10即可)\n", + "\n", + " from xgboost import XGBRegressor\n", + " from sklearn.model_selection import GridSearchCV\n", + "\n", + " estimator = XGBRegressor(random_state=0,\n", + " nthread=4,\n", + " seed=0\n", + " )\n", + " parameters = {\n", + " 'max_depth': range (2, 11, 2), # 树的最大深度\n", + " 'n_estimators': range (50, 101, 10), # 迭代次数\n", + " 'learning_rate': [0.01, 0.03, 0.1, 0.3, 0.5, 1]\n", + " }\n", + "\n", + " grid_search_XGB = GridSearchCV(\n", + " estimator=estimator,\n", + " param_grid=parameters,\n", + " # n_jobs = 10,\n", + " cv = 3,\n", + " verbose=True\n", + " )\n", + "\n", + " grid_search_XGB.fit(X_train, y_train)\n", + " #如果电脑在此步骤报错,可能是因为计算量太大,超过硬件可支持程度,可注释掉“n_jobs=10”一行\n", + "\n", + " best_parameters = grid_search_XGB.best_estimator_.get_params()\n", + " y_pred = grid_search_XGB.predict(x_test)\n", + "\n", + " op_XGBR_score = r2_score(y_true,y_pred)\n", + " op_XGBR_MSE= mean_squared_error(y_true, y_pred)\n", + " op_XGBR_RMSE= np.sqrt(op_XGBR_MSE)\n", + "\n", + " model_results2 = pd.DataFrame([['Optimized_Xgboost', op_XGBR_RMSE, op_XGBR_score]],\n", + " columns = ['模型(Model)', '均方根误差(RMSE)', 'R^2 score'])\n", + " model_results2=model_results2.set_index('模型(Model)')\n", + "\n", + " # results = model_results1.append(model_results2, ignore_index = False)\n", + " results = pd.concat([model_results1,model_results2],ignore_index=True)\n", + "\n", + "\n", + "\n", + " import pickle\n", + "\n", + " Pkl_Filename = \"日度价格预测_最佳模型.pkl\" \n", + "\n", + " with open(Pkl_Filename, 'wb') as file: \n", + " pickle.dump(grid_search_XGB, file)\n", + "\n", + "\n", + " \n", + "\n", + "def read_xls_data():\n", + " global one_cols, two_cols\n", + " # 打开 XLS 文件\n", + " workbook = xlrd.open_workbook(read_file_path_name)\n", + "\n", + " # 获取所有表格名称\n", + " # sheet_names = workbook.sheet_names()\n", + "\n", + " # 选择第一个表格\n", + " sheet = workbook.sheet_by_index(0)\n", + "\n", + " # 获取行数和列数\n", + " num_rows = sheet.nrows\n", + " # num_cols = sheet.ncols\n", + "\n", + " # 遍历每一行,获取单元格数据\n", + " # for i in range(num_rows):\n", + " # row_data = sheet.row_values(i)\n", + " # one_cols.append(row_data)\n", + " # two_cols.append(row_data[1])\n", + "\n", + " row_data = sheet.row_values(1)\n", + " one_cols = row_data\n", + "\n", + " # 关闭 XLS 文件\n", + " # workbook.close()\n", + "\n", + "\n", + "\n", + "\n", + "def start(date):\n", + " read_xls_data()\n", + "\n", + " token = get_head_auth()\n", + " if not token:\n", + " return\n", + " token_push = get_head_push_auth()\n", + " if not token_push:\n", + " return\n", + "\n", + " datas = get_data_value(token, one_cols[1:],date)\n", + "# if not datas:\n", + "# return\n", + "\n", + " # data_list = [two_cols, one_cols]\n", + " append_rows = [get_cur_time(date)[1]]\n", + " dataItemNo_dataValue = {}\n", + " for data_value in datas:\n", + " if \"dataValue\" not in data_value:\n", + " print(data_value)\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = \"\"\n", + " else:\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = data_value[\"dataValue\"]\n", + " \n", + " for value in one_cols[1:]:\n", + " if value in dataItemNo_dataValue:\n", + " append_rows.append(dataItemNo_dataValue[value])\n", + " else:\n", + " append_rows.append(\"\")\n", + " save_xls(append_rows)\n", + " optimize_Model()\n", + " upload_data_to_system(token_push,date)\n", + " # data_list.append(three_cols)\n", + " # write_xls(data_list)\n", + "\n", + "\n", + "def start_1(date):\n", + " read_xls_data()\n", + "\n", + " token = get_head_auth()\n", + " if not token:\n", + " return\n", + " \n", + "\n", + " datas = get_data_value(token, one_cols[1:])\n", + "# if not datas:\n", + "# return\n", + "\n", + " # data_list = [two_cols, one_cols]\n", + " append_rows = [get_cur_time(date)[1]]\n", + " dataItemNo_dataValue = {}\n", + " for data_value in datas:\n", + " if \"dataValue\" not in data_value:\n", + " print(data_value)\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = \"\"\n", + " else:\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = data_value[\"dataValue\"]\n", + " \n", + " for value in one_cols[1:]:\n", + " if value in dataItemNo_dataValue:\n", + " append_rows.append(dataItemNo_dataValue[value])\n", + " else:\n", + " append_rows.append(\"\")\n", + " save_xls_1(append_rows)\n", + "\n", + " \n", + " # data_list.append(three_cols)\n", + " # write_xls(data_list)\n", + " \n", + "def save_xls_1(append_rows):\n", + "\n", + " # 打开xls文件\n", + " workbook = xlrd.open_workbook('纯苯数据项.xls')\n", + "\n", + " # 获取所有sheet的个数\n", + " sheet_count = len(workbook.sheet_names())\n", + "\n", + " # 获取所有sheet的名称\n", + " sheet_names = workbook.sheet_names()\n", + "\n", + " new_workbook = xlwt.Workbook()\n", + " for i in range(sheet_count):\n", + " # 获取当前sheet\n", + " sheet = workbook.sheet_by_index(i)\n", + "\n", + " # 获取sheet的行数和列数\n", + " row_count = sheet.nrows - 1\n", + " col_count = sheet.ncols\n", + " # 获取原有数据\n", + " data = []\n", + " for row in range(row_count):\n", + " row_data = []\n", + " for col in range(col_count):\n", + " row_data.append(sheet.cell_value(row, col))\n", + " data.append(row_data)\n", + " # 创建xlwt的Workbook对象\n", + " # 创建sheet\n", + " new_sheet = new_workbook.add_sheet(sheet_names[i])\n", + "\n", + " # 将原有的数据写入新的sheet\n", + " for row in range(row_count):\n", + " for col in range(col_count):\n", + " new_sheet.write(row, col, data[row][col])\n", + "\n", + " if i == 0:\n", + " # 在新的sheet中添加数据\n", + " for col in range(col_count):\n", + " new_sheet.write(row_count, col, append_rows[col])\n", + "\n", + " # 保存新的xls文件\n", + " new_workbook.save(\"纯苯数据项.xls\") \n", + "\n", + " \n", + " \n", + " \n", + "def check_data(dataItemNo):\n", + " token = get_head_auth()\n", + " if not token:\n", + " return\n", + "\n", + " datas = get_data_value(token, dataItemNo)\n", + " if not datas:\n", + " return\n", + "\n", + "\n", + "def save_xls(append_rows):\n", + "\n", + " # 打开xls文件\n", + " workbook = xlrd.open_workbook('纯苯数据项.xls')\n", + "\n", + " # 获取所有sheet的个数\n", + " sheet_count = len(workbook.sheet_names())\n", + "\n", + " # 获取所有sheet的名称\n", + " sheet_names = workbook.sheet_names()\n", + "\n", + " new_workbook = xlwt.Workbook()\n", + " for i in range(sheet_count):\n", + " # 获取当前sheet\n", + " sheet = workbook.sheet_by_index(i)\n", + "\n", + " # 获取sheet的行数和列数\n", + " row_count = sheet.nrows\n", + " col_count = sheet.ncols\n", + " # 获取原有数据\n", + " data = []\n", + " for row in range(row_count):\n", + " row_data = []\n", + " for col in range(col_count):\n", + " row_data.append(sheet.cell_value(row, col))\n", + " data.append(row_data)\n", + " # 创建xlwt的Workbook对象\n", + " # 创建sheet\n", + " new_sheet = new_workbook.add_sheet(sheet_names[i])\n", + "\n", + " # 将原有的数据写入新的sheet\n", + " for row in range(row_count):\n", + " for col in range(col_count):\n", + " new_sheet.write(row, col, data[row][col])\n", + "\n", + " if i == 0:\n", + " # 在新的sheet中添加数据\n", + " for col in range(col_count):\n", + " new_sheet.write(row_count, col, append_rows[col])\n", + "\n", + " # 保存新的xls文件\n", + " new_workbook.save(\"纯苯数据项.xls\")\n", + "\n", + "\n", + "if __name__ == \"__main__\":\n", + " pass\n", + " # 需要单独运行放开\n", + " # start_1()\n", + "\n", + " # 每天定时12点运行\n", + " # while True:\n", + " # # 获取当前时间\n", + " # current_time = time.strftime(\"%H:%M:%S\", time.localtime())\n", + " # current_time_1 = time.strftime(\"%H:%M:%S\", time.localtime())\n", + "\n", + " # # 判断当前时间是否为执行任务的时间点\n", + " # if current_time == \"09:15:00\":\n", + " # print(\"执行定时任务\")\n", + " # start()\n", + "\n", + " # # 休眠1秒钟,避免过多占用CPU资源\n", + " # time.sleep(1)\n", + " \n", + " # elif current_time_1 == \"20:00:00\":\n", + " # print(\"更新数据\")\n", + " # start_1()\n", + " # time.sleep(1)\n", + "\n", + "\n", + "# # 检测数据准确性, 需要检测放开\n", + "# # check_data(\"100028098|LISTING_PRICE\")\n", + "# # check_data(\"9137070016544622XB|DAY_Yield\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20241017\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:280: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.602e+05, tolerance: 3.845e+04\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\magics\\pylab.py:162: UserWarning:\n", + "\n", + "pylab import has clobbered these variables: ['datetime', '__version__', 'plot', 'random']\n", + "`%matplotlib` prevents importing * from pylab and numpy\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:233: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:263: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-17 7541.753418\n", + "Name: 日度预测价格, dtype: float32\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20241017', 'dataStatus': 'add', 'dataValue': 7541.75}]}\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241018\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:280: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.716e+05, tolerance: 3.895e+04\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:233: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:263: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-18 7399.281738\n", + "Name: 日度预测价格, dtype: float32\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20241018', 'dataStatus': 'add', 'dataValue': 7399.28}]}\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241019\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:280: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.669e+05, tolerance: 3.913e+04\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:233: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:263: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-19 7404.584473\n", + "Name: 日度预测价格, dtype: float32\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20241019', 'dataStatus': 'add', 'dataValue': 7404.58}]}\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241020\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:280: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.833e+05, tolerance: 3.773e+04\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:233: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:263: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-20 7375.245605\n", + "Name: 日度预测价格, dtype: float32\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20241020', 'dataStatus': 'add', 'dataValue': 7375.25}]}\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241021\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:280: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.912e+05, tolerance: 3.684e+04\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:233: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:263: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-21 7272.15332\n", + "Name: 日度预测价格, dtype: float32\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20241021', 'dataStatus': 'add', 'dataValue': 7272.15}]}\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241022\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:280: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.991e+05, tolerance: 3.700e+04\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:233: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:263: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-22 7265.592773\n", + "Name: 日度预测价格, dtype: float32\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20241022', 'dataStatus': 'add', 'dataValue': 7265.59}]}\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241023\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:280: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.866e+05, tolerance: 3.682e+04\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:233: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:263: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-23 7314.694336\n", + "Name: 日度预测价格, dtype: float32\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20241023', 'dataStatus': 'add', 'dataValue': 7314.69}]}\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241024\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:280: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.886e+05, tolerance: 3.690e+04\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:233: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:263: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-24 7340.938477\n", + "Name: 日度预测价格, dtype: float32\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20241024', 'dataStatus': 'add', 'dataValue': 7340.94}]}\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241025\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:280: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.843e+05, tolerance: 3.691e+04\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:233: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:263: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-25 7299.914062\n", + "Name: 日度预测价格, dtype: float32\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20241025', 'dataStatus': 'add', 'dataValue': 7299.91}]}\n", + "{\"confirmFlg\":false,\"status\":true}\n" + ] + } + ], + "source": [ + "from datetime import datetime, timedelta\n", + "\n", + "start_date = datetime(2024, 10, 17)\n", + "end_date = datetime(2024, 10, 26)\n", + "\n", + "while start_date < end_date:\n", + " print(start_date.strftime('%Y%m%d'))\n", + " start(start_date)\n", + " # time.sleep(1)\n", + " # start_1(start_date)\n", + " start_date += timedelta(days=1)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "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.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/aisenzhecode/石油苯/纯苯数据项.xls b/aisenzhecode/石油苯/纯苯数据项.xls new file mode 100644 index 0000000000000000000000000000000000000000..5c50fdfa9794f3c5e26d8e166701d26b57b769ae GIT binary patch literal 147968 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\n", + " window.PlotlyConfig = {MathJaxConfig: 'local'};\n", + " if (window.MathJax && window.MathJax.Hub && window.MathJax.Hub.Config) {window.MathJax.Hub.Config({SVG: {font: \"STIX-Web\"}});}\n", + " if (typeof require !== 'undefined') {\n", + " require.undef(\"plotly\");\n", + " requirejs.config({\n", + " paths: {\n", + " 'plotly': ['https://cdn.plot.ly/plotly-2.12.1.min']\n", + " }\n", + " });\n", + " require(['plotly'], function(Plotly) {\n", + " window._Plotly = Plotly;\n", + " });\n", + " }\n", + " \n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import requests\n", + "import json\n", + "import xlrd\n", + "import xlwt\n", + "from datetime import datetime\n", + "import time\n", + "# 变量定义\n", + "login_url = \"http://10.200.32.39/jingbo-api/api/server/login\"\n", + "search_url = \"http://10.200.32.39/jingbo-api/api/warehouse/dwDataItem/queryByItemNos\"\n", + "\n", + "login_push_url = \"http://10.200.32.39/jingbo-api/api/server/login\"\n", + "upload_url = \"http://10.200.32.39/jingbo-api/api/dw/dataValue/pushDataValueList\"\n", + "\n", + "login_data = {\n", + " \"data\": {\n", + " \"account\": \"api_dev\",\n", + " \"password\": \"ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U=\",\n", + " \"tenantHashCode\": \"8a4577dbd919675758d57999a1e891fe\",\n", + " \"terminal\": \"API\"\n", + " },\n", + " \"funcModule\": \"API\",\n", + " \"funcOperation\": \"获取token\"\n", + "}\n", + "\n", + "login_push_data = {\n", + " \"data\": {\n", + " \"account\": \"api_dev\",\n", + " \"password\": \"ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U=\",\n", + " \"tenantHashCode\": \"8a4577dbd919675758d57999a1e891fe\",\n", + " \"terminal\": \"API\"\n", + " },\n", + " \"funcModule\": \"API\",\n", + " \"funcOperation\": \"获取token\"\n", + "}\n", + "\n", + "read_file_path_name = \"丙烯基础数据收集表.xls\"\n", + "one_cols = []\n", + "two_cols = []\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sn\n", + "import random\n", + "import time\n", + "\n", + "\n", + "\n", + "\n", + "from plotly import __version__\n", + "from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot\n", + "\n", + "from sklearn import preprocessing\n", + "\n", + "from pandas import Series,DataFrame\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import sklearn.datasets as datasets\n", + "\n", + "#导入机器学习算法模型\n", + "from sklearn.linear_model import Lasso\n", + "from xgboost import XGBRegressor\n", + "\n", + "import datetime\n", + "import statsmodels.api as sm\n", + "try:\n", + " from keras.preprocessing.sequence import TimeseriesGenerator\n", + "except:\n", + " from tensorflow.keras.preprocessing.sequence import TimeseriesGenerator\n", + "\n", + "import plotly.express as px\n", + "import plotly.graph_objects as go\n", + "\n", + "import xgboost as xgb\n", + "from xgboost import plot_importance, plot_tree\n", + "from sklearn.metrics import mean_absolute_error\n", + "from statsmodels.tools.eval_measures import mse,rmse\n", + "from sklearn.model_selection import GridSearchCV\n", + "from xgboost import XGBRegressor\n", + "import warnings\n", + "import pickle\n", + "\n", + "from sklearn.metrics import mean_squared_error\n", + "\n", + "#切割训练数据和样本数据\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "#用于模型评分\n", + "from sklearn.metrics import r2_score\n", + "\n", + "le = preprocessing.LabelEncoder()\n", + "\n", + "# print(__version__) # requires version >= 1.9.0\n", + "\n", + "\n", + "import cufflinks as cf\n", + "cf.go_offline()\n", + "\n", + "random.seed(100)\n", + "\n", + "%matplotlib inline\n", + "\n", + "# 数据获取\n", + "\n", + "def get_head_auth():\n", + " login_res = requests.post(url=login_url, json=login_data, timeout=(3, 5))\n", + " text = json.loads(login_res.text)\n", + " if text[\"status\"]:\n", + " token = text[\"data\"][\"accessToken\"]\n", + " return token\n", + " else:\n", + " print(\"获取认证失败\")\n", + " return None\n", + "\n", + "\n", + "def get_data_value(token, dataItemNoList,date):\n", + " search_data = {\n", + " \"data\": {\n", + " \"date\": get_cur_time(date)[0],\n", + " \"dataItemNoList\": dataItemNoList\n", + " },\n", + " \"funcModule\": \"数据项\",\n", + " \"funcOperation\": \"查询\"\n", + " }\n", + " headers = {\"Authorization\": token}\n", + " search_res = requests.post(url=search_url, headers=headers, json=search_data, timeout=(3, 5))\n", + " search_value = json.loads(search_res.text)[\"data\"]\n", + " if search_value:\n", + " return search_value\n", + " else:\n", + " print(\"今天没有新数据\")\n", + " return search_value\n", + "\n", + "\n", + "# xls文件处理\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "def write_xls(data):\n", + " # 创建一个Workbook对象\n", + " workbook = xlwt.Workbook()\n", + "\n", + " # 创建一个Sheet对象,可指定名称\n", + " sheet = workbook.load('Sheet1')\n", + "\n", + " # 写入数据行\n", + " for row_index, row_data in enumerate(data):\n", + " for col_index, cell_data in enumerate(row_data):\n", + " sheet.write(row_index, col_index, cell_data)\n", + "\n", + " # 保存Workbook到文件\n", + " workbook.save(get_cur_time()[0] + '.xls')\n", + "\n", + "\n", + "def get_cur_time(date = ''):\n", + " if date == '':\n", + " import datetime\n", + " now = datetime.datetime.now()\n", + " else:\n", + " now = date\n", + " year = now.year\n", + " month = now.month\n", + " day = now.day\n", + "\n", + " if month < 10:\n", + " month = \"0\" + str(month)\n", + " if day < 10:\n", + " day = \"0\" + str(day)\n", + " cur_time = str(year) + str(month) + str(day)\n", + " cur_time2 = str(year) + \"-\" + str(month) + \"-\" + str(day)\n", + "# cur_time = '20231011'\n", + "# cur_time2 = '2023-10-11'\n", + " return cur_time, cur_time2\n", + "\n", + "\n", + "def get_head_push_auth():\n", + " login_res = requests.post(url=login_push_url, json=login_push_data, timeout=(3, 5))\n", + " text = json.loads(login_res.text)\n", + " if text[\"status\"]:\n", + " token = text[\"data\"][\"accessToken\"]\n", + " return token\n", + " else:\n", + " print(\"获取认证失败\")\n", + " return None\n", + "\n", + "\n", + "\n", + "def upload_data_to_system(token_push,date):\n", + " data = {\n", + " \"funcModule\": \"数据表信息列表\",\n", + " \"funcOperation\": \"新增\",\n", + " \"data\": [\n", + " {\"dataItemNo\": \"C01100007|Forecast_Price|ACN\",\n", + " \"dataDate\": get_cur_time(date)[0],\n", + " \"dataStatus\": \"add\",\n", + "# \"dataValue\": 7100\n", + " \"dataValue\": forecast_price()\n", + " }\n", + "\n", + " ]\n", + " }\n", + " headers = {\"Authorization\": token_push}\n", + " res = requests.post(url=upload_url, headers=headers, json=data, timeout=(3, 5))\n", + " print(res.text)\n", + "\n", + " \n", + "# def upload_data_to_system(token):\n", + "# data = {\n", + "# \"funcModule\": \"数据表信息列表\",\n", + "# \"funcOperation\": \"新增\",\n", + "# \"data\": [\n", + "# {\"dataItemNo\": \"C01100036|Forecast_ Price|ACN\",\n", + "# \"dataDate\": '20230706',\n", + "# \"dataStatus\": \"add\",\n", + "# \"dataValue\": 3780.0\n", + "# }\n", + "\n", + "# ]\n", + "# }\n", + "# headers = {\"Authorization\": token}\n", + "# res = requests.post(url=upload_url, headers=headers, json=data, timeout=(3, 5))\n", + "# print(res.text)\n", + "\n", + " \n", + " \n", + "def forecast_price():\n", + " # df_test = pd.read_csv('定价模型数据收集0212.csv')\n", + " df_test = pd.read_excel('丙烯基础数据收集表.xls')\n", + " df_test.drop([0],inplace=True)\n", + " try:\n", + " df_test['Date']=pd.to_datetime(df_test['Date'], format='%m/%d/%Y',infer_datetime_format=True)\n", + " except:\n", + " df_test['Date']=pd.to_datetime(df_test['Date'], format=r'%Y-%m-%d',infer_datetime_format=True)\n", + "\n", + " #将缺失值补为前一个或者后一个数值\n", + " df_test_1 = df_test\n", + " df_test_1=df_test_1.fillna(df_test.ffill())\n", + " df_test_1=df_test_1.fillna(df_test_1.bfill())\n", + "\n", + " # 选择用于模型训练的列名称\n", + " col_for_training = df_test_1.columns\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " import joblib\n", + " Best_model_DalyLGPrice = joblib.load(\"日度价格预测_丙烯最佳模型.pkl\")\n", + " # 最新的一天为最后一行的数据\n", + " \n", + " df_test_1_Day = df_test_1.tail(1)\n", + " # 移除不需要的列\n", + " df_test_1_Day.index = df_test_1_Day[\"Date\"]\n", + " df_test_1_Day = df_test_1_Day.drop([\"Date\"], axis= 1)\n", + " df_test_1_Day=df_test_1_Day.drop('Price',axis=1)\n", + " df_test_1_Day=df_test_1_Day.dropna()\n", + "\n", + " \n", + " for col in df_test_1_Day.columns:\n", + " df_test_1_Day[col] = pd.to_numeric(df_test_1_Day[col],errors='coerce')\n", + " #预测今日价格,显示至小数点后两位\n", + " Ypredict_Today=Best_model_DalyLGPrice.predict(df_test_1_Day)\n", + "\n", + " df_test_1_Day['日度预测价格']=Ypredict_Today\n", + " print(df_test_1_Day['日度预测价格'])\n", + " a = df_test_1_Day['日度预测价格']\n", + " a = a[0]\n", + " a = float(a)\n", + " a = round(a,2)\n", + " return a\n", + "def optimize_Model():\n", + " from sklearn.model_selection import train_test_split\n", + " from sklearn.impute import SimpleImputer\n", + " from sklearn.preprocessing import OrdinalEncoder\n", + " from sklearn.feature_selection import SelectFromModel\n", + " from sklearn.metrics import mean_squared_error, r2_score\n", + " import pandas as pd\n", + "\n", + " pd.set_option('display.max_rows',40) \n", + " pd.set_option('display.max_columns',40) \n", + " df_test = pd.read_excel('丙烯基础数据收集表.xls')\n", + " df_test.drop([0],inplace=True)\n", + " try:\n", + " df_test['Date']=pd.to_datetime(df_test['Date'], format='%m/%d/%Y',infer_datetime_format=True)\n", + " except:\n", + " df_test['Date']=pd.to_datetime(df_test['Date'], format=r'%Y-%m-%d',infer_datetime_format=True)\n", + "\n", + " #查看每个特征缺失值数量\n", + " MisVal_Check=df_test.isnull().sum().sort_values(ascending=False)\n", + " #去掉缺失值百分比>0.4的特征,去掉这些特征后的新表格命名为df_test_1\n", + " df_MisVal_Check = pd.DataFrame(MisVal_Check,)#\n", + " df_MisVal_Check_1=df_MisVal_Check.reset_index()\n", + " df_MisVal_Check_1.columns=['Variable_Name','Missing_Number'] \n", + " df_MisVal_Check_1['Missing_Number']=df_MisVal_Check_1['Missing_Number']/len(df_test)\n", + " df_test_1=df_test.drop(df_MisVal_Check_1[df_MisVal_Check_1['Missing_Number']>0.4].Variable_Name,axis = 1)\n", + " #将缺失值补为前一个或者后一个数值\n", + " df_test_1 = df_test\n", + " df_test_1=df_test_1.fillna(df_test.ffill())\n", + " df_test_1=df_test_1.fillna(df_test_1.bfill())\n", + " df_test_1[\"Date\"] = pd.to_datetime(df_test_1[\"Date\"])\n", + " df_test_1.index = df_test_1[\"Date\"]\n", + " df_test_1 = df_test_1.drop([\"Date\"], axis= 1)\n", + " df_test_1 = df_test_1.astype('float')\n", + " import numpy as np\n", + " import pandas as pd\n", + " from pandas import Series,DataFrame\n", + "\n", + " import matplotlib.pyplot as plt\n", + "\n", + " import sklearn.datasets as datasets\n", + "\n", + " #导入机器学习算法模型\n", + " from sklearn.linear_model import Lasso\n", + " from xgboost import XGBRegressor\n", + "\n", + " from datetime import datetime\n", + " import statsmodels.api as sm\n", + " try:\n", + " from keras.preprocessing.sequence import TimeseriesGenerator\n", + " except:\n", + " from tensorflow.keras.preprocessing.sequence import TimeseriesGenerator\n", + "\n", + " import plotly.express as px\n", + " import plotly.graph_objects as go\n", + "\n", + " import xgboost as xgb\n", + " from xgboost import plot_importance, plot_tree\n", + " from sklearn.metrics import mean_absolute_error\n", + " from statsmodels.tools.eval_measures import mse,rmse\n", + " from sklearn.model_selection import GridSearchCV\n", + " from xgboost import XGBRegressor\n", + " import warnings\n", + " import pickle\n", + "\n", + " from sklearn.metrics import mean_squared_error\n", + "\n", + " #切割训练数据和样本数据\n", + " from sklearn.model_selection import train_test_split\n", + "\n", + " #用于模型评分\n", + " from sklearn.metrics import r2_score\n", + "\n", + " dataset1=df_test_1.drop('Price',axis=1)#.astype(float)\n", + "\n", + " y=df_test_1['Price']\n", + "\n", + " x=dataset1 \n", + "\n", + " train = x\n", + " target = y\n", + "\n", + " #切割数据样本集合测试集\n", + " X_train,x_test,y_train,y_true = train_test_split(train,target,test_size=0.2,random_state=0)\n", + "\n", + " #模型缩写\n", + " Lasso = Lasso(random_state=0)\n", + " XGBR = XGBRegressor(random_state=0)\n", + " #训练模型\n", + " Lasso.fit(X_train,y_train)\n", + " XGBR.fit(X_train,y_train)\n", + " #模型拟合\n", + " y_pre_Lasso = Lasso.predict(x_test)\n", + " y_pre_XGBR = XGBR.predict(x_test)\n", + "\n", + " #计算Lasso、XGBR、RandomForestR、AdaBoostR、GradientBoostingR、BaggingRegressor各模型的R²\n", + " Lasso_score = r2_score(y_true,y_pre_Lasso)\n", + " XGBR_score=r2_score(y_true,y_pre_XGBR)\n", + "\n", + " #计算Lasso、XGBR的MSE和RMSE\n", + " Lasso_MSE=mean_squared_error(y_true, y_pre_Lasso)\n", + " XGBR_MSE=mean_squared_error(y_true, y_pre_XGBR)\n", + "\n", + " Lasso_RMSE=np.sqrt(Lasso_MSE)\n", + " XGBR_RMSE=np.sqrt(XGBR_MSE)\n", + " # 将不同模型的不同误差值整合成一个表格\n", + " model_results = pd.DataFrame([['Lasso', Lasso_RMSE, Lasso_score],\n", + " ['XgBoost', XGBR_RMSE, XGBR_score]],\n", + " columns = ['模型(Model)','均方根误差(RMSE)', 'R^2 score'])\n", + " #将模型名称(Model)列设置为索引\n", + " model_results1=model_results.set_index('模型(Model)')\n", + "\n", + " model_results1\n", + " #定义plot_feature_importance函数,该函数用于计算特征重要性。此部分代码无需调整\n", + " def plot_feature_importance(importance,names,model_type):\n", + " feature_importance = np.array(importance)\n", + " feature_names = np.array(names)\n", + "\n", + " data={'feature_names':feature_names,'feature_importance':feature_importance}\n", + " fi_df = pd.DataFrame(data)\n", + "\n", + " fi_df.sort_values(by=['feature_importance'], ascending=False,inplace=True)\n", + "\n", + " plt.figure(figsize=(10,8))\n", + " sn.barplot(x=fi_df['feature_importance'], y=fi_df['feature_names'])\n", + "\n", + " plt.title(model_type + \" \"+'FEATURE IMPORTANCE')\n", + " plt.xlabel('FEATURE IMPORTANCE')\n", + " plt.ylabel('FEATURE NAMES')\n", + " from pylab import mpl\n", + " %pylab\n", + " mpl.rcParams['font.sans-serif'] = ['SimHei']\n", + " ## Xgboost 模型参数优化-初步\n", + " #参考: https://juejin.im/post/6844903661013827598 \n", + " #每次调参时,备选参数数值以同数量级的1、3、10设置即可(比如设置1、3、10,或0.1、0.3、1.0,或0.01,0.03,0.10即可)\n", + "\n", + " from xgboost import XGBRegressor\n", + " from sklearn.model_selection import GridSearchCV\n", + "\n", + " estimator = XGBRegressor(random_state=0,\n", + " nthread=4,\n", + " seed=0\n", + " )\n", + " parameters = {\n", + " 'max_depth': range (2, 11, 2), # 树的最大深度\n", + " 'n_estimators': range (50, 101, 10), # 迭代次数\n", + " 'learning_rate': [0.01, 0.03, 0.1, 0.3, 0.5, 1]\n", + " }\n", + "\n", + " grid_search_XGB = GridSearchCV(\n", + " estimator=estimator,\n", + " param_grid=parameters,\n", + " # n_jobs = 10,\n", + " cv = 3,\n", + " verbose=True\n", + " )\n", + "\n", + " grid_search_XGB.fit(X_train, y_train)\n", + " #如果电脑在此步骤报错,可能是因为计算量太大,超过硬件可支持程度,可注释掉“n_jobs=10”一行\n", + "\n", + " best_parameters = grid_search_XGB.best_estimator_.get_params()\n", + " y_pred = grid_search_XGB.predict(x_test)\n", + "\n", + " op_XGBR_score = r2_score(y_true,y_pred)\n", + " op_XGBR_MSE= mean_squared_error(y_true, y_pred)\n", + " op_XGBR_RMSE= np.sqrt(op_XGBR_MSE)\n", + "\n", + " model_results2 = pd.DataFrame([['Optimized_Xgboost', op_XGBR_RMSE, op_XGBR_score]],\n", + " columns = ['模型(Model)', '均方根误差(RMSE)', 'R^2 score'])\n", + " model_results2=model_results2.set_index('模型(Model)')\n", + "\n", + " try:\n", + " results = model_results1.append(model_results2, ignore_index = False)\n", + " except:\n", + " results = pd.concat([model_results1,model_results2],ignore_index= True)\n", + " import pickle\n", + "\n", + " Pkl_Filename = \"日度价格预测_丙烯最佳模型.pkl\" \n", + "\n", + " with open(Pkl_Filename, 'wb') as file: \n", + " pickle.dump(grid_search_XGB, file)\n", + "\n", + "\n", + " \n", + "\n", + "def read_xls_data():\n", + " global one_cols, two_cols\n", + " # 打开 XLS 文件\n", + " workbook = xlrd.open_workbook(read_file_path_name)\n", + "\n", + " # 获取所有表格名称\n", + " # sheet_names = workbook.sheet_names()\n", + "\n", + " # 选择第一个表格\n", + " sheet = workbook.sheet_by_index(0)\n", + "\n", + " # 获取行数和列数\n", + " num_rows = sheet.nrows\n", + " # num_cols = sheet.ncols\n", + "\n", + " # 遍历每一行,获取单元格数据\n", + " # for i in range(num_rows):\n", + " # row_data = sheet.row_values(i)\n", + " # one_cols.append(row_data)\n", + " # two_cols.append(row_data[1])\n", + "\n", + " row_data = sheet.row_values(1)\n", + " one_cols = row_data\n", + "\n", + " # 关闭 XLS 文件\n", + " # workbook.close()\n", + "\n", + "\n", + "\n", + "\n", + "def start(date):\n", + " read_xls_data()\n", + "\n", + " token = get_head_auth()\n", + " if not token:\n", + " return\n", + " token_push = get_head_push_auth()\n", + " if not token_push:\n", + " return\n", + "\n", + " datas = get_data_value(token, one_cols[1:],date)\n", + "# if not datas:\n", + "# return\n", + "\n", + " # data_list = [two_cols, one_cols]\n", + " append_rows = [get_cur_time(date)[1]]\n", + " dataItemNo_dataValue = {}\n", + " for data_value in datas:\n", + " if \"dataValue\" not in data_value:\n", + " print(data_value)\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = \"\"\n", + " else:\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = data_value[\"dataValue\"]\n", + " \n", + " for value in one_cols[1:]:\n", + " if value in dataItemNo_dataValue:\n", + " append_rows.append(dataItemNo_dataValue[value])\n", + " else:\n", + " append_rows.append(\"\")\n", + " save_xls(append_rows)\n", + " optimize_Model()\n", + " upload_data_to_system(token_push,date)\n", + " # data_list.append(three_cols)\n", + " # write_xls(data_list)\n", + "\n", + "\n", + "def start_1(date=''):\n", + " '''更新数据'''\n", + " read_xls_data()\n", + "\n", + " token = get_head_auth()\n", + " if not token:\n", + " return\n", + " \n", + "\n", + " datas = get_data_value(token, one_cols[1:],date)\n", + " if not datas:\n", + " return\n", + "\n", + " # data_list = [two_cols, one_cols]\n", + " append_rows = [get_cur_time(date=date)[1]]\n", + " dataItemNo_dataValue = {}\n", + " for data_value in datas:\n", + " if \"dataValue\" not in data_value:\n", + " print(data_value)\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = \"\"\n", + " else:\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = data_value[\"dataValue\"]\n", + " \n", + " for value in one_cols[1:]:\n", + " if value in dataItemNo_dataValue:\n", + " append_rows.append(dataItemNo_dataValue[value])\n", + " else:\n", + " append_rows.append(\"\")\n", + " print('新增数据:',append_rows)\n", + " save_xls_1(append_rows)\n", + "\n", + " \n", + " # data_list.append(three_cols)\n", + " # write_xls(data_list)\n", + " \n", + "\n", + "\n", + "def start_2(date):\n", + " workbook = xlrd.open_workbook(read_file_path_name)\n", + "\n", + "\n", + "\n", + " # 选择第一个表格\n", + " sheet = workbook.sheet_by_index(0)\n", + "\n", + " # 获取行数和列数\n", + " num_rows = sheet.nrows\n", + "\n", + "\n", + "\n", + " row_data = sheet.row_values(1)\n", + " one_cols = row_data\n", + "\n", + "\n", + " login_res = requests.post(url=login_url, json=login_data, timeout=(3, 5))\n", + " text = json.loads(login_res.text)\n", + " if text[\"status\"]:\n", + " token = text[\"data\"][\"accessToken\"]\n", + " else:\n", + " print(\"获取认证失败\")\n", + " token = None\n", + "\n", + "\n", + " now = date\n", + " year = now.year\n", + " month = now.month\n", + " day = now.day\n", + "\n", + " if month < 10:\n", + " month = \"0\" + str(month)\n", + " if day < 10:\n", + " day = \"0\" + str(day)\n", + " cur_time = str(year) + str(month) + str(day)\n", + " cur_time2 = str(year) + \"-\" + str(month) + \"-\" + str(day)\n", + " search_data = {\n", + " \"data\": {\n", + " \"date\": cur_time,\n", + " \"dataItemNoList\": one_cols[1:]\n", + " },\n", + " \"funcModule\": \"数据项\",\n", + " \"funcOperation\": \"查询\"\n", + " }\n", + " headers = {\"Authorization\": token}\n", + " search_res = requests.post(url=search_url, headers=headers, json=search_data, timeout=(3, 5))\n", + " search_value = json.loads(search_res.text)[\"data\"]\n", + "# datas = search_value\n", + " if search_value:\n", + " datas = search_value\n", + " else :\n", + " datas = None\n", + " \n", + "\n", + " append_rows = [cur_time2]\n", + " dataItemNo_dataValue = {}\n", + "# for data_value in datas:\n", + "# dataItemNo_dataValue[data_value[\"dataItemNo\"]] = data_value[\"dataValue\"]\n", + " for data_value in datas:\n", + " if \"dataValue\" not in data_value:\n", + " print(data_value)\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = \"\"\n", + " else:\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = data_value[\"dataValue\"]\n", + " for value in one_cols[1:]:\n", + " if value in dataItemNo_dataValue:\n", + " append_rows.append(dataItemNo_dataValue[value])\n", + " else:\n", + " append_rows.append(\"\")\n", + "\n", + " workbook = xlrd.open_workbook(read_file_path_name)\n", + "\n", + " # 获取所有sheet的个数\n", + " sheet_count = len(workbook.sheet_names())\n", + "\n", + " # 获取所有sheet的名称\n", + " sheet_names = workbook.sheet_names()\n", + "\n", + " new_workbook = xlwt.Workbook()\n", + " for i in range(sheet_count):\n", + " # 获取当前sheet\n", + " sheet = workbook.sheet_by_index(i)\n", + "\n", + " # 获取sheet的行数和列数\n", + " row_count = sheet.nrows\n", + " col_count = sheet.ncols\n", + " # 获取原有数据\n", + " data = []\n", + " for row in range(row_count):\n", + " row_data = []\n", + " for col in range(col_count):\n", + " row_data.append(sheet.cell_value(row, col))\n", + " data.append(row_data)\n", + " # 创建xlwt的Workbook对象\n", + " # 创建sheet\n", + " new_sheet = new_workbook.add_sheet(sheet_names[i])\n", + "\n", + " # 将原有的数据写入新的sheet\n", + " for row in range(row_count):\n", + " for col in range(col_count):\n", + " new_sheet.write(row, col, data[row][col])\n", + "\n", + " if i == 0:\n", + " # 在新的sheet中添加数据\n", + " for col in range(col_count):\n", + " new_sheet.write(row_count, col, append_rows[col])\n", + "\n", + " # 保存新的xls文件\n", + " new_workbook.save(read_file_path_name)\n", + " print('关闭文件')\n", + "\n", + "\n", + "def save_xls_1(append_rows):\n", + "\n", + " # 打开xls文件\n", + " workbook = xlrd.open_workbook('丙烯基础数据收集表.xls')\n", + "\n", + " # 获取所有sheet的个数\n", + " sheet_count = len(workbook.sheet_names())\n", + "\n", + " # 获取所有sheet的名称\n", + " sheet_names = workbook.sheet_names()\n", + "\n", + " new_workbook = xlwt.Workbook()\n", + " for i in range(sheet_count):\n", + " # 获取当前sheet\n", + " sheet = workbook.sheet_by_index(i)\n", + "\n", + " # 获取sheet的行数和列数\n", + " row_count = sheet.nrows - 1\n", + " col_count = sheet.ncols\n", + " # 获取原有数据\n", + " data = []\n", + " for row in range(row_count):\n", + " row_data = []\n", + " for col in range(col_count):\n", + " row_data.append(sheet.cell_value(row, col))\n", + " data.append(row_data)\n", + " # 创建xlwt的Workbook对象\n", + " # 创建sheet\n", + " new_sheet = new_workbook.add_sheet(sheet_names[i])\n", + "\n", + " # 将原有的数据写入新的sheet\n", + " for row in range(row_count):\n", + " for col in range(col_count):\n", + " new_sheet.write(row, col, data[row][col])\n", + "\n", + " if i == 0:\n", + " # 在新的sheet中添加数据\n", + " for col in range(col_count):\n", + " new_sheet.write(row_count, col, append_rows[col])\n", + "\n", + " # 保存新的xls文件\n", + " new_workbook.save(\"丙烯基础数据收集表.xls\") \n", + "\n", + " \n", + " \n", + " \n", + "def check_data(dataItemNo):\n", + " token = get_head_auth()\n", + " if not token:\n", + " return\n", + "\n", + " datas = get_data_value(token, dataItemNo)\n", + " if not datas:\n", + " return\n", + "\n", + "\n", + "def save_xls(append_rows):\n", + "\n", + " # 打开xls文件\n", + " workbook = xlrd.open_workbook('丙烯基础数据收集表.xls')\n", + "\n", + " # 获取所有sheet的个数\n", + " sheet_count = len(workbook.sheet_names())\n", + "\n", + " # 获取所有sheet的名称\n", + " sheet_names = workbook.sheet_names()\n", + "\n", + " new_workbook = xlwt.Workbook()\n", + " for i in range(sheet_count):\n", + " # 获取当前sheet\n", + " sheet = workbook.sheet_by_index(i)\n", + "\n", + " # 获取sheet的行数和列数\n", + " row_count = sheet.nrows\n", + " col_count = sheet.ncols\n", + " # 获取原有数据\n", + " data = []\n", + " for row in range(row_count):\n", + " row_data = []\n", + " for col in range(col_count):\n", + " row_data.append(sheet.cell_value(row, col))\n", + " data.append(row_data)\n", + " # 创建xlwt的Workbook对象\n", + " # 创建sheet\n", + " new_sheet = new_workbook.add_sheet(sheet_names[i])\n", + "\n", + " # 将原有的数据写入新的sheet\n", + " for row in range(row_count):\n", + " for col in range(col_count):\n", + " new_sheet.write(row, col, data[row][col])\n", + "\n", + " if i == 0:\n", + " # 在新的sheet中添加数据\n", + " for col in range(col_count):\n", + " new_sheet.write(row_count, col, append_rows[col])\n", + "\n", + " # 保存新的xls文件\n", + " new_workbook.save(\"丙烯基础数据收集表.xls\")\n", + "\n", + "\n", + "if __name__ == \"__main__\":\n", + " pass\n", + "# # 需要单独运行放开\n", + "# start()\n", + "\n", + "# 每天定时12点运行\n", + " # while True:\n", + " # # 获取当前时间\n", + " # current_time = time.strftime(\"%H:%M:%S\", time.localtime())\n", + " # current_time_1 = time.strftime(\"%H:%M:%S\", time.localtime())\n", + "\n", + " # # 判断当前时间是否为执行任务的时间点\n", + " # if current_time == \"09:20:00\":\n", + " # print(\"执行定时任务\")\n", + " # start()\n", + "\n", + " # # 休眠1秒钟,避免过多占用CPU资源\n", + " # time.sleep(1)\n", + " \n", + " # elif current_time_1 == \"20:00:00\":\n", + " # print(\"更新数据\")\n", + " # start_1()\n", + " # time.sleep(1)\n", + "\n", + "\n", + " # 检测数据准确性, 需要检测放开\n", + " # check_data(\"100028098|LISTING_PRICE\")\n", + " # check_data(\"9137070016544622XB|DAY_Yield\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20241017\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:287: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:289: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\magics\\pylab.py:162: UserWarning:\n", + "\n", + "pylab import has clobbered these variables: ['plot', 'datetime', 'random', '__version__']\n", + "`%matplotlib` prevents importing * from pylab and numpy\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:234: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:236: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:270: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-17 6953.115234\n", + "Name: 日度预测价格, dtype: float32\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241018\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:287: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:289: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:234: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:236: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:270: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-18 6949.200684\n", + "Name: 日度预测价格, dtype: float32\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241019\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:287: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:289: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:234: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:236: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:270: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-19 6949.064941\n", + "Name: 日度预测价格, dtype: float32\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241020\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:287: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:289: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:234: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:236: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:270: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-20 6949.524414\n", + "Name: 日度预测价格, dtype: float32\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241021\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:287: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:289: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:234: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:236: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:270: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-21 6951.338867\n", + "Name: 日度预测价格, dtype: float32\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241022\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:287: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:289: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:234: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:236: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:270: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-22 6999.318848\n", + "Name: 日度预测价格, dtype: float32\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241023\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:287: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:289: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:234: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:236: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:270: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-23 7048.455566\n", + "Name: 日度预测价格, dtype: float32\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241024\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:287: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:289: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:234: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:236: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:270: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-24 7098.654297\n", + "Name: 日度预测价格, dtype: float32\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241025\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:287: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:289: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:234: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:236: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13904\\1257534769.py:270: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-25 7098.378906\n", + "Name: 日度预测价格, dtype: float32\n", + "{\"confirmFlg\":false,\"status\":true}\n" + ] + } + ], + "source": [ + "from datetime import datetime, timedelta\n", + "\n", + "start_date = datetime(2024, 10, 17)\n", + "end_date = datetime(2024, 10, 26)\n", + "\n", + "while start_date < end_date:\n", + " print(start_date.strftime('%Y%m%d'))\n", + " start(start_date)\n", + " # time.sleep(1)\n", + " # start_2(start_date)\n", + " start_date += timedelta(days=1)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "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.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/aisenzhecode/聚合级丙烯/丙烯基础数据收集表.xls b/aisenzhecode/聚合级丙烯/丙烯基础数据收集表.xls new file mode 100644 index 0000000000000000000000000000000000000000..0bdfb5aa1b8a832d896dce94a28b7888d3cad397 GIT binary patch literal 190976 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�lL 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 literal 0 HcmV?d00001

pTOCv)6q2D6F2*1H4{Z=FW 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 b&l1??Qh6S1^PmJ@%i$P2|9>9;3\n", + " window.PlotlyConfig = {MathJaxConfig: 'local'};\n", + " if (window.MathJax && window.MathJax.Hub && window.MathJax.Hub.Config) {window.MathJax.Hub.Config({SVG: {font: \"STIX-Web\"}});}\n", + " if (typeof require !== 'undefined') {\n", + " require.undef(\"plotly\");\n", + " requirejs.config({\n", + " paths: {\n", + " 'plotly': ['https://cdn.plot.ly/plotly-2.12.1.min']\n", + " }\n", + " });\n", + " require(['plotly'], function(Plotly) {\n", + " window._Plotly = Plotly;\n", + " });\n", + " }\n", + " \n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import requests\n", + "import json\n", + "import xlrd\n", + "import xlwt\n", + "from datetime import datetime\n", + "import time\n", + "# 变量定义\n", + "login_url = \"http://10.200.32.39/jingbo-api/api/server/login\"\n", + "search_url = \"http://10.200.32.39/jingbo-api/api/warehouse/dwDataItem/queryByItemNos\"\n", + "\n", + "login_push_url = \"http://10.200.32.39/jingbo-api/api/server/login\"\n", + "upload_url = \"http://10.200.32.39/jingbo-api/api/dw/dataValue/pushDataValueList\"\n", + "\n", + "login_data = {\n", + " \"data\": {\n", + " \"account\": \"api_dev\",\n", + " \"password\": \"ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U=\",\n", + " \"tenantHashCode\": \"8a4577dbd919675758d57999a1e891fe\",\n", + " \"terminal\": \"API\"\n", + " },\n", + " \"funcModule\": \"API\",\n", + " \"funcOperation\": \"获取token\"\n", + "}\n", + "\n", + "login_push_data = {\n", + " \"data\": {\n", + " \"account\": \"api_dev\",\n", + " \"password\": \"ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U=\",\n", + " \"tenantHashCode\": \"8a4577dbd919675758d57999a1e891fe\",\n", + " \"terminal\": \"API\"\n", + " },\n", + " \"funcModule\": \"API\",\n", + " \"funcOperation\": \"获取token\"\n", + "}\n", + "\n", + "read_file_path_name = \"液化气数据.xls\"\n", + "one_cols = []\n", + "two_cols = []\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sn\n", + "import random\n", + "import time\n", + "\n", + "\n", + "\n", + "\n", + "from plotly import __version__\n", + "from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot\n", + "\n", + "from sklearn import preprocessing\n", + "\n", + "from pandas import Series,DataFrame\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import sklearn.datasets as datasets\n", + "\n", + "#导入机器学习算法模型\n", + "from sklearn.linear_model import Lasso\n", + "from xgboost import XGBRegressor\n", + "\n", + "import datetime\n", + "import statsmodels.api as sm\n", + "try:\n", + " from keras.preprocessing.sequence import TimeseriesGenerator\n", + "except:\n", + " from tensorflow.keras.preprocessing.sequence import TimeseriesGenerator\n", + "\n", + "import plotly.express as px\n", + "import plotly.graph_objects as go\n", + "\n", + "import xgboost as xgb\n", + "from xgboost import plot_importance, plot_tree\n", + "from sklearn.metrics import mean_absolute_error\n", + "from statsmodels.tools.eval_measures import mse,rmse\n", + "from sklearn.model_selection import GridSearchCV\n", + "from xgboost import XGBRegressor\n", + "import warnings\n", + "import pickle\n", + "\n", + "from sklearn.metrics import mean_squared_error\n", + "\n", + "#切割训练数据和样本数据\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "#用于模型评分\n", + "from sklearn.metrics import r2_score\n", + "\n", + "le = preprocessing.LabelEncoder()\n", + "\n", + "# print(__version__) # requires version >= 1.9.0\n", + "\n", + "\n", + "import cufflinks as cf\n", + "cf.go_offline()\n", + "\n", + "random.seed(100)\n", + "\n", + "%matplotlib inline\n", + "\n", + "# 数据获取\n", + "\n", + "def get_head_auth():\n", + " login_res = requests.post(url=login_url, json=login_data, timeout=(3, 5))\n", + " text = json.loads(login_res.text)\n", + " if text[\"status\"]:\n", + " token = text[\"data\"][\"accessToken\"]\n", + " return token\n", + " else:\n", + " print(\"获取认证失败\")\n", + " return None\n", + "\n", + "\n", + "def get_data_value(token, dataItemNoList,date):\n", + " search_data = {\n", + " \"data\": {\n", + " \"date\": get_cur_time(date)[0],\n", + " \"dataItemNoList\": dataItemNoList\n", + " },\n", + " \"funcModule\": \"数据项\",\n", + " \"funcOperation\": \"查询\"\n", + " }\n", + " headers = {\"Authorization\": token}\n", + " search_res = requests.post(url=search_url, headers=headers, json=search_data, timeout=(3, 5))\n", + " search_value = json.loads(search_res.text)[\"data\"]\n", + " if search_value:\n", + " return search_value\n", + " else:\n", + " print(\"今天没有新数据\")\n", + " return search_value\n", + "\n", + "\n", + "\n", + "# xls文件处理\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "def write_xls(data):\n", + " # 创建一个Workbook对象\n", + " workbook = xlwt.Workbook()\n", + "\n", + " # 创建一个Sheet对象,可指定名称\n", + " sheet = workbook.load('Sheet1')\n", + "\n", + " # 写入数据行\n", + " for row_index, row_data in enumerate(data):\n", + " for col_index, cell_data in enumerate(row_data):\n", + " sheet.write(row_index, col_index, cell_data)\n", + "\n", + " # 保存Workbook到文件\n", + " workbook.save(get_cur_time()[0] + '.xls')\n", + "\n", + "\n", + "def get_cur_time(date = ''):\n", + " if date == '':\n", + " import datetime\n", + " now = datetime.datetime.now()\n", + " else:\n", + " now = date\n", + " year = now.year\n", + " month = now.month\n", + " day = now.day\n", + "\n", + " if month < 10:\n", + " month = \"0\" + str(month)\n", + " if day < 10:\n", + " day = \"0\" + str(day)\n", + " cur_time = str(year) + str(month) + str(day)\n", + " cur_time2 = str(year) + \"-\" + str(month) + \"-\" + str(day)\n", + "# cur_time = '20231011'\n", + "# cur_time2 = '2023-10-11'\n", + " return cur_time, cur_time2\n", + "\n", + "\n", + "\n", + "def get_head_push_auth():\n", + " login_res = requests.post(url=login_push_url, json=login_push_data, timeout=(3, 5))\n", + " text = json.loads(login_res.text)\n", + " if text[\"status\"]:\n", + " token = text[\"data\"][\"accessToken\"]\n", + " return token\n", + " else:\n", + " print(\"获取认证失败\")\n", + " return None\n", + "\n", + "\n", + "\n", + "def upload_data_to_system(token_push,date):\n", + " data = {\n", + " \"funcModule\": \"数据表信息列表\",\n", + " \"funcOperation\": \"新增\",\n", + " \"data\": [\n", + " {\"dataItemNo\": \"250855713|Forecast_Price|ACN\",\n", + " \"dataDate\": get_cur_time(date)[0],\n", + " \"dataStatus\": \"add\",\n", + " \"dataValue\": forecast_price()\n", + " }\n", + "\n", + " ]\n", + " }\n", + " headers = {\"Authorization\": token_push}\n", + " res = requests.post(url=upload_url, headers=headers, json=data, timeout=(3, 5))\n", + " print(res.text)\n", + "\n", + " \n", + "# def upload_data_to_system(token):\n", + "# data = {\n", + "# \"funcModule\": \"数据表信息列表\",\n", + "# \"funcOperation\": \"新增\",\n", + "# \"data\": [\n", + "# {\"dataItemNo\": \"C01100036|Forecast_ Price|ACN\",\n", + "# \"dataDate\": '20230706',\n", + "# \"dataStatus\": \"add\",\n", + "# \"dataValue\": 3780.0\n", + "# }\n", + "\n", + "# ]\n", + "# }\n", + "# headers = {\"Authorization\": token}\n", + "# res = requests.post(url=upload_url, headers=headers, json=data, timeout=(3, 5))\n", + "# print(res.text)\n", + "\n", + " \n", + " \n", + "def forecast_price():\n", + " # df_test = pd.read_csv('定价模型数据收集0212.csv')\n", + " df_test = pd.read_excel('液化气数据.xls')\n", + " df_test.drop([0],inplace=True)\n", + " try:\n", + " df_test['Date']=pd.to_datetime(df_test['Date'], format='%m/%d/%Y',infer_datetime_format=True)\n", + " except:\n", + " df_test['Date']=pd.to_datetime(df_test['Date'], format=r'%Y-%m-%d',infer_datetime_format=True)\n", + "\n", + "\n", + " df_test_1 = df_test\n", + " df_test_1=df_test_1.fillna(df_test.ffill())\n", + " df_test_1=df_test_1.fillna(df_test_1.bfill())\n", + "\n", + " # 选择用于模型训练的列名称\n", + " col_for_training = df_test_1.columns\n", + "\n", + "\n", + "\n", + "\n", + " import joblib\n", + " Best_model_DalyLGPrice = joblib.load(\"日度价格预测_液化气最佳模型.pkl\")\n", + " # 最新的一天为最后一行的数据\n", + " \n", + " df_test_1_Day = df_test_1.tail(1)\n", + " # 移除不需要的列\n", + " df_test_1_Day.index = df_test_1_Day[\"Date\"]\n", + " df_test_1_Day = df_test_1_Day.drop([\"Date\"], axis= 1)\n", + " df_test_1_Day=df_test_1_Day.drop('Price',axis=1)\n", + " df_test_1_Day=df_test_1_Day.dropna()\n", + "\n", + " for col in df_test_1_Day.columns:\n", + " df_test_1_Day[col] = pd.to_numeric(df_test_1_Day[col],errors='coerce')\n", + " #预测今日价格,显示至小数点后两位\n", + " Ypredict_Today=Best_model_DalyLGPrice.predict(df_test_1_Day)\n", + "\n", + " df_test_1_Day['日度预测价格']=Ypredict_Today\n", + " print(df_test_1_Day['日度预测价格'])\n", + " a = df_test_1_Day['日度预测价格']\n", + " a = a[0]\n", + " a = float(a)\n", + " a = round(a,2)\n", + " return a\n", + "def optimize_Model():\n", + " from sklearn.model_selection import train_test_split\n", + " from sklearn.impute import SimpleImputer\n", + " from sklearn.preprocessing import OrdinalEncoder\n", + " from sklearn.feature_selection import SelectFromModel\n", + " from sklearn.metrics import mean_squared_error, r2_score\n", + " import pandas as pd\n", + "\n", + " pd.set_option('display.max_rows',40) \n", + " pd.set_option('display.max_columns',40) \n", + " df_test = pd.read_excel('液化气数据.xls')\n", + " df_test.drop([0],inplace=True)\n", + " try:\n", + " df_test['Date']=pd.to_datetime(df_test['Date'], format='%m/%d/%Y',infer_datetime_format=True)\n", + " except:\n", + " df_test['Date']=pd.to_datetime(df_test['Date'], format=r'%Y-%m-%d',infer_datetime_format=True)\n", + "\n", + " \n", + " #将缺失值补为前一个或者后一个数值\n", + " df_test_1 = df_test\n", + " df_test_1=df_test_1.fillna(df_test.ffill())\n", + " df_test_1=df_test_1.fillna(df_test_1.bfill())\n", + " df_test_1[\"Date\"] = pd.to_datetime(df_test_1[\"Date\"])\n", + " df_test_1.index = df_test_1[\"Date\"]\n", + " df_test_1 = df_test_1.drop([\"Date\"], axis= 1)\n", + " df_test_1 = df_test_1.astype('float')\n", + " \n", + " \n", + " import numpy as np\n", + " import pandas as pd\n", + " from pandas import Series,DataFrame\n", + "\n", + " import matplotlib.pyplot as plt\n", + "\n", + " import sklearn.datasets as datasets\n", + "\n", + " #导入机器学习算法模型\n", + " from sklearn.linear_model import Lasso\n", + " from xgboost import XGBRegressor\n", + "\n", + " from datetime import datetime\n", + " import statsmodels.api as sm\n", + " try:\n", + " from keras.preprocessing.sequence import TimeseriesGenerator\n", + " except:\n", + " from tensorflow.keras.preprocessing.sequence import TimeseriesGenerator\n", + "\n", + " import plotly.express as px\n", + " import plotly.graph_objects as go\n", + "\n", + " import xgboost as xgb\n", + " from xgboost import plot_importance, plot_tree\n", + " from sklearn.metrics import mean_absolute_error\n", + " from statsmodels.tools.eval_measures import mse,rmse\n", + " from sklearn.model_selection import GridSearchCV\n", + " from xgboost import XGBRegressor\n", + " import warnings\n", + " import pickle\n", + "\n", + " from sklearn.metrics import mean_squared_error\n", + "\n", + " #切割训练数据和样本数据\n", + " from sklearn.model_selection import train_test_split\n", + "\n", + " #用于模型评分\n", + " from sklearn.metrics import r2_score\n", + "\n", + " dataset1=df_test_1.drop('Price',axis=1)#.astype(float)\n", + "\n", + " y=df_test_1['Price']\n", + "\n", + " x=dataset1 \n", + "\n", + " train = x\n", + " target = y\n", + "\n", + " #切割数据样本集合测试集\n", + " X_train,x_test,y_train,y_true = train_test_split(train,target,test_size=0.2,random_state=0)\n", + "\n", + " #模型缩写\n", + " Lasso = Lasso(random_state=0)\n", + " XGBR = XGBRegressor(random_state=0)\n", + " #训练模型\n", + " Lasso.fit(X_train,y_train)\n", + " XGBR.fit(X_train,y_train)\n", + " #模型拟合\n", + " y_pre_Lasso = Lasso.predict(x_test)\n", + " y_pre_XGBR = XGBR.predict(x_test)\n", + "\n", + " #计算Lasso、XGBR、RandomForestR、AdaBoostR、GradientBoostingR、BaggingRegressor各模型的R²\n", + " Lasso_score = r2_score(y_true,y_pre_Lasso)\n", + " XGBR_score=r2_score(y_true,y_pre_XGBR)\n", + "\n", + " #计算Lasso、XGBR的MSE和RMSE\n", + " Lasso_MSE=mean_squared_error(y_true, y_pre_Lasso)\n", + " XGBR_MSE=mean_squared_error(y_true, y_pre_XGBR)\n", + "\n", + " Lasso_RMSE=np.sqrt(Lasso_MSE)\n", + " XGBR_RMSE=np.sqrt(XGBR_MSE)\n", + " # 将不同模型的不同误差值整合成一个表格\n", + " model_results = pd.DataFrame([['Lasso', Lasso_RMSE, Lasso_score],\n", + " ['XgBoost', XGBR_RMSE, XGBR_score]],\n", + " columns = ['模型(Model)','均方根误差(RMSE)', 'R^2 score'])\n", + " #将模型名称(Model)列设置为索引\n", + " model_results1=model_results.set_index('模型(Model)')\n", + "\n", + " model_results1\n", + " #定义plot_feature_importance函数,该函数用于计算特征重要性。此部分代码无需调整\n", + " def plot_feature_importance(importance,names,model_type):\n", + " feature_importance = np.array(importance)\n", + " feature_names = np.array(names)\n", + "\n", + " data={'feature_names':feature_names,'feature_importance':feature_importance}\n", + " fi_df = pd.DataFrame(data)\n", + "\n", + " fi_df.sort_values(by=['feature_importance'], ascending=False,inplace=True)\n", + "\n", + " plt.figure(figsize=(10,8))\n", + " sn.barplot(x=fi_df['feature_importance'], y=fi_df['feature_names'])\n", + "\n", + " plt.title(model_type + \" \"+'FEATURE IMPORTANCE')\n", + " plt.xlabel('FEATURE IMPORTANCE')\n", + " plt.ylabel('FEATURE NAMES')\n", + " from pylab import mpl\n", + " %pylab\n", + " mpl.rcParams['font.sans-serif'] = ['SimHei']\n", + " ## Xgboost 模型参数优化-初步\n", + " #参考: https://juejin.im/post/6844903661013827598 \n", + " #每次调参时,备选参数数值以同数量级的1、3、10设置即可(比如设置1、3、10,或0.1、0.3、1.0,或0.01,0.03,0.10即可)\n", + "\n", + " from xgboost import XGBRegressor\n", + " from sklearn.model_selection import GridSearchCV\n", + "\n", + " estimator = XGBRegressor(random_state=0,\n", + " nthread=4,\n", + " seed=0\n", + " )\n", + " parameters = {\n", + " 'max_depth': range (2, 11, 2), # 树的最大深度\n", + " 'n_estimators': range (50, 101, 10), # 迭代次数\n", + " 'learning_rate': [0.01, 0.03, 0.1, 0.3, 0.5, 1]\n", + " }\n", + "\n", + " grid_search_XGB = GridSearchCV(\n", + " estimator=estimator,\n", + " param_grid=parameters,\n", + " # n_jobs = 10,\n", + " cv = 3,\n", + " verbose=True\n", + " )\n", + "\n", + " grid_search_XGB.fit(X_train, y_train)\n", + " #如果电脑在此步骤报错,可能是因为计算量太大,超过硬件可支持程度,可注释掉“n_jobs=10”一行\n", + "\n", + " best_parameters = grid_search_XGB.best_estimator_.get_params()\n", + " y_pred = grid_search_XGB.predict(x_test)\n", + "\n", + " op_XGBR_score = r2_score(y_true,y_pred)\n", + " op_XGBR_MSE= mean_squared_error(y_true, y_pred)\n", + " op_XGBR_RMSE= np.sqrt(op_XGBR_MSE)\n", + "\n", + " model_results2 = pd.DataFrame([['Optimized_Xgboost', op_XGBR_RMSE, op_XGBR_score]],\n", + " columns = ['模型(Model)', '均方根误差(RMSE)', 'R^2 score'])\n", + " model_results2=model_results2.set_index('模型(Model)')\n", + "\n", + " try:\n", + " results = model_results1.append(model_results2, ignore_index = False)\n", + " except:\n", + " results = pd.concat([model_results1,model_results2],ignore_index=True)\n", + " import pickle\n", + "\n", + " Pkl_Filename = \"日度价格预测_液化气最佳模型.pkl\" \n", + "\n", + " with open(Pkl_Filename, 'wb') as file: \n", + " pickle.dump(grid_search_XGB, file)\n", + "\n", + "\n", + " \n", + "\n", + "def read_xls_data():\n", + " global one_cols, two_cols\n", + " # 打开 XLS 文件\n", + " workbook = xlrd.open_workbook(read_file_path_name)\n", + "\n", + " # 获取所有表格名称\n", + " # sheet_names = workbook.sheet_names()\n", + "\n", + " # 选择第一个表格\n", + " sheet = workbook.sheet_by_index(0)\n", + "\n", + " # 获取行数和列数\n", + " num_rows = sheet.nrows\n", + " # num_cols = sheet.ncols\n", + "\n", + " # 遍历每一行,获取单元格数据\n", + " # for i in range(num_rows):\n", + " # row_data = sheet.row_values(i)\n", + " # one_cols.append(row_data)\n", + " # two_cols.append(row_data[1])\n", + "\n", + " row_data = sheet.row_values(1)\n", + " one_cols = row_data\n", + "\n", + " # 关闭 XLS 文件\n", + " # workbook.close()\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "def start(date):\n", + " read_xls_data()\n", + "\n", + " token = get_head_auth()\n", + " if not token:\n", + " return\n", + " token_push = get_head_push_auth()\n", + " if not token_push:\n", + " return\n", + "\n", + " datas = get_data_value(token, one_cols[1:],date)\n", + "# if not datas:\n", + "# return\n", + "\n", + " # data_list = [two_cols, one_cols]\n", + " append_rows = [get_cur_time(date)[1]]\n", + " dataItemNo_dataValue = {}\n", + " for data_value in datas:\n", + " if \"dataValue\" not in data_value:\n", + " print(data_value)\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = \"\"\n", + " else:\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = data_value[\"dataValue\"]\n", + " \n", + " for value in one_cols[1:]:\n", + " if value in dataItemNo_dataValue:\n", + " append_rows.append(dataItemNo_dataValue[value])\n", + " else:\n", + " append_rows.append(\"\")\n", + " save_xls(append_rows)\n", + " optimize_Model()\n", + " upload_data_to_system(token_push,date)\n", + " # data_list.append(three_cols)\n", + " # write_xls(data_list)\n", + "\n", + "\n", + "def start_1():\n", + " read_xls_data()\n", + "\n", + " token = get_head_auth()\n", + " if not token:\n", + " return\n", + " \n", + "\n", + " datas = get_data_value(token, one_cols[1:])\n", + "# if not datas:\n", + "# return\n", + "\n", + " # data_list = [two_cols, one_cols]\n", + " append_rows = [get_cur_time()[1]]\n", + " dataItemNo_dataValue = {}\n", + " for data_value in datas:\n", + " if \"dataValue\" not in data_value:\n", + " print(data_value)\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = \"\"\n", + " else:\n", + " dataItemNo_dataValue[data_value[\"dataItemNo\"]] = data_value[\"dataValue\"]\n", + " \n", + " for value in one_cols[1:]:\n", + " if value in dataItemNo_dataValue:\n", + " append_rows.append(dataItemNo_dataValue[value])\n", + " else:\n", + " append_rows.append(\"\")\n", + " save_xls_1(append_rows)\n", + "\n", + " \n", + " # data_list.append(three_cols)\n", + " # write_xls(data_list)\n", + " \n", + "def save_xls_1(append_rows):\n", + "\n", + " # 打开xls文件\n", + " workbook = xlrd.open_workbook('液化气数据.xls')\n", + "\n", + " # 获取所有sheet的个数\n", + " sheet_count = len(workbook.sheet_names())\n", + "\n", + " # 获取所有sheet的名称\n", + " sheet_names = workbook.sheet_names()\n", + "\n", + " new_workbook = xlwt.Workbook()\n", + " for i in range(sheet_count):\n", + " # 获取当前sheet\n", + " sheet = workbook.sheet_by_index(i)\n", + "\n", + " # 获取sheet的行数和列数\n", + " row_count = sheet.nrows - 1\n", + " col_count = sheet.ncols\n", + " # 获取原有数据\n", + " data = []\n", + " for row in range(row_count):\n", + " row_data = []\n", + " for col in range(col_count):\n", + " row_data.append(sheet.cell_value(row, col))\n", + " data.append(row_data)\n", + " # 创建xlwt的Workbook对象\n", + " # 创建sheet\n", + " new_sheet = new_workbook.add_sheet(sheet_names[i])\n", + "\n", + " # 将原有的数据写入新的sheet\n", + " for row in range(row_count):\n", + " for col in range(col_count):\n", + " new_sheet.write(row, col, data[row][col])\n", + "\n", + " if i == 0:\n", + " # 在新的sheet中添加数据\n", + " for col in range(col_count):\n", + " new_sheet.write(row_count, col, append_rows[col])\n", + "\n", + " # 保存新的xls文件\n", + " new_workbook.save(\"液化气数据.xls\") \n", + "\n", + " \n", + " \n", + " \n", + "def check_data(dataItemNo):\n", + " token = get_head_auth()\n", + " if not token:\n", + " return\n", + "\n", + " datas = get_data_value(token, dataItemNo)\n", + " if not datas:\n", + " return\n", + "\n", + "\n", + "def save_xls(append_rows):\n", + "\n", + " # 打开xls文件\n", + " workbook = xlrd.open_workbook('液化气数据.xls')\n", + "\n", + " # 获取所有sheet的个数\n", + " sheet_count = len(workbook.sheet_names())\n", + "\n", + " # 获取所有sheet的名称\n", + " sheet_names = workbook.sheet_names()\n", + "\n", + " new_workbook = xlwt.Workbook()\n", + " for i in range(sheet_count):\n", + " # 获取当前sheet\n", + " sheet = workbook.sheet_by_index(i)\n", + "\n", + " # 获取sheet的行数和列数\n", + " row_count = sheet.nrows\n", + " col_count = sheet.ncols\n", + " # 获取原有数据\n", + " data = []\n", + " for row in range(row_count):\n", + " row_data = []\n", + " for col in range(col_count):\n", + " row_data.append(sheet.cell_value(row, col))\n", + " data.append(row_data)\n", + " # 创建xlwt的Workbook对象\n", + " # 创建sheet\n", + " new_sheet = new_workbook.add_sheet(sheet_names[i])\n", + "\n", + " # 将原有的数据写入新的sheet\n", + " for row in range(row_count):\n", + " for col in range(col_count):\n", + " new_sheet.write(row, col, data[row][col])\n", + "\n", + " if i == 0:\n", + " # 在新的sheet中添加数据\n", + " for col in range(col_count):\n", + " new_sheet.write(row_count, col, append_rows[col])\n", + "\n", + " # 保存新的xls文件\n", + " new_workbook.save(\"液化气数据.xls\")\n", + "\n", + "\n", + "if __name__ == \"__main__\":\n", + " pass\n", + " # 需要单独运行放开\n", + "# start()\n", + "\n", + " # 每天定时12点运行\n", + " # while True:\n", + " # # 获取当前时间\n", + " # current_time = time.strftime(\"%H:%M:%S\", time.localtime())\n", + " # current_time_1 = time.strftime(\"%H:%M:%S\", time.localtime())\n", + "\n", + " # # 判断当前时间是否为执行任务的时间点\n", + " # if current_time == \"09:15:00\":\n", + " # print(\"执行定时任务\")\n", + " # start()\n", + "\n", + " # # 休眠1秒钟,避免过多占用CPU资源\n", + " # time.sleep(1)\n", + " \n", + " # elif current_time_1 == \"20:00:00\":\n", + " # print(\"更新数据\")\n", + " # start_1()\n", + " # time.sleep(1)\n", + "\n", + "\n", + "# # 检测数据准确性, 需要检测放开\n", + "# # check_data(\"100028098|LISTING_PRICE\")\n", + "# # check_data(\"9137070016544622XB|DAY_Yield\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20241018\n", + "{'dataDate': '20241018', 'dataItemNo': 'C01100008|AUCTION_MAX_PRICE'}\n", + "{'dataDate': '20241018', 'dataItemNo': 'C01100008|PLAN_SALE'}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:286: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:288: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.751e+05, tolerance: 3.460e+03\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\magics\\pylab.py:162: UserWarning:\n", + "\n", + "pylab import has clobbered these variables: ['datetime', '__version__', 'random', 'plot']\n", + "`%matplotlib` prevents importing * from pylab and numpy\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:235: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:237: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:269: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-18 5041.442871\n", + "Name: 日度预测价格, dtype: float32\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241019\n", + "{'dataDate': '20241019', 'dataItemNo': 'C01100008|AUCTION_MAX_PRICE'}\n", + "{'dataDate': '20241019', 'dataItemNo': 'C01100008|PLAN_SALE'}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:286: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:288: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.757e+05, tolerance: 3.455e+03\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:235: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:237: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:269: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-19 5035.606934\n", + "Name: 日度预测价格, dtype: float32\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241020\n", + "{'dataDate': '20241020', 'dataItemNo': 'C01100008|AUCTION_MAX_PRICE'}\n", + "{'dataDate': '20241020', 'dataItemNo': 'C01100008|PLAN_SALE'}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:286: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:288: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.154e+05, tolerance: 3.456e+03\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:235: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:237: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:269: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-20 5035.100586\n", + "Name: 日度预测价格, dtype: float32\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241021\n", + "{'dataDate': '20241021', 'dataItemNo': 'C01100008|AUCTION_MAX_PRICE'}\n", + "{'dataDate': '20241021', 'dataItemNo': 'C01100008|PLAN_SALE'}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:286: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:288: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.367e+05, tolerance: 3.463e+03\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:235: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:237: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:269: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-21 5039.185059\n", + "Name: 日度预测价格, dtype: float32\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241022\n", + "{'dataDate': '20241022', 'dataItemNo': 'C01100008|AUCTION_MAX_PRICE'}\n", + "{'dataDate': '20241022', 'dataItemNo': 'C01100008|PLAN_SALE'}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:286: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:288: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.408e+05, tolerance: 3.515e+03\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:235: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:237: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:269: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-22 5064.530762\n", + "Name: 日度预测价格, dtype: float32\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241023\n", + "{'dataDate': '20241023', 'dataItemNo': 'C01100008|AUCTION_MAX_PRICE'}\n", + "{'dataDate': '20241023', 'dataItemNo': 'C01100008|PLAN_SALE'}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:286: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:288: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.883e+05, tolerance: 3.467e+03\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:235: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:237: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:269: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-23 5041.791016\n", + "Name: 日度预测价格, dtype: float32\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241024\n", + "{'dataDate': '20241024', 'dataItemNo': 'C01100008|AUCTION_MAX_PRICE'}\n", + "{'dataDate': '20241024', 'dataItemNo': 'C01100008|PLAN_SALE'}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:286: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:288: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.806e+05, tolerance: 3.479e+03\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:235: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:237: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:269: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-24 5062.01709\n", + "Name: 日度预测价格, dtype: float32\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20241025\n", + "{'dataDate': '20241025', 'dataItemNo': 'C01100008|AUCTION_MAX_PRICE'}\n", + "{'dataDate': '20241025', 'dataItemNo': 'C01100008|PLAN_SALE'}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:286: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:288: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 6.352e+05, tolerance: 3.465e+03\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:235: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:237: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_10536\\402792680.py:269: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2024-10-25 5034.200684\n", + "Name: 日度预测价格, dtype: float32\n", + "{\"confirmFlg\":false,\"status\":true}\n" + ] + } + ], + "source": [ + "from datetime import datetime, timedelta\n", + "\n", + "start_date = datetime(2024, 10, 18)\n", + "end_date = datetime(2024, 10, 26)\n", + "\n", + "while start_date < end_date:\n", + " print(start_date.strftime('%Y%m%d'))\n", + " start(start_date)\n", + " # time.sleep(1)\n", + " # start_2(start_date)\n", + " start_date += timedelta(days=1)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "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.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/aisenzhecode/液化石油气/液化气数据.xls b/aisenzhecode/液化石油气/液化气数据.xls new file mode 100644 index 0000000000000000000000000000000000000000..748c015ffed0f065801d30dc81f162781bfc73a6 GIT binary patch literal 129024 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