{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "获取的token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhcGlfZGV2IiwidGgiOiI4YTQ1NzdkYmQ5MTk2NzU3NThkNTc5OTlhMWU4OTFmZSIsImx0IjoiYXBpIiwiaXNzIjoiIiwidG0iOiJQQyIsImV4cCI6MTc0MzEwNTAxMCwianRpIjoiN2QwMjE1N2Q0NzIwNDZjMjk3NTE4ODMzNjA3NzY3OTQifQ.F2QXnRxR_YUmQ8w2GIWkvjy0xLMTZg93rJ-wHkuyIzw\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\h5218\\AppData\\Local\\Temp\\ipykernel_31728\\3153608672.py:885: DeprecationWarning:\n", "\n", "The truth value of an empty array is ambiguous. Returning False, but in future this will result in an error. Use `array.size > 0` to check that an array is not empty.\n", "\n" ] } ], "source": [ "import requests\n", "import json\n", "import xlrd\n", "import xlwt\n", "from datetime import datetime,timedelta\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", "# search_url = \"http://10.200.32.39/jingbo-api/api/warehouse/dwDataItem/queryDataListItemNos\" \n", "queryDataListItemNos_url = \"http://10.200.32.39/jingbo-api//api/warehouse/dwDataItem/queryDataListItemNos\"\n", "\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", "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 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", " print('获取的token:',token)\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\": date,\n", " \"dataItemNoList\": dataItemNoList\n", " },\n", " \"funcModule\": \"数据项\",\n", " \"funcOperation\": \"查询\"\n", " }\n", " \n", "# search_data = {\n", "# \"funcModule\": \"数据项\",\n", "# \"funcOperation\": \"查询\",\n", "# \"data\": {\n", "# \"dateStart\": date,\n", "# \"dateEnd\": date,\n", "# \"dataItemNoList\":dataItemNoList # 数据项编码,代表 brent最低价和最高价\n", "# }\n", "# }\n", " \n", " headers = {\"Authorization\": token}\n", " search_res = requests.post(url=search_url, headers=headers, json=search_data, timeout=(3, 5))\n", " print('数据项查询参数search_data:')\n", " print(search_data)\n", " print('数据项查询结果search_res:')\n", " print(search_res.text)\n", " \n", " try:\n", " search_value = json.loads(search_res.text)[\"data\"]\n", " \n", " print(\"数据项查询结果:\", search_value)\n", " except json.JSONDecodeError as e:\n", " print(f\"Error decoding JSON: {e}\")\n", " print(\"Response content:\", search_res.text)\n", " return None \n", " if search_value:\n", " return search_value\n", " else:\n", " print(\"今天没有新数据\")\n", " return search_value\n", "\n", "\n", "\n", "# xls文件处理\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", " 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", "# 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\": date,\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", " print('预测值:',data['data'][0]['dataValue'])\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", "price_list = []\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", " price_list.append(a)\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", " 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", "def updateYesterdayExcelData(date='', token=None):\n", " # 使用pandas读取Excel文件\n", " df = pd.read_excel(read_file_path_name, engine='openpyxl')\n", "\n", " # 获取第二行的数据作为列名\n", " one_cols = df.iloc[0,:].tolist()\n", "\n", " # 获取当前日期的前一天\n", " if date == '':\n", " previous_date = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d')\n", " else:\n", " # 字符串转日期\n", " previous_date = (datetime.strptime(date, \"%Y-%m-%d\")-timedelta(days=1)).strftime('%Y-%m-%d')\n", " \n", "\n", " cur_time, cur_time2 = getNow(previous_date)\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", " if search_value:\n", " datas = search_value\n", " else:\n", " datas = None\n", "\n", " append_rows = [cur_time2]\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", " 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", " print('更新数据前')\n", " print(df.tail(1))\n", " # 检查日期是否已存在于数据中\n", " if previous_date not in df['日期'].values:\n", " # 将新的数据添加到DataFrame中\n", " new_row = pd.DataFrame([append_rows], columns=df.columns.tolist())\n", " df = pd.concat([df, new_row], ignore_index=True)\n", " else:\n", " # 更新现有数据\n", " print('日期存在,即将更新')\n", " print('新数据',append_rows[1:])\n", " df.loc[df['日期'] == previous_date, df.columns.tolist()[1:]] = append_rows[1:]\n", "\n", " print('更新数据后')\n", " print(df.tail(1))\n", " # 使用pandas保存Excel文件\n", " df.to_excel(\"液化气数据.xls\", index=False, engine='openpyxl')\n", "\n", "\n", "def read_xls_data_bak():\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", "def read_xls_data():\n", " global one_cols, two_cols\n", " # 使用pandas读取Excel文件\n", " df = pd.read_excel(read_file_path_name, header=None) # 不自动识别列名\n", " # 获取第二行数据(索引为1)\n", " one_cols = df.iloc[1].tolist()[1:]\n", " print(f'获取到的数据项ID{one_cols}')\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", " cur_time,cur_time2 = getNow(date)\n", " datas = get_data_value(token, one_cols[1:],cur_time)\n", "# if not datas:\n", "# return\n", "\n", " # data_list = [two_cols, one_cols]\n", " append_rows = [cur_time2]\n", " dataItemNo_dataValue = {}\n", " for data_value in datas:\n", " if \"dataValue\" not in 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,cur_time)\n", " \n", " \n", " \n", " # data_list.append(three_cols)\n", " # write_xls(data_list)\n", "\n", "def getNow(date='',offset=0):\n", " \n", " if date == '':\n", " now = datetime.now() - timedelta(days=offset)\n", " else:\n", " if isinstance(date, datetime):\n", " now = date\n", " else:\n", " try:\n", " # 先尝试常见日期格式解析\n", " now = datetime.strptime(str(date), \"%Y-%m-%d\")\n", " except ValueError:\n", " # 失败后尝试无分隔符格式\n", " now = datetime.strptime(str(date), \"%Y%m%d\")\n", " print(now,type(now))\n", " now = now - timedelta(days=offset)\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", "def start_1(date=''):\n", " read_xls_data()\n", " token = get_head_auth()\n", " if not token:\n", " return\n", " \n", " cur_time,cur_time2 = getNow(date,offset=1)\n", " print(f\"补充{cur_time}数据\")\n", " datas = get_data_value(token, one_cols[1:],date=cur_time)\n", "# if not datas:\n", "# return\n", "\n", " # data_list = [two_cols, one_cols]\n", " append_rows = [cur_time]\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:\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_2(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", "def save_xls_2(append_rows):\n", " try:\n", " # 读取现有数据(假设第一行为列名)\n", " df = pd.read_excel('液化气数据.xls', sheet_name=0)\n", " print(df.columns)\n", " append_rows = pd.DataFrame(append_rows, index=df.columns)\n", " # 创建新数据行\n", " new_date = append_rows['Date'].values\n", " \n", " dates = df['Date'].to_list()\n", " \n", " # 判断日期是否存在\n", " if new_date in dates:\n", " # 找到日期所在行的索引\n", " date_mask = df['Date'] == new_date\n", " # 存在则更新数据\n", " df.loc[date_mask] = append_rows\n", " print(f\"更新 {new_date} 数据\")\n", " else:\n", " # 不存在则追加数据\n", " df = pd.concat([df, append_rows], ignore_index=True)\n", " print(df.head())\n", " print(df.tail())\n", " print(f\"插入 {new_date} 新数据\")\n", " \n", " # 保存更新后的数据\n", " df.to_excel('液化气数据.xls', index=False, engine='openpyxl')\n", " \n", " except FileNotFoundError:\n", " # 如果文件不存在则创建新文件\n", " pd.DataFrame([append_rows]).to_excel('液化气数据.xls', index=False, engine='openpyxl')\n", " except Exception as e:\n", " print(f\"保存数据时发生错误: {str(e)}\")\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", "\n", "\n", "\n", "\n", "\n", "\n", "def get_queryDataListItemNos_value(token, url, dataItemNoList, dateStart, dateEnd):\n", "\n", " search_data = {\n", " \"funcModule\": \"数据项\",\n", " \"funcOperation\": \"查询\",\n", " \"data\": {\n", " \"dateStart\": dateStart,\n", " \"dateEnd\": dateEnd,\n", " \"dataItemNoList\": dataItemNoList # 数据项编码,代表 brent最低价和最高价\n", " }\n", " }\n", "\n", " headers = {\"Authorization\": token}\n", " search_res = requests.post(url=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", " return None\n", "\n", "\n", "\n", "def save_queryDataListItemNos_xls(data_df,dataItemNoList):\n", "\n", " current_year_month = datetime.now().strftime('%Y-%m')\n", " grouped = data_df.groupby(\"dataDate\")\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", "\n", " # 创建xlwt的Workbook对象\n", " # 创建sheet\n", " new_sheet = new_workbook.add_sheet(sheet_names[i])\n", "\n", "\n", " current_year_month_row = 0\n", " # 将原有的数据写入新的sheet\n", " for row in range(row_count):\n", " for col in range(col_count):\n", " col0 = data[row][0]\n", " # print(\"col0\",col0[:7])\n", " if col0[:7] == current_year_month:\n", " current_year_month_row += 1\n", " break\n", " new_sheet.write(row, col, data[row][col])\n", "\n", "\n", " # print(\"current_year_month_row\",current_year_month_row)\n", " if i == 0:\n", " rowFlag = 0\n", " # 查看每组数据\n", " for date, group in grouped:\n", " new_sheet.write(row_count + rowFlag - current_year_month_row, 0, date)\n", " for j in range(len(dataItemNoList)):\n", " dataItemNo = dataItemNoList[j]\n", "\n", " # for dataItemNo in dataItemNoList:\n", " if group[group[\"dataItemNo\"] == dataItemNo][\"dataValue\"].values and (not str(group[group[\"dataItemNo\"] == dataItemNo][\"dataValue\"].values[0]) == 'nan'):\n", " # if group[group[\"dataItemNo\"] == dataItemNo][\"dataValue\"].values:\n", "\n", " new_sheet.write(row_count + rowFlag - current_year_month_row, j + 1, group[group[\"dataItemNo\"] == dataItemNo][\"dataValue\"].values[0])\n", "\n", " rowFlag += 1\n", "\n", "\n", " # 保存新的xls文件\n", " new_workbook.save(\"液化气数据.xls\")\n", "\n", "\n", "\n", "\n", "def queryDataListItemNos():\n", " df = pd.read_excel('液化气数据.xls')\n", " dataItemNoList = df.iloc[0].tolist()[1:]\n", "\n", " token = get_head_auth()\n", " if not token:\n", " return\n", "\n", " # 获取当前日期\n", " current_date = datetime.now()\n", "\n", " # 获取当月1日\n", " first_day_of_month = current_date.replace(day=1)\n", "\n", " # 格式化为 YYYYMMDD 格式\n", " dateEnd = current_date.strftime('%Y%m%d')\n", " dateStart = first_day_of_month.strftime('%Y%m%d')\n", "\n", " search_value = get_queryDataListItemNos_value(token, queryDataListItemNos_url, dataItemNoList, dateStart, dateEnd)\n", "\n", "\n", " data_df = pd.DataFrame(search_value)\n", "\n", " data_df[\"dataDate\"] = pd.to_datetime(data_df[\"dataDate\"])\n", " data_df[\"dataDate\"] = data_df[\"dataDate\"].dt.strftime('%Y-%m-%d')\n", " save_queryDataListItemNos_xls(data_df,dataItemNoList)\n", "\n", "\n", "\n", "\n", "# if __name__ == \"__main__\":\n", "\n", "# # 获取当月的数据写入到指定文件\n", "# queryDataListItemNos()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "\n", "# if __name__ == \"__main__\":\n", "# print('运行中')\n", "# # 需要单独运行放开\n", "# # start()\n", "# # start_1(date='2025-01-22')\n", "# # start_1()\n", "\n", "# # 每天定时12点运行\n", "# while True:\n", "# try:\n", "# # 获取当前时间\n", "# current_time = time.strftime(\"%H:%M:%S\", time.localtime())\n", "# current_time_1 = time.strftime(\"%H:%M:%S\", time.localtime())\n", "# # print(current_time_1)\n", "\n", "\n", " # 获取当月的数据写入到指定文件\n", " # queryDataListItemNos()\n", "\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", "# except:\n", "# print('执行错误')\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": [ { "ename": "NameError", "evalue": "name 'datetime' is not defined", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[2], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m start_date \u001b[38;5;241m=\u001b[39m datetime(\u001b[38;5;241m2025\u001b[39m, \u001b[38;5;241m3\u001b[39m, \u001b[38;5;241m1\u001b[39m)\n\u001b[0;32m 2\u001b[0m end_date \u001b[38;5;241m=\u001b[39m datetime(\u001b[38;5;241m2025\u001b[39m, \u001b[38;5;241m3\u001b[39m, \u001b[38;5;241m12\u001b[39m)\n\u001b[0;32m 4\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m start_date \u001b[38;5;241m<\u001b[39m end_date:\n", "\u001b[1;31mNameError\u001b[0m: name 'datetime' is not defined" ] } ], "source": [ "start_date = datetime(2025, 3, 1)\n", "end_date = datetime(2025, 3, 12)\n", "\n", "while start_date < end_date:\n", " date = start_date.strftime('%Y%m%d')\n", " updateYesterdayExcelData(date)\n", " # start(date)\n", " # # time.sleep(1)\n", " # start_1(start_date)\n", " # start_date += timedelta(days=1)\n", " time.sleep(5)\n", "\n", "# print(price_list)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.4" } }, "nbformat": 4, "nbformat_minor": 4 }