From 50797d0121bf04491f2cf3145869861141a36fb3 Mon Sep 17 00:00:00 2001 From: workpc Date: Tue, 31 Dec 2024 15:27:59 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9B=8D=E5=AE=89=E7=8E=AF=E5=A2=83=E4=BD=BF?= =?UTF-8?q?=E7=94=A85=E4=B8=AA=E6=A8=A1=E5=9E=8B=E7=94=BB=E9=A2=84?= =?UTF-8?q?=E6=B5=8B=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config_jingbo.py | 2 +- config_yongan.py | 4 +- lib/dataread.py | 5 +- lib/dataread_jingbo_pro.py | 1733 ----------------------------- lib/dataread_yongan.py | 1733 ----------------------------- main_yongan.py | 6 +- models/nerulforcastmodels.py | 407 +++++++ yongandataset/jbsh_yuanyou.db | Bin 741376 -> 741376 bytes yongandataset/历史价格-预测值.png | Bin 176592 -> 147020 bytes 9 files changed, 416 insertions(+), 3474 deletions(-) delete mode 100644 lib/dataread_jingbo_pro.py delete mode 100644 lib/dataread_yongan.py diff --git a/config_jingbo.py b/config_jingbo.py index 6a2b80d..3e903b5 100644 --- a/config_jingbo.py +++ b/config_jingbo.py @@ -176,7 +176,7 @@ table_name = 'v_tbl_crude_oil_warning' ### 开关 is_train = False # 是否训练 is_debug = False # 是否调试 -is_eta = False # 是否使用eta接口 +is_eta = True # 是否使用eta接口 is_market = True # 是否通过市场信息平台获取特征 ,在is_eta 为true 的情况下生效 is_timefurture = True # 是否使用时间特征 is_fivemodels = False # 是否使用之前保存的最佳的5个模型 diff --git a/config_yongan.py b/config_yongan.py index 7609edc..72050b6 100644 --- a/config_yongan.py +++ b/config_yongan.py @@ -107,7 +107,6 @@ ClassifyId = 1214 ################################################################################################################ 变量定义--雍安测试环境 login_pushreport_url = "http://192.168.100.115:9090/dom-api/api/server/login" upload_url = "http://192.168.100.115:9090/dom-api/api/analysis/reportInfo/researchUploadReportSave" -# upload_url = "http://192.168.100.109:8080/jingbo/api/analysis/reportInfo/researchUploadReportSave" # zhaoqiwei upload_warning_url = "http://192.168.100.115:9090/dom-api/api/basicBuiness/crudeOilWarning/save" query_data_list_item_nos_url = "http://192.168.100.115:9090/dom-api/api/warehouse/dwDataItem/queryDataListItemNos" @@ -169,7 +168,8 @@ dbusername ='root' password = '123456' dbname = 'jingbo_test' table_name = 'v_tbl_crude_oil_warning' - +# 表名前缀 +table_name_prefix = 'yongan_' ### 开关 is_train = False # 是否训练 diff --git a/lib/dataread.py b/lib/dataread.py index 108642b..8eb14c0 100644 --- a/lib/dataread.py +++ b/lib/dataread.py @@ -41,8 +41,9 @@ plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 # from config_jingbo_pro import * -from config_jingbo import * -# from config_juxiting import * +# from config_jingbo import * +# from config_yongan import * +from config_juxiting import * diff --git a/lib/dataread_jingbo_pro.py b/lib/dataread_jingbo_pro.py deleted file mode 100644 index 07e1d87..0000000 --- a/lib/dataread_jingbo_pro.py +++ /dev/null @@ -1,1733 +0,0 @@ - -# 导入模块 -import pandas as pd -import numpy as np -import datetime -import string -import base64 -import requests -import random -import time -import re -import os -import hmac -import hashlib -import json -import math -import torch -torch.set_float32_matmul_precision("high") -import matplotlib.pyplot as plt -#设置plt显示中文 -plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 -plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 - -from datetime import timedelta -from sklearn import metrics -from reportlab.pdfbase import pdfmetrics # 注册字体 -from reportlab.pdfbase.ttfonts import TTFont # 字体类 -from reportlab.platypus import Table, SimpleDocTemplate, Paragraph, Image # 报告内容相关类 -from reportlab.lib.pagesizes import letter # 页面的标志尺寸(8.5*inch, 11*inch) -from reportlab.lib.styles import getSampleStyleSheet # 文本样式 -from reportlab.lib import colors # 颜色模块 -from reportlab.graphics.charts.barcharts import VerticalBarChart # 图表类 -from reportlab.graphics.charts.legends import Legend # 图例类 -from reportlab.graphics.shapes import Drawing # 绘图工具 -from reportlab.lib.units import cm # 单位:cm - -# 注册字体(提前准备好字体文件, 如果同一个文件需要多种字体可以注册多个) -pdfmetrics.registerFont(TTFont('SimSun', 'SimSun.ttf')) -#设置plt显示中文 -plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 -plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 - - -from config_jingbo_pro import * - - - - -# 定义函数 -def loadcsv(filename): - """ - 读取指定文件名的 CSV 文件。 - 如果文件编码为 UTF-8,则使用 UTF-8 编码读取;否则,使用 GBK 编码读取。 - - 参数: - filename (str): 要读取的 CSV 文件的文件名。 - - 返回: - pandas.DataFrame: 读取的数据。 - - """ - # 读取csv文件 - try: - df = pd.read_csv(filename, encoding='utf-8') - except UnicodeDecodeError: - df = pd.read_csv(filename, encoding='gbk') - return df - - -def dateConvert(df, datecol='ds'): - """ - 将数据框 df 中的 datecol 列转换为日期时间类型。 - - 参数: - df (pandas.DataFrame): 要转换的 DataFrame。 - datecol (str): 要转换的列名,默认为 'ds'。 - - 返回: - pandas.DataFrame: 转换后的 DataFrame。 - - """ - # 将date列转换为datetime类型 - try: - df[datecol] = pd.to_datetime(df[datecol],format=r'%Y-%m-%d') - except: - df[datecol] = pd.to_datetime(df[datecol],format=r'%Y/%m/%d') - return df - - -def calculate_kdj(data, n=9): - ''' - 给传进来的df 添加列: 波动率,最高,最低,k,d ,j - ''' - # 对数据按照日期升序排序 - data = data.sort_values(by='ds', ascending=True) - # 因为没有高开低价格,利用每日波动率模拟当天最高价和最低价 - data['pctchange'] = data['y'].pct_change() - # 收益为0的用0.01 - data['pctchange'] = data['pctchange'].replace(0,0.01) - # 去除空值 - data.dropna(inplace=True) - # 重置索引 - data.reset_index(drop=True,inplace=True) - # 计算最高价和最低价 - data['high'] = data['y']* (1+abs(data['pctchange'])/2) - data['low'] = data['y']* (1-abs(data['pctchange'])/2) - # 计算n日内最低价 - low_list = data['y'].rolling(window=n, min_periods=1).min() - # 计算n日内最高价 - high_list = data['y'].rolling(window=n, min_periods=1).max() - # 计算未成熟随机值 - rsv = ((data['y'] - low_list) / (high_list - low_list)) * 100 - # 初始化k值为50 - k = pd.Series(50, index=data.index) - # 初始化d值为50 - d = pd.Series(50, index=data.index) - # 计算k值和d值 - for i in range(1, len(data)): - k[i] = (2/3 * k[i - 1]) + (1/3 * rsv[i]) - d[i] = (2/3 * d[i - 1]) + (1/3 * k[i]) - # 计算j值 - j = 3 * k - 2 * d - - # 将k值、d值和j值添加到数据中 - data['K'] = k - data['D'] = d - data['J'] = j - # 将包含 KDJ 指标的数据保存到新的 CSV 文件 - data.to_csv('stock_data_with_kdj.csv', index=False) - # data = data.dropna() - return data - - -# 上传报告 -def get_head_auth_report(): - """ - 通过 POST 请求登录到指定的 URL,并从响应中获取认证令牌。 - - 返回: - str: 如果登录成功,返回认证令牌;否则返回 None。 - """ - logger.info("获取token中...") - logger.info(f'url:{login_pushreport_url},login_data:{login_data}') - # 发送 POST 请求到登录 URL,携带登录数据 - login_res = requests.post(url=login_pushreport_url, json=login_data, timeout=(3, 30)) - - # 将响应内容转换为 JSON 格式 - text = json.loads(login_res.text) - logger.info(f'token接口响应:{text}') - # 如果响应状态为成功 - if text["status"]: - # 从响应数据中获取认证令牌 - token = text["data"]["accessToken"] - # 返回认证令牌 - return token - - -def upload_report_data(token, upload_data): - """ - 上传报告数据到指定的URL - - 参数: - token (str): 认证令牌 - upload_data (dict): 要上传的报告数据,包含必要的字段和信息 - - 返回: - dict: 如果上传成功,返回响应对象;否则返回None - """ - # 直接使用传入的 upload_data - upload_data = upload_data - - # 设置请求头部 - headers = {"Authorization": token} - - # 打印日志,显示正在上传报告数据 - logger.info("报告上传中...") - - # 打印日志,显示认证头部信息 - logger.info(f"token:{token}") - - # 打印日志,显示要上传的报告数据 - logger.info(f"upload_data:{upload_data}" ) - - # 发送POST请求,上传报告数据 - upload_res = requests.post(url=upload_url, headers=headers, json=upload_data, timeout=(3, 15)) - - # 将响应内容转换为 JSON 格式 - upload_res = json.loads(upload_res.text) - - # 打印日志,显示响应内容 - logger.info(upload_res) - - # 如果上传成功,返回响应对象 - if upload_res: - return upload_res - # 如果上传失败,打印日志并返回None - else: - logger.info("报告上传失败") - return None - - -def upload_warning_data(warning_data): - """ - 上传预警数据到指定的URL - - 参数: - warning_data (dict): 要上传的预警数据,包含必要的字段和信息 - - 返回: - requests.Response: 如果上传成功,返回响应对象;否则返回None - """ - # 获取认证头部信息 - token = get_head_auth_report() - - # 设置请求头部 - headers = {"Authorization": token} - - # 打印日志,显示正在上传预警数据 - logger.info("预警上传中...") - - # 打印日志,显示上传的URL - logger.info(f"upload_warning_url:{upload_warning_url}") - - # 打印日志,显示认证头部信息 - logger.info(f"token:{token}") - - # 打印日志,显示要上传的预警数据 - logger.info(f"warning_data:{warning_data}") - - # 发送POST请求,上传预警数据 - upload_res = requests.post(url=upload_warning_url, headers=headers, json=warning_data, timeout=(3, 15)) - - # 如果上传成功,返回响应对象 - if upload_res: - return upload_res - # 如果上传失败,打印日志并返回None - else: - logger.info("预警上传失败") - return None - - - -def upload_warning_info(df_count): - """ - 上传预警信息到指定的URL - - 参数: - df_count (int): 停更的数量 - - 返回: - None - """ - # 打印日志,显示正在上传预警信息 - logger.info(f'上传预警信息') - - try: - # 获取当前日期 - warning_date = datetime.datetime.now().strftime('%Y-%m-%d') - - # 构建预警内容 - content = f'{warning_date}有{df_count}个停更' - - # 更新预警数据中的日期和内容 - warning_data['data']['WARNING_DATE'] = warning_date - warning_data['data']['WARNING_CONTENT'] = content - - # 调用 upload_warning_data 函数上传预警数据 - upload_warning_data(warning_data) - - # 打印日志,显示上传预警信息成功 - logger.info(f'上传预警信息成功') - except Exception as e: - # 打印日志,显示上传预警信息失败,并记录异常信息 - logger.error(f'上传预警信息失败:{e}') - - - -def create_feature_last_update_time(df): - """ - 计算特征停更信息用 - 参数: - df (DataFrame): 包含特征数据的 DataFrame - 返回: - DataFrame: 包含特征停更信息的 DataFrame - str: y 列的最后更新时间 - """ - df1 = df.copy() - # 找到每列的最后更新时间 - df1.set_index('ds', inplace=True) - last_update_times = df1.apply(lambda x: x.dropna().index.max().strftime('%Y-%m-%d') if not x.dropna().empty else None) - - # 保存每列的最后更新时间到文件 - last_update_times_df = pd.DataFrame(columns = ['feature', 'last_update_time','is_value','update_period','warning_date','stop_update_period']) - - # 打印每列的最后更新时间 - for column, last_update_time in last_update_times.items(): - values = [] - # 判断是不是常数值 - if df1[column].tail(20).nunique() == 1: - values = values + [column, last_update_time,1] - else: - values = values + [column, last_update_time,0] - # 计算特征数据值的时间差 - try: - # 计算预警日期 - time_diff = (df1[column].dropna().index.to_series().diff().mode()[0]).total_seconds() / 3600 / 24 - last_update_time_datetime = datetime.datetime.strptime(last_update_time, '%Y-%m-%d') - last_update_date = end_time if end_time != '' else datetime.datetime.now().strftime('%Y-%m-%d') - end_time_datetime = datetime.datetime.strptime(last_update_date, '%Y-%m-%d') - early_warning_date = last_update_time_datetime + timedelta(days=time_diff)*2 + timedelta(days=1) - stop_update_period = int(math.ceil((end_time_datetime-last_update_time_datetime).days / time_diff)) - early_warning_date = early_warning_date.strftime('%Y-%m-%d') - except KeyError: - time_diff = 0 - early_warning_date = end_time - continue - - values = values + [time_diff,early_warning_date,stop_update_period] - last_update_times_df.loc[len(last_update_times_df)] = values - - logger.info(f"Column {column} was last updated at {last_update_time}") - y_last_update_time = last_update_times_df[last_update_times_df['feature']=='y']['warning_date'].values[0] - last_update_times_df.to_csv(os.path.join(dataset,'last_update_times.csv'), index=False) - logger.info('特征停更信息保存到文件:last_update_times.csv') - return last_update_times_df,y_last_update_time - - - -# 统计特征频度 -def featurePindu(dataset): - # 读取文件 - df = loadcsv(os.path.join(dataset,'未填充的特征数据.csv')) - df['ds'] = pd.to_datetime(df['ds']) - # 按ds正序排序,重置索引 - df = df.sort_values(by='ds', ascending=True).reset_index(drop=True) - - # 统计特征频度 - # 每列随机抽取10个值,计算出5个时间间隔,统计每个时间间隔的频度 - columns = df.columns.to_list() - columns.remove('ds') - count_dict = {} - for column in columns: - # 获取每列时间间隔 - values = df[[column,'ds']] - values.dropna(inplace=True,axis=0) - values=values.reset_index(drop=True) - - # 抽取20%个值 - value = values.sample(frac=0.2) - index = value.index - next_index = index + 1 - count = [] - for i,j in zip(index, next_index): - #通过索引计算日期差 - try: - count.append((values.loc[j,'ds'] - values.loc[i,'ds']).days) - except: - pass - # 把31 换成 30 - count = [30 if i == 31 else i for i in count] - # 保留count中出现次数最多的数 - try: - count = max(set(count), key=count.count) - except ValueError : - logger.info(f'{column}列数据为空') - continue - # 存储到字典中 - count_dict[column] = count - - df = pd.DataFrame(count_dict,index=['count']).T - pindu_dfs = pd.DataFrame() - # 根据count分组 - # 输出特征频度统计 - pindudict = {'1':'日度','3':'日度','7':'周度','30':'月度','90':'季度','180':'半年度','365':'年度'} - for i in df.groupby('count'): - # 获取 i[1] 的索引值 - index = i[1].index - pindu_df = pd.DataFrame() - try: - pindu_df[pindudict[str(i[0])]+f'({len(i[1])})'] = index - except KeyError : - pindu_df[str(i[0])+f'天({len(i[1])})'] = index - # 合并到pindu_dfs - pindu_dfs = pd.concat([pindu_dfs,pindu_df],axis=1) - # nan替换为 ' ' - pindu_dfs = pindu_dfs.fillna('') - pindu_dfs.to_csv(os.path.join(dataset,'特征频度统计.csv'),index=False) - logger.info(pindu_dfs) - featureInfo = f'特征信息:总共有{len(columns)-2}个' - for i in pindu_dfs.columns: - featureInfo += f',{i}' - - featureInfo += ', 详看 附1、特征列表' - - featureInfo += ''' - 数据特征工程: - 1. 数据日期排序,新日期在最后 - 2. 删除空列,特征数据列没有值,就删除 - 3. 删除近两月不再更新值的指标 - 4. 非日度数据填充为日度数据,填充规则: - -- 向后填充,举例:假设周五出现一个周度指标数据,那么在这之前的数据用上周五的数据 - -- 向前填充,举例:采集数据开始日期为2018年1月1日,那么周度数据可能是2018年1月3日,那么3日的数据向前填充,使1日2日都有数值 - 数据特征相关性分析: - ''' - logger.info(featureInfo) - with open(os.path.join(dataset,'特征频度统计.txt'), 'w', encoding='utf-8') as f: - f.write(featureInfo) - logger.info('*'*200) - - -def featureAnalysis(df,dataset,y): - # 特征筛选 - import matplotlib.pyplot as plt - # 选择特征和标签列 - X = df.drop(['ds', 'y'], axis=1) # 特征集,排除时间戳和标签列 - yy = df['y'] # 标签集 - - # 标签集自相关函数分析 - from statsmodels.graphics.tsaplots import plot_acf - plot_acf(yy, lags=30) - plt.savefig(os.path.join(dataset,'指标数据自相关图.png')) - plt.close() - - # 标签集偏自相关函数分析 - from statsmodels.graphics.tsaplots import plot_pacf - plot_pacf(yy, lags=30) - plt.savefig(os.path.join(dataset,'指标数据偏自相关图.png')) - plt.close() - - # 画 特征与价格散点图 - # 删除所有*散点图.png - for file in os.listdir(dataset): - if file.endswith("散点图.png"): - os.remove(os.path.join(dataset, file)) - plt.rcParams['font.sans-serif'] = ['SimHei'] - plt.rcParams['axes.unicode_minus'] = False - plt.figure(figsize=(10, 10)) - # # 遍历X每一列,和yy画散点图 , - # for i, col in enumerate(X.columns): - # plt.subplot(2, 2, i%4+1) - # plt.scatter(X[col], yy) - # plt.xlabel(col) - # plt.ylabel(y) - # plt.title(col) - # if i % 4 == 3 or i == len(X.columns)-1: - # plt.tight_layout() - # plt.savefig(os.path.join(dataset,f'{i}指标数据特征与价格散点图.png')) - # plt.close() - - - -def corr_feature(df): - # 重新命名列名,列名排序,y在第一个 - df.reindex(['y'] + sorted(df.columns.difference(['y']))) - df_test = df.copy() - # 取最后的220行 - df_test = df_test.tail(220) - # 去掉日期列 - df_test = df_test.drop(columns=['ds']) - # 不参与标准化 - df_test_noscaler = df_test.copy() # 滞后处理备份 - df_noscaler = df_test.copy() - # 画出相关性热力图 - df_test.to_csv(os.path.join(dataset,'同步相关性.csv')) - corr = df_test.corr() - # 保存相关系数 - corr.to_csv(os.path.join(dataset,'同步相关性系数.csv')) - # plt.figure(figsize=(10, 10)) - # sns.heatmap(corr, annot=True, cmap='coolwarm') - # plt.savefig('dataset/同步相关性热力图.png') - # plt.show() - - # 读取滞后周期文件,更改特征 - characteristic_period = pd.read_csv('dataset/特征滞后周期.csv',encoding='utf-8') - # 去掉周期为0的行 - characteristic_period = characteristic_period.drop(characteristic_period[characteristic_period['滞后周期'] == 0].index) - for col in df.columns: - # 跳过y列 - if col in ['y']: - continue - # 特征滞后n个周期,计算与y的相关性 - if col in characteristic_period['特征'].values: - # 获取特征对应的周期 - period = characteristic_period[characteristic_period['特征'] == col]['滞后周期'].values[0] - # 滞后处理 - df[col] = df[col].shift(period) - df.to_csv(os.path.join(dataset,'滞后处理后的数据集.csv')) - - - # corr_feture_noscaler = {} # 保存相关性最大的周期 - # 遍历df_test的每一列,计算相关性 - # for col in df_noscaler.columns: - # # 跳过y列 - # if col in ['y']: - # continue - # logger.info('特征:', col) - # # 特征滞后n个周期,计算与y的相关性 - # corr_dict = {} - # try: - # for i in range(0, 200): - # if i == 0: - # df_noscaler[col+'_'+str(i)] = df_noscaler[col] - # else: - # df_noscaler[col+'_'+str(i)] = df_noscaler[col].shift(i) - # corr_dict[col+'_'+str(i)] = abs(df_noscaler[col+'_'+str(i)].corr(df_noscaler['y'])) - # except : - # logger.info('特征:', col, '滑动错误,请查看') - # continue - # 输出相关性最大的特征 - # logger.info(max(corr_dict, key=corr_dict.get), corr_dict[max(corr_dict, key=corr_dict.get)]) - # corr_feture_noscaler[col] = max(corr_dict, key=corr_dict.get).split('_')[-1] - # 画出最相关性最大的特征和y的折线图 - # plt.figure(figsize=(10, 5)) - # plt.plot(df_noscaler[max(corr_dict, key=corr_dict.get)], label=max(corr_dict, key=corr_dict.get)) - # # 设置双坐标轴 - # ax1 = plt.gca() - # ax2 = ax1.twinx() - # ax2.plot(df_noscaler['y'], color='r', label='y') - # plt.legend() - # try: - # plt.savefig('dataset/特征与y的折线图_'+max(corr_dict, key=corr_dict.get)+'.png') - # except : - # # :替换成_ - # plt.savefig('dataset/特征与y的折线图_'+max(corr_dict, key=corr_dict.get).replace(':','_').replace('/','_').replace('(','_').replace(')','_')+'.png') - # plt.close() - # 结果保存到txt文件 - # logger.info('不参与标准化的特征滞后相关性写入txt文件') - # with open('dataset/不参与标准化的特征滞后相关性.txt', 'w') as f: - # for key, value in corr_feture_noscaler.items(): - # f.write('%s:%s\n' % (key, value)) - # 遍历corr_feture_noscaler,更改df - # colnames_noscaler = [] - # for col in corr_feture_noscaler: - # colname = col+'_'+corr_feture_noscaler[col] - # if int(corr_feture_noscaler[col]) == 0: - # continue - # df_test_noscaler[colname] = df_test_noscaler[col].shift(int(corr_feture_noscaler[col])) - # df_test_noscaler = df_test_noscaler.drop(columns=[col]) - # colnames_noscaler.append(colname) - # 去除有空值的行 - # df_test_noscaler = df_test_noscaler.dropna() - # df_test_noscaler.reindex(['y'] + sorted(df_test_noscaler.columns.difference(['y']))) - # df_test_noscaler.to_csv('dataset/不参与标准化的特征滞后相关性.csv', index=False) - # 画出相关性热力图 - # corr = df_test_noscaler.corr() - # 保存相关系数 - # corr.to_csv(os.path.join(dataset,'不参与标准化的特征滞后相关性系数.csv')) - # plt.figure(figsize=(10, 10)) - # sns.heatmap(corr, annot=True, cmap='coolwarm') - # plt.savefig('dataset/不参与标准化的特征滞后相关性热力图.png') - # plt.close() - # # 标准化每列 - # from sklearn.preprocessing import StandardScaler - # scaler = StandardScaler() - # df_test = pd.DataFrame(scaler.fit_transform(df_test), columns=df_test.columns) - # corr_feture = {} # 保存相关性最大的周期 - # # 遍历df_test的每一列,计算相关性 - # for col in df_test.columns: - # # 跳过y列 - # if col == 'y': - # continue - # logger.info('特征:', col) - # # 特征滞后n个周期,计算与y的相关性 - # corr_dict = {} - # try: - # for i in range(0, 200): - # if i == 0: - # df_test[col+'_'+str(i)] = df_test[col] - # else: - # df_test[col+'_'+str(i)] = df_test[col].shift(i) - # corr_dict[col+'_'+str(i)] = abs(df_test[col+'_'+str(i)].corr(df_test['y'])) - # except : - # logger.info('特征:', col, '滑动错误,请查看') - # continue - # # 输出相关性最大的特征 - # logger.info(max(corr_dict, key=corr_dict.get), corr_dict[max(corr_dict, key=corr_dict.get)]) - # corr_feture[col] = max(corr_dict, key=corr_dict.get).split('_')[-1] - - - # # 结果保存到txt文件 - # with open('dataset/标准化的特征滞后相关性.txt', 'w') as f: - # for key, value in corr_feture.items(): - # f.write('%s:%s\n' % (key, value)) - # # 遍历corr_feture,更改df - # colnames = [] - # for col in corr_feture: - # colname = col+'_'+corr_feture[col] - # if int(corr_feture[col]) == 0: - # continue - # df[colname] = df[col].shift(int(corr_feture[col])) - # df = df.drop(columns=[col]) - # colnames.append(colname) - # # 去除有空值的行 - # df = df.dropna() - # df.reindex(['y'] + sorted(df.columns.difference(['y']))) - # df.to_csv('dataset/标准化后的特征滞后相关性.csv', index=False) - # # 画出相关性热力图 - # ds = df['ds'] - # df = df.drop(columns=['ds']) - # corr = df.corr() - # # 保存相关系数 - # corr.to_csv(os.path.join(dataset,'标准化后的特征滞后相关性系数.csv')) - # plt.figure(figsize=(10, 10)) - # sns.heatmap(corr, annot=True, cmap='coolwarm') - # plt.savefig('dataset/标准化后的特征滞后相关性热力图.png') - # plt.show() - # df['ds'] = ds - - # 去除nan值 - df = df.dropna() - return df - - -def calculate_kdj(data, n=9): - ''' - 给传进来的df 添加列: 波动率,最高,最低,k ,d ,j - ''' - data = data.sort_values(by='ds', ascending=True) - # 因为没有高开低价格,利用每日波动率模拟当天最高价和最低价 - data['pctchange'] = data['y'].pct_change() - # 收益为0的用0.01 - data['pctchange'] = data['pctchange'].replace(0,0.01) - data.dropna(inplace=True) - # 重置索引 - data.reset_index(drop=True,inplace=True) - data['high'] = data['y']* (1+abs(data['pctchange'])/2) - data['low'] = data['y']* (1-abs(data['pctchange'])/2) - low_list = data['y'].rolling(window=n, min_periods=1).min() - high_list = data['y'].rolling(window=n, min_periods=1).max() - rsv = ((data['y'] - low_list) / (high_list - low_list)) * 100 - k = pd.Series(50, index=data.index) - d = pd.Series(50, index=data.index) - for i in range(1, len(data)): - k[i] = (2/3 * k[i - 1]) + (1/3 * rsv[i]) - d[i] = (2/3 * d[i - 1]) + (1/3 * k[i]) - j = 3 * k - 2 * d - - data['K'] = k - data['D'] = d - data['J'] = j - # 将包含 KDJ 指标的数据保存到新的 CSV 文件 - data.to_csv('dataset\stock_data_with_kdj.csv', index=False) - # data = data.dropna() - return data - -def check_column(df,col_name,two_months_ago): - ''' - 检查列是否需要删除。 - 该函数会检查列是否为空值列、180天没有更新的列或常数值列。 - 参数: - col_name (str): 列名。 - df (DataFrame): 包含列的 DataFrame。 - 返回: - bool: 如果列需要删除,返回 True;否则,返回 False。 - ''' - if 'ds' in col_name or 'y' in col_name: - return False - df_check_column = df[['ds',col_name,'y']] - df_check_column = df_check_column.dropna() - - if len(df_check_column) == 0: - print(f'空值列:{col_name}') - return True - # 判断是不是常数列 - if df_check_column[(df_check_column['ds']>= two_months_ago)].groupby(col_name).ngroups < 2: - print(f'180没有更新:{col_name}') - return True - - # 判断相关系数大于0.6 - if is_del_corr > 0: - if abs(df_check_column[col_name].corr(df_check_column['y'])) < is_del_corr: - print(f'相关系数小于0.6:{col_name}') - return True - - corresponding_date = df_check_column.iloc[-1]['ds'] - return corresponding_date < two_months_ago - -def datachuli(df_zhibiaoshuju,df_zhibiaoliebiao,datecol='date',end_time='',y='y',dataset='dataset',delweekenday=False,add_kdj=False,is_timefurture=False): - ''' - 原油特征数据处理函数, - 接收的是两个df,一个是指标数据,一个是指标列表 - 输出的是一个df,包含ds,y,指标列 - ''' - df = df_zhibiaoshuju.copy() - - if end_time == '': - end_time = datetime.datetime.now().strftime('%Y-%m-%d') - # 重命名时间列,预测列 - df.rename(columns={datecol:'ds'},inplace=True) - df.rename(columns={y:'y'},inplace=True) - # 按时间顺序排列 - df.sort_values(by='ds',inplace=True) - df['ds'] = pd.to_datetime(df['ds']) - # 获取start_year年到end_time的数据 - df = df[df['ds'].dt.year >= start_year] - df = df[df['ds'] <= end_time] - # last_update_times_df,y_last_update_time = create_feature_last_update_time(df) - # logger.info(f'删除预警的特征前数据量:{df.shape}') - # columns_to_drop = last_update_times_df[last_update_times_df['warning_date'] < y_last_update_time ]['feature'].values.tolist() - # df = df.drop(columns = columns_to_drop) - # logger.info(f'删除预警的特征后数据量:{df.shape}') - # if is_update_warning_data: - # upload_warning_info(last_update_times_df,y_last_update_time) - # 去掉近最后数据对应的日期在六月以前的列,删除近2月的数据是常熟的列 - if is_del_tow_month: - current_date = datetime.datetime.now() - two_months_ago = current_date - timedelta(days=180) - logger.info(f'删除两月不更新特征前数据量:{df.shape}') - columns_to_drop = [] - for clo in df.columns: - if check_column(df,clo,two_months_ago): - columns_to_drop.append(clo) - df = df.drop(columns=columns_to_drop) - - logger.info(f'删除两月不更新特征后数据量:{df.shape}') - - if freq == 'W': - # 按周取样 - df = df.resample('W', on='ds').mean().reset_index() - elif freq == 'M': - # 按月取样 - df = df.resample('M', on='ds').mean().reset_index() - # 删除预测列空值的行 - df = df.dropna(subset=['y']) - logger.info(f'删除预测列为空值的行后数据量:{df.shape}') - df = df.dropna(axis=1, how='all') - logger.info(f'删除全为空值的列后数据量:{df.shape}') - df.to_csv(os.path.join(dataset,'未填充的特征数据.csv'),index=False) - # 去掉指标列表中的columns_to_drop的行 - df_zhibiaoliebiao = df_zhibiaoliebiao[df_zhibiaoliebiao['指标名称'].isin(df.columns.tolist())] - df_zhibiaoliebiao.to_csv(os.path.join(dataset,'特征处理后的指标名称及分类.csv'),index=False) - # 数据频度分析 - featurePindu(dataset=dataset) - # 向上填充 - df = df.ffill() - # 向下填充 - df = df.bfill() - - # 删除周六日的数据 - if delweekenday: - df = df[df['ds'].dt.weekday < 5] - - # kdj指标 - if add_kdj: - df = calculate_kdj(df) - # 衍生时间特征 - if is_timefurture: - df = addtimecharacteristics(df=df,dataset=dataset) - # 特征分析 - featureAnalysis(df,dataset=dataset,y=y) - return df - -def datachuli_juxiting(df_zhibiaoshuju,df_zhibiaoliebiao,datecol='date',end_time='',y='y',dataset='dataset',delweekenday=False,add_kdj=False,is_timefurture=False): - ''' - 聚烯烃特征数据处理函数, - 接收的是两个df,一个是指标数据,一个是指标列表 - 输出的是一个df,包含ds,y,指标列 - ''' - df = df_zhibiaoshuju.copy() - if end_time == '': - end_time = datetime.datetime.now().strftime('%Y-%m-%d') - # date转为pddate - df.rename(columns={datecol:'ds'},inplace=True) - - # 指定列统一减少数值 - df[offsite_col] = df[offsite_col]-offsite - # 预测列为avg_cols的均值 - df[y] = df[avg_cols].mean(axis=1) - # 去掉多余的列avg_cols - df = df.drop(columns=avg_cols) - - # 重命名预测列 - df.rename(columns={y:'y'},inplace=True) - # 按时间顺序排列 - df.sort_values(by='ds',inplace=True) - df['ds'] = pd.to_datetime(df['ds']) - # 获取2018年到当前日期的数据 - df = df[df['ds'].dt.year >= 2018] - # 获取小于等于当前日期的数据 - df = df[df['ds'] <= end_time] - logger.info(f'删除两月不更新特征前数据量:{df.shape}') - # 去掉近最后数据对应的日期在两月以前的列,删除近2月的数据是常数的列 - current_date = datetime.datetime.now() - two_months_ago = current_date - timedelta(days=40) - # 检查两月不更新的特征 - def check_column(col_name): - if 'ds' in col_name or 'y' in col_name: - return False - df_check_column = df[['ds',col_name]] - df_check_column = df_check_column.dropna() - if len(df_check_column) == 0: - return True - if df_check_column[(df_check_column['ds']>= two_months_ago)].groupby(col_name).ngroups < 2: - return True - corresponding_date = df_check_column.iloc[-1]['ds'] - return corresponding_date < two_months_ago - columns_to_drop = df.columns[df.columns.map(check_column)].tolist() - df = df.drop(columns = columns_to_drop) - - logger.info(f'删除两月不更新特征后数据量:{df.shape}') - - # 删除预测列空值的行 - df = df.dropna(subset=['y']) - logger.info(f'删除预测列为空值的行后数据量:{df.shape}') - df = df.dropna(axis=1, how='all') - logger.info(f'删除全为空值的列后数据量:{df.shape}') - df.to_csv(os.path.join(dataset,'未填充的特征数据.csv'),index=False) - # 去掉指标列表中的columns_to_drop的行 - df_zhibiaoliebiao = df_zhibiaoliebiao[df_zhibiaoliebiao['指标名称'].isin(df.columns.tolist())] - df_zhibiaoliebiao.to_csv(os.path.join(dataset,'特征处理后的指标名称及分类.csv'),index=False) - # 频度分析 - featurePindu(dataset=dataset) - # 向上填充 - df = df.ffill() - # 向下填充 - df = df.bfill() - - # 删除周六日的数据 - if delweekenday: - df = df[df['ds'].dt.weekday < 5] - - if add_kdj: - df = calculate_kdj(df) - - if is_timefurture: - df = addtimecharacteristics(df=df,dataset=dataset) - - featureAnalysis(df,dataset=dataset,y=y) - return df - -def getdata(filename, datecol='date',y='y',dataset='',add_kdj=False,is_timefurture=False,end_time=''): - logger.info('getdata接收:'+filename+' '+datecol+' '+end_time) - # 判断后缀名 csv或excel - if filename.endswith('.csv'): - df = loadcsv(filename) - else: - # 读取excel 指标数据 - df_zhibiaoshuju = pd.read_excel(filename,sheet_name='指标数据') - df_zhibiaoliebiao = pd.read_excel(filename,sheet_name='指标列表') - - - # 日期字符串转为datatime - df = datachuli(df_zhibiaoshuju,df_zhibiaoliebiao,datecol,y = y,dataset=dataset,add_kdj=add_kdj,is_timefurture=is_timefurture,end_time=end_time) - - return df,df_zhibiaoliebiao -def getdata_juxiting(filename, datecol='date',y='y',dataset='',add_kdj=False,is_timefurture=False,end_time=''): - logger.info('getdata接收:'+filename+' '+datecol+' '+end_time) - # 判断后缀名 csv或excel - if filename.endswith('.csv'): - df = loadcsv(filename) - else: - # 读取excel 指标数据 - df_zhibiaoshuju = pd.read_excel(filename,sheet_name='指标数据') - df_zhibiaoliebiao = pd.read_excel(filename,sheet_name='指标列表') - - # 日期字符串转为datatime - df = datachuli_juxiting(df_zhibiaoshuju,df_zhibiaoliebiao,datecol,y = y,dataset=dataset,add_kdj=add_kdj,is_timefurture=is_timefurture,end_time=end_time) - - return df - - -def sanitize_filename(filename): - # 使用正则表达式替换不合规的字符 - # 这里我们替换为下划线'_',但你可以根据需要选择其他字符 - sanitized = re.sub(r'[\\/*?:"<>|\s]', '_', filename) - # 移除开头的点(在某些系统中,以点开头的文件可能是隐藏的) - sanitized = re.sub(r'^\.', '', sanitized) - # 如果需要,可以添加更多替换规则 - return sanitized - -class BinanceAPI: - ''' - 获取 Binance API 请求头签名 - ''' - def __init__(self, APPID, SECRET): - self.APPID = APPID - self.SECRET = SECRET - self.get_signature() - - # 生成随机字符串作为 nonce - def generate_nonce(self, length=32): - self.nonce = ''.join(random.choices(string.ascii_letters + string.digits, k=length)) - return self.nonce - - # 获取当前时间戳(秒) - def get_timestamp(self): - return int(time.time()) - - # 构建待签名字符串 - def build_sign_str(self): - return f'appid={self.APPID}&nonce={self.nonce}×tamp={self.timestamp}' - - # 使用 HMAC SHA-256 计算签名 - def calculate_signature(self, secret, message): - return base64.urlsafe_b64encode(hmac.new(secret.encode('utf-8'), message.encode('utf-8'), hashlib.sha256).digest()).decode('utf-8') - - def get_signature(self): - # 调用上述方法生成签名 - self.nonce = self.generate_nonce() - self.timestamp = self.get_timestamp() - self.sign_str = self.build_sign_str() - self.signature = self.calculate_signature(self.SECRET, self.sign_str) - # return self.signature - -class Graphs: - # 绘制标题 - @staticmethod - def draw_title(title: str): - # 获取所有样式表 - style = getSampleStyleSheet() - # 拿到标题样式 - ct = style['Heading1'] - # 单独设置样式相关属性 - ct.fontName = 'SimSun' # 字体名 - ct.fontSize = 18 # 字体大小 - ct.leading = 50 # 行间距 - ct.textColor = colors.green # 字体颜色 - ct.alignment = 1 # 居中 - ct.bold = True - # 创建标题对应的段落,并且返回 - return Paragraph(title, ct) - - # 绘制小标题 - @staticmethod - def draw_little_title(title: str): - # 获取所有样式表 - style = getSampleStyleSheet() - # 拿到标题样式 - ct = style['Normal'] - # 单独设置样式相关属性 - ct.fontName = 'SimSun' # 字体名 - ct.fontSize = 15 # 字体大小 - ct.leading = 30 # 行间距 - ct.textColor = colors.red # 字体颜色 - # 创建标题对应的段落,并且返回 - return Paragraph(title, ct) - - # 绘制普通段落内容 - @staticmethod - def draw_text(text: str): - # 获取所有样式表 - style = getSampleStyleSheet() - # 获取普通样式 - ct = style['Normal'] - ct.fontName = 'SimSun' - ct.fontSize = 12 - ct.wordWrap = 'CJK' # 设置自动换行 - ct.alignment = 0 # 左对齐 - ct.firstLineIndent = 32 # 第一行开头空格 - ct.leading = 25 - return Paragraph(text, ct) - - # 绘制表格 - @staticmethod - def draw_table(*args): - # 列宽度 - col_width = args[0] - style = [ - ('FONTNAME', (0, 0), (-1, -1), 'SimSun'), # 字体 - ('FONTSIZE', (0, 0), (-1, 0), 12), # 第一行的字体大小 - ('FONTSIZE', (0, 1), (-1, -1), 10), # 第二行到最后一行的字体大小 - ('BACKGROUND', (0, 0), (-1, 0), '#d5dae6'), # 设置第一行背景颜色 - ('ALIGN', (0, 0), (-1, -1), 'CENTER'), # 第一行水平居中 - ('ALIGN', (0, 1), (-1, -1), 'LEFT'), # 第二行到最后一行左右左对齐 - ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), # 所有表格上下居中对齐 - ('TEXTCOLOR', (0, 0), (-1, -1), colors.darkslategray), # 设置表格内文字颜色 - ('GRID', (0, 0), (-1, -1), 0.5, colors.grey), # 设置表格框线为grey色,线宽为0.5 - # ('SPAN', (0, 1), (0, 2)), # 合并第一列二三行 - # ('SPAN', (0, 3), (0, 4)), # 合并第一列三四行 - # ('SPAN', (0, 5), (0, 6)), # 合并第一列五六行 - # ('SPAN', (0, 7), (0, 8)), # 合并第一列五六行 - ] - table = Table(args[1:], colWidths=col_width, style=style) - return table - - # 创建图表 - @staticmethod - def draw_bar(bar_data: list, ax: list, items: list): - drawing = Drawing(500, 250) - bc = VerticalBarChart() - bc.x = 45 # 整个图表的x坐标 - bc.y = 45 # 整个图表的y坐标 - bc.height = 200 # 图表的高度 - bc.width = 350 # 图表的宽度 - bc.data = bar_data - bc.strokeColor = colors.black # 顶部和右边轴线的颜色 - bc.valueAxis.valueMin = 5000 # 设置y坐标的最小值 - bc.valueAxis.valueMax = 26000 # 设置y坐标的最大值 - bc.valueAxis.valueStep = 2000 # 设置y坐标的步长 - bc.categoryAxis.labels.dx = 2 - bc.categoryAxis.labels.dy = -8 - bc.categoryAxis.labels.angle = 20 - bc.categoryAxis.categoryNames = ax - - # 图示 - leg = Legend() - leg.fontName = 'SimSun' - leg.alignment = 'right' - leg.boxAnchor = 'ne' - leg.x = 475 # 图例的x坐标 - leg.y = 240 - leg.dxTextSpace = 10 - leg.columnMaximum = 3 - leg.colorNamePairs = items - drawing.add(leg) - drawing.add(bc) - return drawing - - # 绘制图片 - @staticmethod - def draw_img(path): - img = Image(path) # 读取指定路径下的图片 - img.drawWidth = 20*cm # 设置图片的宽度 - img.drawHeight = 10*cm # 设置图片的高度 - return img - -# 定义样式函数 -def style_row(row): - if '周' in row['频度']: - return ['background-color: yellow'] * len(row) - else: - return ['background-color: gray'] * len(row) - - - -class EtaReader(): - def __init__(self,signature,classifylisturl,classifyidlisturl,edbcodedataurl,edbcodelist,edbdatapushurl,edbdeleteurl,edbbusinessurl): - ''' - 初始化 EtaReader 类的实例。 - - 参数: - signature (str): 用于 API 请求的签名。 - classifylisturl (str): 分类列表的 URL。 - classifyidlisturl (str): 分类 ID 列表的 URL。 - edbcodedataurl (str): EDB 代码数据的 URL。 - edbdatapushurl (str): EDB 数据推送的 URL。 - edbcodelist (str): EDB 代码列表的 URL。 - edbdeleteurl (str): EDB 数据删除的 URL。 - edbbusinessurl (str): EDB 业务数据的 URL。 - - 返回: - None - ''' - self.signature = signature - self.classifylisturl = classifylisturl - self.classifyidlisturl = classifyidlisturl - self.edbcodedataurl = edbcodedataurl - self.edbdatapushurl = edbdatapushurl - self.edbcodelist = edbcodelist - self.edbdeleteurl = edbdeleteurl - self.edbbusinessurl = edbbusinessurl - - - def filter_yuanyou_data(self,ClassifyName,data): - ''' - 指标名称保留规则 - ''' - - # 包含 关键词 去除, 返回flase - if any(keyword in data for keyword in ['运费','检修','波动率','地缘政治','股价', - '同比','环比','环差','裂差','4WMA','变频','道琼斯','标普500','纳斯达克', - '四周均值','名占比','残差','DMA', - '连7-连9','4周平均','4周均值','滚动相关性','日本']): - return False - - # 检查需要的特征 - # 去掉 分析 分类下的数据 - if ClassifyName == '分析': - return False - - # 保留 库存中特殊关键词 - if ClassifyName == '库存': - if any(keyword in data for keyword in ['原油' , '美国' ,'全球' ,'中国' ,'富查伊拉','ARA' ]): - return True - else: - pass - else: - pass - - # 去掉 持仓中不是基金的数据 - if ClassifyName == '持仓': - if '基金' not in data: - return False - else: - pass - else: - pass - - # 去掉 航班中不是中国、美国 的数据 - if ClassifyName == '需求': - if '航班' in data : - if '中国' in data or '美国' in data : - return True - else: - return False - else: - pass - else: - pass - - # 分类为 期货市场,同质性数据取第一个 - if ClassifyName == '期货市场': - # 去掉c1-9 以后的 - if 'c1-c' in data: - try: - c = int(data.split('c1-c')[1]) - except: - return False - if c > 9 : - return False - else: - pass - - else: - pass - - # 判断 同质性数据, 字符串开头 - strstartdict = {'ICE Brent c':"ICE Brent c14", - 'NYMWX WTI c':"NYMWX WTI c5", - 'INE SC c':"INE SC c1", - 'EFS c':"EFS c", - 'Dubai Swap c':"Dubai Swap c1", - 'Oman Swap c':"Oman Swap c1", - 'DME Oman c':"DME Oman c1", - 'Murban Futures c':"Murban Futures c1", - 'Dubai连合约价格':'Dubai连1合约价格', - '美国RBOB期货月份合约价格':'美国RBOB期货2309月份合约价格', - 'Brent连合约价格':'Brent连1合约价格', - 'WTI连合约价格':'WTI连1合约价格', - '布伦特连合约价格':'Brent连1合约价格', - 'Brent 连合约价格':'Brent连1合约价格', - 'Dubai连合约价格':'Dubai连1合约价格', - 'Brent连':'Brent连1合约价格', - 'brent连':'Brent连1合约价格', - } - # 判断名称字符串开头是否在 strstartdict.keys中 - match = re.match(r'([a-zA-Z\s]+)(\d+)', data) - if match: - part1 = match.group(1) - part2 = match.group(2) - if part1 in [i for i in strstartdict.keys()]: - if data == strstartdict[part1]: - return True - else: - return False - # data = 'Brent 连7合约价格' - # 判断名称字符串去掉数字后是否在 strstartdict.keys中 - match = re.findall(r'\D+', data) - if match : - if len(match) == 2: - part1 = match[0] - part2 = match[1] - if part1+part2 in [i for i in strstartdict.keys()]: - if data == strstartdict[part1+part2]: - return True - else: - return False - else: - pass - elif len(match) == 1: - match = re.findall(r'\D+', data) - part1 = match[0] - - if part1 in [i for i in strstartdict.keys()]: - if data == strstartdict[part1]: - return True - else: - return False - else: - pass - else: - pass - - # 去掉kpler数据源 - if 'Kpler' in ClassifyName or 'kpler' in ClassifyName: - return False - - return True - - def filter_pp_data(self,ClassifyName,data): - ''' - 指标名称保留规则 - ''' - - # 包含 关键词 去除, 返回flase - # if any(keyword in data for keyword in ['运费','检修','波动率','地缘政治','股价', - # '同比','环比','环差','裂差','4WMA','变频','道琼斯','标普500','纳斯达克', - # '四周均值','名占比','残差','DMA', - # '连7-连9','4周平均','4周均值','滚动相关性','日本']): - # return False - # 包含 关键词 保留, 返回True - if any(keyword in data for keyword in ['拉丝']): - return True - - - - # 检查需要的特征 - # 去掉 期货市场 分类下的数据 - if ClassifyName == '期货市场': - return False - else: - pass - - # 保留 库存 下所有指标 - if ClassifyName == '库存': - return True - else: - pass - - # 保留 进出口 下所有指标 - if ClassifyName == '进出口': - return True - else: - pass - - # 保留 价差 下所有指标 - if ClassifyName == '价差': - return True - else: - pass - - # 保留 供应 下所有指标 - if ClassifyName == '供应': - return True - else: - pass - - - # 保留 需求 下所有指标 - if ClassifyName == '需求': - return True - else: - pass - - - return True - - # 通过edbcode 获取指标数据 - def edbcodegetdata(self,df,EdbCode,EdbName): - # 根据指标id,获取指标数据 - url = self.edbcodedataurl+str(EdbCode) - # 发送GET请求 - response = requests.get(url, headers=self.headers) - - # 检查响应状态码 - if response.status_code == 200: - data = response.json() # 假设接口返回的是JSON数据 - all_data_items = data.get('Data') - # 列表转换为DataFrame - df3 = pd.DataFrame(all_data_items, columns=['DataTime', 'Value', 'UpdateTime']) - # df3 = pd.read_json(all_data_items, orient='records') - - # 去掉UpdateTime 列 - df3 = df3.drop(columns=['UpdateTime']) - # df3.set_index('DataTime') - df3.rename(columns={'Value': EdbName}, inplace=True) - # 将数据存储df1 - df = pd.merge(df, df3, how='outer',on='DataTime',suffixes= ('', '_y')) - # 按时间排序 - df = df.sort_values(by='DataTime', ascending=True) - return df - - else: - # 请求失败,打印错误信息 - logger.info(f'Error: {response.status_code}, {response.text}') - # 主动抛出异常 - raise Exception(f'Error: {response.status_code}, {response.text}') - - def get_eta_api_yuanyou_data(self,data_set,dataset=''): - ''' - 从ETA API获取原油数据 - - 参数: - data_set (str): 数据集名称 - dataset (str): 数据集ID,默认为空 - - 返回: - None - ''' - today = datetime.date.today().strftime("%Y-%m-%d") - - # 定义你的headers,这里可以包含多个参数 - self.headers = { - 'nonce': self.signature.nonce, # 例如,一个认证令牌 - 'timestamp': str(self.signature.timestamp), # 自定义的header参数 - 'appid': self.signature.APPID, # 另一个自定义的header参数 - 'signature': self.signature.signature - } - - # 从列表数据中获取指标名称,判断指标名称频度是否为日 ,如果是,则获取UniqueCode,然后获取指标数据,保存到xlat文件中的sheet表。 - - ''' - df = sheetname 指标列表,存储 指标分类-指标名称-指标id-频度 - df1 = sheetname 指标数据 ,存储 时间-指标名称1-指标名称2... - - ''' - - # 构建新的DataFrame df df1 - df = pd.DataFrame(columns=['指标分类', '指标名称', '指标id', '频度','指标来源','来源id','最后更新时间','更新周期','预警日期','停更周期']) - df1 = pd.DataFrame(columns=['DataTime']) - - - # 外网环境无法访问,请确认是否为内网环境 - try: - # 发送GET请求 获取指标分类列表 - response = requests.get(self.classifylisturl, headers=self.headers) - except requests.exceptions.RequestException as e: - raise Exception(f"请求失败,请确认是否为内网环境: {e}","\033[0m") - - # 检查响应状态码 - if response.status_code == 200: - # 获取成功, 处理响应内容 - data = response.json() # 假设接口返回的是JSON数据 - - # 请求成功,处理响应内容 - # logger.info(data.get('Data')) - # 定义你想要保留的固定值 - fixed_value = 1214 - - # 遍历列表,只保留那些'category' key的值为固定值的数据项 - filtered_data = [item for item in data.get('Data') if item.get('ParentId') == fixed_value] - - #然后循环filtered_data去获取list数据,才能获取到想要获取的ClassifyId - n = 0 - for item in filtered_data: - n+= 1 - # if n>50: - # break - ClassifyId = item["ClassifyId"] #分类id,分类下的指标列表接口的请求参数 - ClassifyName = item["ClassifyName"] #分类名称,要保存到df的指标分类列 - # 根据分类id,获取指标列表 - url = self.classifyidlisturl+str(ClassifyId) - response = requests.get(url, headers=self.headers) - if response.status_code == 200: - # logger.info(response.text) - data2 = response.json() - Data = data2.get('Data') - for i in Data: - # s+= 1 - EdbCode = i.get('EdbCode') - EdbName = i.get('EdbName') # 指标名称,要保存到df2的指标名称列,df的指标名称列 - Frequency = i.get('Frequency') # 频度,要保存到df的频度列 - SourceName = i.get('SourceName') # 来源名称,要保存到df的频度列 - Source = i.get('Source') # 来源ID,要保存到df的频度列 - Unit = i.get('Unit') # 单位,要保存到df的单位列 - # 频度不是 日 或者 周的 跳过 - if Frequency not in ['日度','周度','日','周']: - continue - - # 只保留手工数据中,名称带有 海运出口 海运进口 - if Source == 9 and not ('海运出口' in EdbName or '海运进口' in EdbName): - continue - - # 不要wind数据 - if Source == 2: - continue - - - # 判断名称是否需要保存 - isSave = self.filter_yuanyou_data(ClassifyName,EdbName) - if isSave: - # 保存到df - df1 = self.edbcodegetdata(df1,EdbCode,EdbName) - # 取df1所有行最后一列 - edbname_df = df1[['DataTime',f'{EdbName}']] - edbname_df = edbname_df.dropna() - - if len(edbname_df) == 0: - logger.info(f'指标名称:{EdbName} 没有数据') - continue - try: - time_sequence = edbname_df['DataTime'].values.tolist()[-10:] - except IndexError: - time_sequence = edbname_df['DataTime'].values.tolist() - # 使用Counter来统计每个星期几的出现次数 - from collections import Counter - weekday_counter = Counter(datetime.datetime.strptime(time_str, "%Y-%m-%d").strftime('%A') for time_str in time_sequence) - - # 打印出现次数最多的星期几 - try: - most_common_weekday = weekday_counter.most_common(1)[0][0] - # 计算两周后的日期 - warning_date = (datetime.datetime.strptime(time_sequence[-1], "%Y-%m-%d") + datetime.timedelta(weeks=2)).strftime("%Y-%m-%d") - stop_update_period = (datetime.datetime.strptime(today, "%Y-%m-%d") - datetime.datetime.strptime(time_sequence[-1], "%Y-%m-%d")).days // 7 - - except IndexError: - most_common_weekday = '其他' - stop_update_period = 0 - if '日' in Frequency: - most_common_weekday = '每天' - warning_date = (datetime.datetime.strptime(time_sequence[-1], "%Y-%m-%d") + datetime.timedelta(days=3)).strftime("%Y-%m-%d") - stop_update_period = (datetime.datetime.strptime(today, "%Y-%m-%d") - datetime.datetime.strptime(time_sequence[-1], "%Y-%m-%d")).days - - # 保存频度 指标名称 分类 指标id 到 df - df2 = pd.DataFrame({'指标分类': ClassifyName, - '指标名称': EdbName, - '指标id': EdbCode, - '单位': Unit, - '频度': Frequency, - '指标来源':SourceName, - '来源id':Source, - '最后更新时间':edbname_df['DataTime'].values[-1], - '更新周期':most_common_weekday, - '预警日期':warning_date, - '停更周期':stop_update_period},index=[0], - ) - - # df = pd.merge(df, df2, how='outer') - df = pd.concat([df, df2]) - else: - logger.info(f'跳过指标 {EdbName}') - - # 找到列表中不在指标列中的指标id,保存成新的list - new_list = [item for item in self.edbcodelist if item not in df['指标id'].tolist()] - logger.info(new_list) - # 遍历new_list,获取指标数据,保存到df1 - for item in new_list: - logger.info(item) - # 将item 加入到 df['指标id']中 - try: - itemname = edbcodenamedict[item] - except: - itemname = item - - df1 = self.edbcodegetdata(df1,item,itemname) - df = pd.concat([df, pd.DataFrame({'指标分类': '其他', '指标名称': itemname, '指标id': item, '频度': '其他','指标来源':'其他','来源id':'其他'},index=[0])]) - - # 按时间排序 - df1.sort_values('DataTime',inplace=True,ascending=False) - df1.rename(columns={'DataTime': 'date'},inplace=True) - # df1.dropna(inplace=True) - # 去掉大于今天日期的行 - df1 = df1[df1['date'] <= datetime.datetime.now().strftime('%Y-%m-%d')] - logger.info(df1.head()) - # logger.info(f'{df1.head()}') - - df_zhibiaoshuju = df1.copy() - df_zhibiaoliebiao = df.copy() - return df_zhibiaoshuju,df_zhibiaoliebiao - - def get_eta_api_pp_data(self,data_set,dataset=''): - global ClassifyId - today = datetime.date.today().strftime("%Y-%m-%d") - - # 定义你的headers,这里可以包含多个参数 - self.headers = { - 'nonce': self.signature.nonce, # 例如,一个认证令牌 - 'timestamp': str(self.signature.timestamp), # 自定义的header参数 - 'appid': self.signature.APPID, # 另一个自定义的header参数 - 'signature': self.signature.signature - } - - # 从列表数据中获取指标名称,判断指标名称频度是否为日 ,如果是,则获取UniqueCode,然后获取指标数据,保存到xlat文件中的sheet表。 - - ''' - df = sheetname 指标列表,存储 指标分类-指标名称-指标id-频度 - df1 = sheetname 指标数据 ,存储 时间-指标名称1-指标名称2... - - ''' - - # 构建新的DataFrame df df1 - df = pd.DataFrame(columns=['指标分类', '指标名称', '指标id', '频度']) - df1 = pd.DataFrame(columns=['DataTime']) - - - # 外网环境无法访问,请确认是否为内网环境 - try: - # 发送GET请求 获取指标分类列表 - response = requests.get(self.classifylisturl, headers=self.headers) - except requests.exceptions.RequestException as e: - raise Exception(f"请求失败,请确认是否为内网环境: {e}","\033[0m") - - # 检查响应状态码 - if response.status_code == 200: - # 获取成功, 处理响应内容 - data = response.json() # 假设接口返回的是JSON数据 - - # 请求成功,处理响应内容 - # logger.info(data.get('Data')) - # 定义你想要保留的固定值 - fixed_value = ClassifyId - - # 遍历列表,只保留那些'category' key的值为固定值的数据项 - filtered_data = [item for item in data.get('Data') if item.get('ParentId') == fixed_value] - - #然后循环filtered_data去获取list数据,才能获取到想要获取的ClassifyId - n = 0 - for item in filtered_data: - n+= 1 - # if n>50: - # break - ClassifyId = item["ClassifyId"] #分类id,分类下的指标列表接口的请求参数 - ClassifyName = item["ClassifyName"] #分类名称,要保存到df的指标分类列 - # 根据分类id,获取指标列表 - url = self.classifyidlisturl+str(ClassifyId) - response = requests.get(url, headers=self.headers) - if response.status_code == 200: - # logger.info(response.text) - data2 = response.json() - Data = data2.get('Data') - for i in Data: - # s+= 1 - EdbCode = i.get('EdbCode') - EdbName = i.get('EdbName') # 指标名称,要保存到df2的指标名称列,df的指标名称列 - Frequency = i.get('Frequency') # 频度,要保存到df的频度列 - # 频度不是 日 或者 周的 跳过 - if Frequency not in ['日度','周度','日','周']: - continue - - # 判断名称是否需要保存 - isSave = self.filter_pp_data(ClassifyName,EdbName) - if isSave: - # 保存到df - # 保存频度 指标名称 分类 指标id 到 df - df2 = pd.DataFrame({'指标分类': ClassifyName, '指标名称': EdbName, '指标id': EdbCode, '频度': Frequency},index=[0]) - - # df = pd.merge(df, df2, how='outer') - df = pd.concat([df, df2]) - df1 = self.edbcodegetdata(df1,EdbCode,EdbName) - else: - logger.info(f'跳过指标 {EdbName}') - - # 找到列表中不在指标列中的指标id,保存成新的list - new_list = [item for item in self.edbcodelist if item not in df['指标id'].tolist()] - logger.info(new_list) - # 遍历new_list,获取指标数据,保存到df1 - for item in new_list: - logger.info(item) - # 将item 加入到 df['指标id']中 - try: - itemname = edbcodenamedict[item] - except: - itemname = item - - df1 = self.edbcodegetdata(df1,item,itemname) - df = pd.concat([df, pd.DataFrame({'指标分类': '其他', '指标名称': itemname, '指标id': item, '频度': '其他'},index=[0])]) - - # 按时间排序 - df1.sort_values('DataTime',inplace=True,ascending=False) - df1.rename(columns={'DataTime': 'date'},inplace=True) - # df1.dropna(inplace=True) - # 去掉大于今天日期的行 - df1 = df1[df1['date'] <= datetime.datetime.now().strftime('%Y-%m-%d')] - logger.info(df1.head()) - # logger.info(f'{df1.head()}') - # 保存到xlsx文件的sheet表 - with pd.ExcelWriter(os.path.join(dataset,data_set)) as file: - df1.to_excel(file, sheet_name='指标数据', index=False) - df.to_excel(file, sheet_name='指标列表', index=False) - - df_zhibiaoshuju = df1.copy() - df_zhibiaoliebiao = df.copy() - return df_zhibiaoshuju,df_zhibiaoliebiao - - def push_data(self,data): - - today = datetime.date.today().strftime("%Y-%m-%d") - - # 定义你的headers,这里可以包含多个参数 - self.headers = { - 'nonce': self.signature.nonce, # 例如,一个认证令牌 - 'timestamp': str(self.signature.timestamp), # 自定义的header参数 - 'appid': self.signature.APPID, # 另一个自定义的header参数 - 'signature': self.signature.signature - } - - # 发送post请求 上传数据 - logger.info('请求参数:',data) - response = requests.post(self.edbdatapushurl, headers=self.headers,data=json.dumps(data)) - - # 检查响应状态码 - if response.status_code == 200: - data = response.json() # 假设接口返回的是JSON数据 - - logger.info('上传成功,响应为:', data) - - else: - # 请求失败,打印错误信息 - logger.info(f'Error: {response.status_code}, {response.text}') - # 主动抛出异常 - raise Exception(f'Error: {response.status_code}, {response.text}') - - def del_zhibiao(self,IndexCodeList): - today = datetime.date.today().strftime("%Y-%m-%d") - - # 定义你的headers,这里可以包含多个参数 - self.headers = { - 'nonce': self.signature.nonce, # 例如,一个认证令牌 - 'timestamp': str(self.signature.timestamp), # 自定义的header参数 - 'appid': self.signature.APPID, # 另一个自定义的header参数 - 'signature': self.signature.signature - } - - data = { - "IndexCodeList": IndexCodeList #指标编码列表 - } - # 发送post请求 上传数据 - response = requests.post(self.edbdeleteurl, headers=self.headers,data=json.dumps(data)) - - - # 检查响应状态码 - if response.status_code == 200: - data = response.json() # 假设接口返回的是JSON数据 - - logger.info('删除成功,响应为:', data) - - else: - # 请求失败,打印错误信息 - logger.info(f'Error: {response.status_code}, {response.text}') - # 主动抛出异常 - raise Exception(f'Error: {response.status_code}, {response.text}') - - def del_business(self,data): - '''' - 接口地址 - https://console-docs.apipost.cn/preview/fce869601d0be1d9/9a637c2f9ed0c589?target_id=d3cafcbf-a68c-42b3-b105-7bbd0e95a9cd - - 请求体 body - { - "IndexCode": "W001067", //指标编码 - "StartDate": "2020-04-20", //指标需要删除的开始日期(>=),如果开始日期和结束日期相等,那么就是删除该日期 - "EndDate": "2024-05-28" //指标需要删除的结束日期(<=),如果开始日期和结束日期相等,那么就是删除该日期 - } - ''' - today = datetime.date.today().strftime("%Y-%m-%d") - - # 定义你的headers,这里可以包含多个参数 - self.headers = { - 'nonce': self.signature.nonce, # 例如,一个认证令牌 - 'timestamp': str(self.signature.timestamp), # 自定义的header参数 - 'appid': self.signature.APPID, # 另一个自定义的header参数 - 'signature': self.signature.signature - } - - - # 发送post请求 上传数据 - response = requests.post(self.edbbusinessurl, headers=self.headers,data=json.dumps(data)) - - - # 检查响应状态码 - if response.status_code == 200: - data = response.json() # 假设接口返回的是JSON数据 - - logger.info('删除成功,响应为:', data) - - else: - # 请求失败,打印错误信息 - logger.info(f'Error: {response.status_code}, {response.text}') - # 主动抛出异常 - raise Exception(f'Error: {response.status_code}, {response.text}') - - -def get_market_data(end_time,df): - """ - 获取市场数据,拼接到df中 - """ - # 获取token - token = get_head_auth_report() - # 定义请求参数 - query_data_list_item_nos_data['data']['dateEnd'] = end_time.replace('-','') - # 发送请求 - headers = {"Authorization": token} - logger.info('获取数据中...') - items_res = requests.post(url=query_data_list_item_nos_url, headers=headers, json=query_data_list_item_nos_data, timeout=(3, 35)) - json_data = json.loads(items_res.text) - logger.info(f"获取到的数据:{json_data}") - df3 = pd.DataFrame(json_data['data']) - # 按照dataItemNo 分组 得到多个dataframe ,最后根据dataDate merge 成一个dataframe - df2 = pd.DataFrame() - for i in df3['dataItemNo'].unique(): - df1 = df3[df3['dataItemNo'] == i] - df1 = df1[['dataDate', 'dataValue']] - df1 = df1.rename(columns={'dataValue': i}) - if len(df2) == 0: - df2 = df1 - continue - df2 = pd.merge(df2, df1, how='left') - df2 = df2.rename(columns={'dataDate': 'date'}) - # 20240101 转换为 2024-01-01 - df2['date'] = pd.to_datetime(df2['date'], format='%Y%m%d') - df2['date'] = df2['date'].dt.strftime('%Y-%m-%d') - df = pd.merge(df, df2, how='left',on='date') - return df - - -def get_high_low_data(df): - # 读取excel 从第五行开始 - df1 = pd.read_excel(os.path.join(dataset,'数据项下载.xls'),header=5, names=['numid','date', 'Brentzdj', 'Brentzgj']) - # 合并数据 - df = pd.merge(df, df1, how='left',on='date') - return df - - -# 时间特征,年,月,一年的多少天,周几,第几周,第几季度,每月的第几天, 每季度的第几天,是否每月的第一天,是否每月的最后一天,是否每季度的第一天,是否每季度的最后一天,是否每年的第一天,是否每年的最后一天 -def addtimecharacteristics(df,dataset): - """ - 为输入的 DataFrame 添加日期相关信息列 - - 参数: - df (pandas.DataFrame): 包含日期列 'ds' 的 DataFrame - - 返回: - pandas.DataFrame: 添加了相关列的 DataFrame - """ - df['year'] = df['ds'].dt.year - df['month'] = df['ds'].dt.month - df['day'] = df['ds'].dt.day - df['dayofweek'] = df['ds'].dt.dayofweek - df['weekofyear'] = df['ds'].dt.isocalendar().week - df['dayofyear'] = df['ds'].dt.dayofyear - df['quarternum'] = df['ds'].dt.quarter - # 将ds列转换为季度Period对象 - df['quarter'] = df['ds'].dt.to_period('Q') - # 获取每个季度的开始日期 - df['quarter_start'] = df['quarter'].dt.to_timestamp('s') - # 计算每个日期是所在季度的第几天 - df['dayofquarter'] = (df['ds'] - df['quarter_start']).dt.days + 1 - # 是否月初 - df['is_month_start'] = df['ds'].dt.is_month_start.astype(int) - # 是否月末 - df['is_month_end'] = df['ds'].dt.is_month_end.astype(int) - # 是否季度初 - df['is_quarter_start'] = df['ds'].dt.is_quarter_start.astype(int) - # 是否季度末 - df['is_quarter_end'] = df['ds'].dt.is_quarter_end.astype(int) - # 是否年初 - df['is_year_start'] = df['ds'].dt.is_year_start.astype(int) - # 是否年末 - df['is_year_end'] = df['ds'].dt.is_year_end.astype(int) - # 去掉 quarter_start quarter - df.drop(columns=['quarter_start','quarter'],inplace=True) - df.to_csv(os.path.join(dataset,'指标数据添加时间特征.csv'), index=False) - return df diff --git a/lib/dataread_yongan.py b/lib/dataread_yongan.py deleted file mode 100644 index 7475f69..0000000 --- a/lib/dataread_yongan.py +++ /dev/null @@ -1,1733 +0,0 @@ - -# 导入模块 -import pandas as pd -import numpy as np -import datetime -import string -import base64 -import requests -import random -import time -import re -import os -import hmac -import hashlib -import json -import math -import torch -torch.set_float32_matmul_precision("high") -import matplotlib.pyplot as plt -#设置plt显示中文 -plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 -plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 - -from datetime import timedelta -from sklearn import metrics -from reportlab.pdfbase import pdfmetrics # 注册字体 -from reportlab.pdfbase.ttfonts import TTFont # 字体类 -from reportlab.platypus import Table, SimpleDocTemplate, Paragraph, Image # 报告内容相关类 -from reportlab.lib.pagesizes import letter # 页面的标志尺寸(8.5*inch, 11*inch) -from reportlab.lib.styles import getSampleStyleSheet # 文本样式 -from reportlab.lib import colors # 颜色模块 -from reportlab.graphics.charts.barcharts import VerticalBarChart # 图表类 -from reportlab.graphics.charts.legends import Legend # 图例类 -from reportlab.graphics.shapes import Drawing # 绘图工具 -from reportlab.lib.units import cm # 单位:cm - -# 注册字体(提前准备好字体文件, 如果同一个文件需要多种字体可以注册多个) -pdfmetrics.registerFont(TTFont('SimSun', 'SimSun.ttf')) -#设置plt显示中文 -plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 -plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 - - -from config_yongan import * - - - - -# 定义函数 -def loadcsv(filename): - """ - 读取指定文件名的 CSV 文件。 - 如果文件编码为 UTF-8,则使用 UTF-8 编码读取;否则,使用 GBK 编码读取。 - - 参数: - filename (str): 要读取的 CSV 文件的文件名。 - - 返回: - pandas.DataFrame: 读取的数据。 - - """ - # 读取csv文件 - try: - df = pd.read_csv(filename, encoding='utf-8') - except UnicodeDecodeError: - df = pd.read_csv(filename, encoding='gbk') - return df - - -def dateConvert(df, datecol='ds'): - """ - 将数据框 df 中的 datecol 列转换为日期时间类型。 - - 参数: - df (pandas.DataFrame): 要转换的 DataFrame。 - datecol (str): 要转换的列名,默认为 'ds'。 - - 返回: - pandas.DataFrame: 转换后的 DataFrame。 - - """ - # 将date列转换为datetime类型 - try: - df[datecol] = pd.to_datetime(df[datecol],format=r'%Y-%m-%d') - except: - df[datecol] = pd.to_datetime(df[datecol],format=r'%Y/%m/%d') - return df - - -def calculate_kdj(data, n=9): - ''' - 给传进来的df 添加列: 波动率,最高,最低,k,d ,j - ''' - # 对数据按照日期升序排序 - data = data.sort_values(by='ds', ascending=True) - # 因为没有高开低价格,利用每日波动率模拟当天最高价和最低价 - data['pctchange'] = data['y'].pct_change() - # 收益为0的用0.01 - data['pctchange'] = data['pctchange'].replace(0,0.01) - # 去除空值 - data.dropna(inplace=True) - # 重置索引 - data.reset_index(drop=True,inplace=True) - # 计算最高价和最低价 - data['high'] = data['y']* (1+abs(data['pctchange'])/2) - data['low'] = data['y']* (1-abs(data['pctchange'])/2) - # 计算n日内最低价 - low_list = data['y'].rolling(window=n, min_periods=1).min() - # 计算n日内最高价 - high_list = data['y'].rolling(window=n, min_periods=1).max() - # 计算未成熟随机值 - rsv = ((data['y'] - low_list) / (high_list - low_list)) * 100 - # 初始化k值为50 - k = pd.Series(50, index=data.index) - # 初始化d值为50 - d = pd.Series(50, index=data.index) - # 计算k值和d值 - for i in range(1, len(data)): - k[i] = (2/3 * k[i - 1]) + (1/3 * rsv[i]) - d[i] = (2/3 * d[i - 1]) + (1/3 * k[i]) - # 计算j值 - j = 3 * k - 2 * d - - # 将k值、d值和j值添加到数据中 - data['K'] = k - data['D'] = d - data['J'] = j - # 将包含 KDJ 指标的数据保存到新的 CSV 文件 - data.to_csv('stock_data_with_kdj.csv', index=False) - # data = data.dropna() - return data - - -# 上传报告 -def get_head_auth_report(): - """ - 通过 POST 请求登录到指定的 URL,并从响应中获取认证令牌。 - - 返回: - str: 如果登录成功,返回认证令牌;否则返回 None。 - """ - logger.info("获取token中...") - logger.info(f'url:{login_pushreport_url},login_data:{login_data}') - # 发送 POST 请求到登录 URL,携带登录数据 - login_res = requests.post(url=login_pushreport_url, json=login_data, timeout=(3, 30)) - - # 将响应内容转换为 JSON 格式 - text = json.loads(login_res.text) - logger.info(f'token接口响应:{text}') - # 如果响应状态为成功 - if text["status"]: - # 从响应数据中获取认证令牌 - token = text["data"]["accessToken"] - # 返回认证令牌 - return token - - -def upload_report_data(token, upload_data): - """ - 上传报告数据到指定的URL - - 参数: - token (str): 认证令牌 - upload_data (dict): 要上传的报告数据,包含必要的字段和信息 - - 返回: - dict: 如果上传成功,返回响应对象;否则返回None - """ - # 直接使用传入的 upload_data - upload_data = upload_data - - # 设置请求头部 - headers = {"Authorization": token} - - # 打印日志,显示正在上传报告数据 - logger.info("报告上传中...") - - # 打印日志,显示认证头部信息 - logger.info(f"token:{token}") - - # 打印日志,显示要上传的报告数据 - logger.info(f"upload_data:{upload_data}" ) - - # 发送POST请求,上传报告数据 - upload_res = requests.post(url=upload_url, headers=headers, json=upload_data, timeout=(3, 15)) - - # 将响应内容转换为 JSON 格式 - upload_res = json.loads(upload_res.text) - - # 打印日志,显示响应内容 - logger.info(upload_res) - - # 如果上传成功,返回响应对象 - if upload_res: - return upload_res - # 如果上传失败,打印日志并返回None - else: - logger.info("报告上传失败") - return None - - -def upload_warning_data(warning_data): - """ - 上传预警数据到指定的URL - - 参数: - warning_data (dict): 要上传的预警数据,包含必要的字段和信息 - - 返回: - requests.Response: 如果上传成功,返回响应对象;否则返回None - """ - # 获取认证头部信息 - token = get_head_auth_report() - - # 设置请求头部 - headers = {"Authorization": token} - - # 打印日志,显示正在上传预警数据 - logger.info("预警上传中...") - - # 打印日志,显示上传的URL - logger.info(f"upload_warning_url:{upload_warning_url}") - - # 打印日志,显示认证头部信息 - logger.info(f"token:{token}") - - # 打印日志,显示要上传的预警数据 - logger.info(f"warning_data:{warning_data}") - - # 发送POST请求,上传预警数据 - upload_res = requests.post(url=upload_warning_url, headers=headers, json=warning_data, timeout=(3, 15)) - - # 如果上传成功,返回响应对象 - if upload_res: - return upload_res - # 如果上传失败,打印日志并返回None - else: - logger.info("预警上传失败") - return None - - - -def upload_warning_info(df_count): - """ - 上传预警信息到指定的URL - - 参数: - df_count (int): 停更的数量 - - 返回: - None - """ - # 打印日志,显示正在上传预警信息 - logger.info(f'上传预警信息') - - try: - # 获取当前日期 - warning_date = datetime.datetime.now().strftime('%Y-%m-%d') - - # 构建预警内容 - content = f'{warning_date}有{df_count}个停更' - - # 更新预警数据中的日期和内容 - warning_data['data']['WARNING_DATE'] = warning_date - warning_data['data']['WARNING_CONTENT'] = content - - # 调用 upload_warning_data 函数上传预警数据 - upload_warning_data(warning_data) - - # 打印日志,显示上传预警信息成功 - logger.info(f'上传预警信息成功') - except Exception as e: - # 打印日志,显示上传预警信息失败,并记录异常信息 - logger.error(f'上传预警信息失败:{e}') - - - -def create_feature_last_update_time(df): - """ - 计算特征停更信息用 - 参数: - df (DataFrame): 包含特征数据的 DataFrame - 返回: - DataFrame: 包含特征停更信息的 DataFrame - str: y 列的最后更新时间 - """ - df1 = df.copy() - # 找到每列的最后更新时间 - df1.set_index('ds', inplace=True) - last_update_times = df1.apply(lambda x: x.dropna().index.max().strftime('%Y-%m-%d') if not x.dropna().empty else None) - - # 保存每列的最后更新时间到文件 - last_update_times_df = pd.DataFrame(columns = ['feature', 'last_update_time','is_value','update_period','warning_date','stop_update_period']) - - # 打印每列的最后更新时间 - for column, last_update_time in last_update_times.items(): - values = [] - # 判断是不是常数值 - if df1[column].tail(20).nunique() == 1: - values = values + [column, last_update_time,1] - else: - values = values + [column, last_update_time,0] - # 计算特征数据值的时间差 - try: - # 计算预警日期 - time_diff = (df1[column].dropna().index.to_series().diff().mode()[0]).total_seconds() / 3600 / 24 - last_update_time_datetime = datetime.datetime.strptime(last_update_time, '%Y-%m-%d') - last_update_date = end_time if end_time != '' else datetime.datetime.now().strftime('%Y-%m-%d') - end_time_datetime = datetime.datetime.strptime(last_update_date, '%Y-%m-%d') - early_warning_date = last_update_time_datetime + timedelta(days=time_diff)*2 + timedelta(days=1) - stop_update_period = int(math.ceil((end_time_datetime-last_update_time_datetime).days / time_diff)) - early_warning_date = early_warning_date.strftime('%Y-%m-%d') - except KeyError: - time_diff = 0 - early_warning_date = end_time - continue - - values = values + [time_diff,early_warning_date,stop_update_period] - last_update_times_df.loc[len(last_update_times_df)] = values - - logger.info(f"Column {column} was last updated at {last_update_time}") - y_last_update_time = last_update_times_df[last_update_times_df['feature']=='y']['warning_date'].values[0] - last_update_times_df.to_csv(os.path.join(dataset,'last_update_times.csv'), index=False) - logger.info('特征停更信息保存到文件:last_update_times.csv') - return last_update_times_df,y_last_update_time - - - -# 统计特征频度 -def featurePindu(dataset): - # 读取文件 - df = loadcsv(os.path.join(dataset,'未填充的特征数据.csv')) - df['ds'] = pd.to_datetime(df['ds']) - # 按ds正序排序,重置索引 - df = df.sort_values(by='ds', ascending=True).reset_index(drop=True) - - # 统计特征频度 - # 每列随机抽取10个值,计算出5个时间间隔,统计每个时间间隔的频度 - columns = df.columns.to_list() - columns.remove('ds') - count_dict = {} - for column in columns: - # 获取每列时间间隔 - values = df[[column,'ds']] - values.dropna(inplace=True,axis=0) - values=values.reset_index(drop=True) - - # 抽取20%个值 - value = values.sample(frac=0.2) - index = value.index - next_index = index + 1 - count = [] - for i,j in zip(index, next_index): - #通过索引计算日期差 - try: - count.append((values.loc[j,'ds'] - values.loc[i,'ds']).days) - except: - pass - # 把31 换成 30 - count = [30 if i == 31 else i for i in count] - # 保留count中出现次数最多的数 - try: - count = max(set(count), key=count.count) - except ValueError : - logger.info(f'{column}列数据为空') - continue - # 存储到字典中 - count_dict[column] = count - - df = pd.DataFrame(count_dict,index=['count']).T - pindu_dfs = pd.DataFrame() - # 根据count分组 - # 输出特征频度统计 - pindudict = {'1':'日度','3':'日度','7':'周度','30':'月度','90':'季度','180':'半年度','365':'年度'} - for i in df.groupby('count'): - # 获取 i[1] 的索引值 - index = i[1].index - pindu_df = pd.DataFrame() - try: - pindu_df[pindudict[str(i[0])]+f'({len(i[1])})'] = index - except KeyError : - pindu_df[str(i[0])+f'天({len(i[1])})'] = index - # 合并到pindu_dfs - pindu_dfs = pd.concat([pindu_dfs,pindu_df],axis=1) - # nan替换为 ' ' - pindu_dfs = pindu_dfs.fillna('') - pindu_dfs.to_csv(os.path.join(dataset,'特征频度统计.csv'),index=False) - logger.info(pindu_dfs) - featureInfo = f'特征信息:总共有{len(columns)-2}个' - for i in pindu_dfs.columns: - featureInfo += f',{i}' - - featureInfo += ', 详看 附1、特征列表' - - featureInfo += ''' - 数据特征工程: - 1. 数据日期排序,新日期在最后 - 2. 删除空列,特征数据列没有值,就删除 - 3. 删除近两月不再更新值的指标 - 4. 非日度数据填充为日度数据,填充规则: - -- 向后填充,举例:假设周五出现一个周度指标数据,那么在这之前的数据用上周五的数据 - -- 向前填充,举例:采集数据开始日期为2018年1月1日,那么周度数据可能是2018年1月3日,那么3日的数据向前填充,使1日2日都有数值 - 数据特征相关性分析: - ''' - logger.info(featureInfo) - with open(os.path.join(dataset,'特征频度统计.txt'), 'w', encoding='utf-8') as f: - f.write(featureInfo) - logger.info('*'*200) - - -def featureAnalysis(df,dataset,y): - # 特征筛选 - import matplotlib.pyplot as plt - # 选择特征和标签列 - X = df.drop(['ds', 'y'], axis=1) # 特征集,排除时间戳和标签列 - yy = df['y'] # 标签集 - - # 标签集自相关函数分析 - from statsmodels.graphics.tsaplots import plot_acf - plot_acf(yy, lags=30) - plt.savefig(os.path.join(dataset,'指标数据自相关图.png')) - plt.close() - - # 标签集偏自相关函数分析 - from statsmodels.graphics.tsaplots import plot_pacf - plot_pacf(yy, lags=30) - plt.savefig(os.path.join(dataset,'指标数据偏自相关图.png')) - plt.close() - - # 画 特征与价格散点图 - # 删除所有*散点图.png - for file in os.listdir(dataset): - if file.endswith("散点图.png"): - os.remove(os.path.join(dataset, file)) - plt.rcParams['font.sans-serif'] = ['SimHei'] - plt.rcParams['axes.unicode_minus'] = False - plt.figure(figsize=(10, 10)) - # # 遍历X每一列,和yy画散点图 , - # for i, col in enumerate(X.columns): - # plt.subplot(2, 2, i%4+1) - # plt.scatter(X[col], yy) - # plt.xlabel(col) - # plt.ylabel(y) - # plt.title(col) - # if i % 4 == 3 or i == len(X.columns)-1: - # plt.tight_layout() - # plt.savefig(os.path.join(dataset,f'{i}指标数据特征与价格散点图.png')) - # plt.close() - - - -def corr_feature(df): - # 重新命名列名,列名排序,y在第一个 - df.reindex(['y'] + sorted(df.columns.difference(['y']))) - df_test = df.copy() - # 取最后的220行 - df_test = df_test.tail(220) - # 去掉日期列 - df_test = df_test.drop(columns=['ds']) - # 不参与标准化 - df_test_noscaler = df_test.copy() # 滞后处理备份 - df_noscaler = df_test.copy() - # 画出相关性热力图 - df_test.to_csv(os.path.join(dataset,'同步相关性.csv')) - corr = df_test.corr() - # 保存相关系数 - corr.to_csv(os.path.join(dataset,'同步相关性系数.csv')) - # plt.figure(figsize=(10, 10)) - # sns.heatmap(corr, annot=True, cmap='coolwarm') - # plt.savefig('dataset/同步相关性热力图.png') - # plt.show() - - # 读取滞后周期文件,更改特征 - characteristic_period = pd.read_csv('dataset/特征滞后周期.csv',encoding='utf-8') - # 去掉周期为0的行 - characteristic_period = characteristic_period.drop(characteristic_period[characteristic_period['滞后周期'] == 0].index) - for col in df.columns: - # 跳过y列 - if col in ['y']: - continue - # 特征滞后n个周期,计算与y的相关性 - if col in characteristic_period['特征'].values: - # 获取特征对应的周期 - period = characteristic_period[characteristic_period['特征'] == col]['滞后周期'].values[0] - # 滞后处理 - df[col] = df[col].shift(period) - df.to_csv(os.path.join(dataset,'滞后处理后的数据集.csv')) - - - # corr_feture_noscaler = {} # 保存相关性最大的周期 - # 遍历df_test的每一列,计算相关性 - # for col in df_noscaler.columns: - # # 跳过y列 - # if col in ['y']: - # continue - # logger.info('特征:', col) - # # 特征滞后n个周期,计算与y的相关性 - # corr_dict = {} - # try: - # for i in range(0, 200): - # if i == 0: - # df_noscaler[col+'_'+str(i)] = df_noscaler[col] - # else: - # df_noscaler[col+'_'+str(i)] = df_noscaler[col].shift(i) - # corr_dict[col+'_'+str(i)] = abs(df_noscaler[col+'_'+str(i)].corr(df_noscaler['y'])) - # except : - # logger.info('特征:', col, '滑动错误,请查看') - # continue - # 输出相关性最大的特征 - # logger.info(max(corr_dict, key=corr_dict.get), corr_dict[max(corr_dict, key=corr_dict.get)]) - # corr_feture_noscaler[col] = max(corr_dict, key=corr_dict.get).split('_')[-1] - # 画出最相关性最大的特征和y的折线图 - # plt.figure(figsize=(10, 5)) - # plt.plot(df_noscaler[max(corr_dict, key=corr_dict.get)], label=max(corr_dict, key=corr_dict.get)) - # # 设置双坐标轴 - # ax1 = plt.gca() - # ax2 = ax1.twinx() - # ax2.plot(df_noscaler['y'], color='r', label='y') - # plt.legend() - # try: - # plt.savefig('dataset/特征与y的折线图_'+max(corr_dict, key=corr_dict.get)+'.png') - # except : - # # :替换成_ - # plt.savefig('dataset/特征与y的折线图_'+max(corr_dict, key=corr_dict.get).replace(':','_').replace('/','_').replace('(','_').replace(')','_')+'.png') - # plt.close() - # 结果保存到txt文件 - # logger.info('不参与标准化的特征滞后相关性写入txt文件') - # with open('dataset/不参与标准化的特征滞后相关性.txt', 'w') as f: - # for key, value in corr_feture_noscaler.items(): - # f.write('%s:%s\n' % (key, value)) - # 遍历corr_feture_noscaler,更改df - # colnames_noscaler = [] - # for col in corr_feture_noscaler: - # colname = col+'_'+corr_feture_noscaler[col] - # if int(corr_feture_noscaler[col]) == 0: - # continue - # df_test_noscaler[colname] = df_test_noscaler[col].shift(int(corr_feture_noscaler[col])) - # df_test_noscaler = df_test_noscaler.drop(columns=[col]) - # colnames_noscaler.append(colname) - # 去除有空值的行 - # df_test_noscaler = df_test_noscaler.dropna() - # df_test_noscaler.reindex(['y'] + sorted(df_test_noscaler.columns.difference(['y']))) - # df_test_noscaler.to_csv('dataset/不参与标准化的特征滞后相关性.csv', index=False) - # 画出相关性热力图 - # corr = df_test_noscaler.corr() - # 保存相关系数 - # corr.to_csv(os.path.join(dataset,'不参与标准化的特征滞后相关性系数.csv')) - # plt.figure(figsize=(10, 10)) - # sns.heatmap(corr, annot=True, cmap='coolwarm') - # plt.savefig('dataset/不参与标准化的特征滞后相关性热力图.png') - # plt.close() - # # 标准化每列 - # from sklearn.preprocessing import StandardScaler - # scaler = StandardScaler() - # df_test = pd.DataFrame(scaler.fit_transform(df_test), columns=df_test.columns) - # corr_feture = {} # 保存相关性最大的周期 - # # 遍历df_test的每一列,计算相关性 - # for col in df_test.columns: - # # 跳过y列 - # if col == 'y': - # continue - # logger.info('特征:', col) - # # 特征滞后n个周期,计算与y的相关性 - # corr_dict = {} - # try: - # for i in range(0, 200): - # if i == 0: - # df_test[col+'_'+str(i)] = df_test[col] - # else: - # df_test[col+'_'+str(i)] = df_test[col].shift(i) - # corr_dict[col+'_'+str(i)] = abs(df_test[col+'_'+str(i)].corr(df_test['y'])) - # except : - # logger.info('特征:', col, '滑动错误,请查看') - # continue - # # 输出相关性最大的特征 - # logger.info(max(corr_dict, key=corr_dict.get), corr_dict[max(corr_dict, key=corr_dict.get)]) - # corr_feture[col] = max(corr_dict, key=corr_dict.get).split('_')[-1] - - - # # 结果保存到txt文件 - # with open('dataset/标准化的特征滞后相关性.txt', 'w') as f: - # for key, value in corr_feture.items(): - # f.write('%s:%s\n' % (key, value)) - # # 遍历corr_feture,更改df - # colnames = [] - # for col in corr_feture: - # colname = col+'_'+corr_feture[col] - # if int(corr_feture[col]) == 0: - # continue - # df[colname] = df[col].shift(int(corr_feture[col])) - # df = df.drop(columns=[col]) - # colnames.append(colname) - # # 去除有空值的行 - # df = df.dropna() - # df.reindex(['y'] + sorted(df.columns.difference(['y']))) - # df.to_csv('dataset/标准化后的特征滞后相关性.csv', index=False) - # # 画出相关性热力图 - # ds = df['ds'] - # df = df.drop(columns=['ds']) - # corr = df.corr() - # # 保存相关系数 - # corr.to_csv(os.path.join(dataset,'标准化后的特征滞后相关性系数.csv')) - # plt.figure(figsize=(10, 10)) - # sns.heatmap(corr, annot=True, cmap='coolwarm') - # plt.savefig('dataset/标准化后的特征滞后相关性热力图.png') - # plt.show() - # df['ds'] = ds - - # 去除nan值 - df = df.dropna() - return df - - -def calculate_kdj(data, n=9): - ''' - 给传进来的df 添加列: 波动率,最高,最低,k ,d ,j - ''' - data = data.sort_values(by='ds', ascending=True) - # 因为没有高开低价格,利用每日波动率模拟当天最高价和最低价 - data['pctchange'] = data['y'].pct_change() - # 收益为0的用0.01 - data['pctchange'] = data['pctchange'].replace(0,0.01) - data.dropna(inplace=True) - # 重置索引 - data.reset_index(drop=True,inplace=True) - data['high'] = data['y']* (1+abs(data['pctchange'])/2) - data['low'] = data['y']* (1-abs(data['pctchange'])/2) - low_list = data['y'].rolling(window=n, min_periods=1).min() - high_list = data['y'].rolling(window=n, min_periods=1).max() - rsv = ((data['y'] - low_list) / (high_list - low_list)) * 100 - k = pd.Series(50, index=data.index) - d = pd.Series(50, index=data.index) - for i in range(1, len(data)): - k[i] = (2/3 * k[i - 1]) + (1/3 * rsv[i]) - d[i] = (2/3 * d[i - 1]) + (1/3 * k[i]) - j = 3 * k - 2 * d - - data['K'] = k - data['D'] = d - data['J'] = j - # 将包含 KDJ 指标的数据保存到新的 CSV 文件 - data.to_csv('dataset\stock_data_with_kdj.csv', index=False) - # data = data.dropna() - return data - -def check_column(df,col_name,two_months_ago): - ''' - 检查列是否需要删除。 - 该函数会检查列是否为空值列、180天没有更新的列或常数值列。 - 参数: - col_name (str): 列名。 - df (DataFrame): 包含列的 DataFrame。 - 返回: - bool: 如果列需要删除,返回 True;否则,返回 False。 - ''' - if 'ds' in col_name or 'y' in col_name: - return False - df_check_column = df[['ds',col_name,'y']] - df_check_column = df_check_column.dropna() - - if len(df_check_column) == 0: - print(f'空值列:{col_name}') - return True - # 判断是不是常数列 - if df_check_column[(df_check_column['ds']>= two_months_ago)].groupby(col_name).ngroups < 2: - print(f'180没有更新:{col_name}') - return True - - # 判断相关系数大于0.6 - if is_del_corr > 0: - if abs(df_check_column[col_name].corr(df_check_column['y'])) < is_del_corr: - print(f'相关系数小于0.6:{col_name}') - return True - - corresponding_date = df_check_column.iloc[-1]['ds'] - return corresponding_date < two_months_ago - -def datachuli(df_zhibiaoshuju,df_zhibiaoliebiao,datecol='date',end_time='',y='y',dataset='dataset',delweekenday=False,add_kdj=False,is_timefurture=False): - ''' - 原油特征数据处理函数, - 接收的是两个df,一个是指标数据,一个是指标列表 - 输出的是一个df,包含ds,y,指标列 - ''' - df = df_zhibiaoshuju.copy() - - if end_time == '': - end_time = datetime.datetime.now().strftime('%Y-%m-%d') - # 重命名时间列,预测列 - df.rename(columns={datecol:'ds'},inplace=True) - df.rename(columns={y:'y'},inplace=True) - # 按时间顺序排列 - df.sort_values(by='ds',inplace=True) - df['ds'] = pd.to_datetime(df['ds']) - # 获取start_year年到end_time的数据 - df = df[df['ds'].dt.year >= start_year] - df = df[df['ds'] <= end_time] - # last_update_times_df,y_last_update_time = create_feature_last_update_time(df) - # logger.info(f'删除预警的特征前数据量:{df.shape}') - # columns_to_drop = last_update_times_df[last_update_times_df['warning_date'] < y_last_update_time ]['feature'].values.tolist() - # df = df.drop(columns = columns_to_drop) - # logger.info(f'删除预警的特征后数据量:{df.shape}') - # if is_update_warning_data: - # upload_warning_info(last_update_times_df,y_last_update_time) - # 去掉近最后数据对应的日期在六月以前的列,删除近2月的数据是常熟的列 - if is_del_tow_month: - current_date = datetime.datetime.now() - two_months_ago = current_date - timedelta(days=180) - logger.info(f'删除两月不更新特征前数据量:{df.shape}') - columns_to_drop = [] - for clo in df.columns: - if check_column(df,clo,two_months_ago): - columns_to_drop.append(clo) - df = df.drop(columns=columns_to_drop) - - logger.info(f'删除两月不更新特征后数据量:{df.shape}') - - if freq == 'W': - # 按周取样 - df = df.resample('W', on='ds').mean().reset_index() - elif freq == 'M': - # 按月取样 - df = df.resample('M', on='ds').mean().reset_index() - # 删除预测列空值的行 - df = df.dropna(subset=['y']) - logger.info(f'删除预测列为空值的行后数据量:{df.shape}') - df = df.dropna(axis=1, how='all') - logger.info(f'删除全为空值的列后数据量:{df.shape}') - df.to_csv(os.path.join(dataset,'未填充的特征数据.csv'),index=False) - # 去掉指标列表中的columns_to_drop的行 - df_zhibiaoliebiao = df_zhibiaoliebiao[df_zhibiaoliebiao['指标名称'].isin(df.columns.tolist())] - df_zhibiaoliebiao.to_csv(os.path.join(dataset,'特征处理后的指标名称及分类.csv'),index=False) - # 数据频度分析 - featurePindu(dataset=dataset) - # 向上填充 - df = df.ffill() - # 向下填充 - df = df.bfill() - - # 删除周六日的数据 - if delweekenday: - df = df[df['ds'].dt.weekday < 5] - - # kdj指标 - if add_kdj: - df = calculate_kdj(df) - # 衍生时间特征 - if is_timefurture: - df = addtimecharacteristics(df=df,dataset=dataset) - # 特征分析 - featureAnalysis(df,dataset=dataset,y=y) - return df - -def datachuli_juxiting(df_zhibiaoshuju,df_zhibiaoliebiao,datecol='date',end_time='',y='y',dataset='dataset',delweekenday=False,add_kdj=False,is_timefurture=False): - ''' - 聚烯烃特征数据处理函数, - 接收的是两个df,一个是指标数据,一个是指标列表 - 输出的是一个df,包含ds,y,指标列 - ''' - df = df_zhibiaoshuju.copy() - if end_time == '': - end_time = datetime.datetime.now().strftime('%Y-%m-%d') - # date转为pddate - df.rename(columns={datecol:'ds'},inplace=True) - - # 指定列统一减少数值 - df[offsite_col] = df[offsite_col]-offsite - # 预测列为avg_cols的均值 - df[y] = df[avg_cols].mean(axis=1) - # 去掉多余的列avg_cols - df = df.drop(columns=avg_cols) - - # 重命名预测列 - df.rename(columns={y:'y'},inplace=True) - # 按时间顺序排列 - df.sort_values(by='ds',inplace=True) - df['ds'] = pd.to_datetime(df['ds']) - # 获取2018年到当前日期的数据 - df = df[df['ds'].dt.year >= 2018] - # 获取小于等于当前日期的数据 - df = df[df['ds'] <= end_time] - logger.info(f'删除两月不更新特征前数据量:{df.shape}') - # 去掉近最后数据对应的日期在两月以前的列,删除近2月的数据是常数的列 - current_date = datetime.datetime.now() - two_months_ago = current_date - timedelta(days=40) - # 检查两月不更新的特征 - def check_column(col_name): - if 'ds' in col_name or 'y' in col_name: - return False - df_check_column = df[['ds',col_name]] - df_check_column = df_check_column.dropna() - if len(df_check_column) == 0: - return True - if df_check_column[(df_check_column['ds']>= two_months_ago)].groupby(col_name).ngroups < 2: - return True - corresponding_date = df_check_column.iloc[-1]['ds'] - return corresponding_date < two_months_ago - columns_to_drop = df.columns[df.columns.map(check_column)].tolist() - df = df.drop(columns = columns_to_drop) - - logger.info(f'删除两月不更新特征后数据量:{df.shape}') - - # 删除预测列空值的行 - df = df.dropna(subset=['y']) - logger.info(f'删除预测列为空值的行后数据量:{df.shape}') - df = df.dropna(axis=1, how='all') - logger.info(f'删除全为空值的列后数据量:{df.shape}') - df.to_csv(os.path.join(dataset,'未填充的特征数据.csv'),index=False) - # 去掉指标列表中的columns_to_drop的行 - df_zhibiaoliebiao = df_zhibiaoliebiao[df_zhibiaoliebiao['指标名称'].isin(df.columns.tolist())] - df_zhibiaoliebiao.to_csv(os.path.join(dataset,'特征处理后的指标名称及分类.csv'),index=False) - # 频度分析 - featurePindu(dataset=dataset) - # 向上填充 - df = df.ffill() - # 向下填充 - df = df.bfill() - - # 删除周六日的数据 - if delweekenday: - df = df[df['ds'].dt.weekday < 5] - - if add_kdj: - df = calculate_kdj(df) - - if is_timefurture: - df = addtimecharacteristics(df=df,dataset=dataset) - - featureAnalysis(df,dataset=dataset,y=y) - return df - -def getdata(filename, datecol='date',y='y',dataset='',add_kdj=False,is_timefurture=False,end_time=''): - logger.info('getdata接收:'+filename+' '+datecol+' '+end_time) - # 判断后缀名 csv或excel - if filename.endswith('.csv'): - df = loadcsv(filename) - else: - # 读取excel 指标数据 - df_zhibiaoshuju = pd.read_excel(filename,sheet_name='指标数据') - df_zhibiaoliebiao = pd.read_excel(filename,sheet_name='指标列表') - - - # 日期字符串转为datatime - df = datachuli(df_zhibiaoshuju,df_zhibiaoliebiao,datecol,y = y,dataset=dataset,add_kdj=add_kdj,is_timefurture=is_timefurture,end_time=end_time) - - return df,df_zhibiaoliebiao -def getdata_juxiting(filename, datecol='date',y='y',dataset='',add_kdj=False,is_timefurture=False,end_time=''): - logger.info('getdata接收:'+filename+' '+datecol+' '+end_time) - # 判断后缀名 csv或excel - if filename.endswith('.csv'): - df = loadcsv(filename) - else: - # 读取excel 指标数据 - df_zhibiaoshuju = pd.read_excel(filename,sheet_name='指标数据') - df_zhibiaoliebiao = pd.read_excel(filename,sheet_name='指标列表') - - # 日期字符串转为datatime - df = datachuli_juxiting(df_zhibiaoshuju,df_zhibiaoliebiao,datecol,y = y,dataset=dataset,add_kdj=add_kdj,is_timefurture=is_timefurture,end_time=end_time) - - return df - - -def sanitize_filename(filename): - # 使用正则表达式替换不合规的字符 - # 这里我们替换为下划线'_',但你可以根据需要选择其他字符 - sanitized = re.sub(r'[\\/*?:"<>|\s]', '_', filename) - # 移除开头的点(在某些系统中,以点开头的文件可能是隐藏的) - sanitized = re.sub(r'^\.', '', sanitized) - # 如果需要,可以添加更多替换规则 - return sanitized - -class BinanceAPI: - ''' - 获取 Binance API 请求头签名 - ''' - def __init__(self, APPID, SECRET): - self.APPID = APPID - self.SECRET = SECRET - self.get_signature() - - # 生成随机字符串作为 nonce - def generate_nonce(self, length=32): - self.nonce = ''.join(random.choices(string.ascii_letters + string.digits, k=length)) - return self.nonce - - # 获取当前时间戳(秒) - def get_timestamp(self): - return int(time.time()) - - # 构建待签名字符串 - def build_sign_str(self): - return f'appid={self.APPID}&nonce={self.nonce}×tamp={self.timestamp}' - - # 使用 HMAC SHA-256 计算签名 - def calculate_signature(self, secret, message): - return base64.urlsafe_b64encode(hmac.new(secret.encode('utf-8'), message.encode('utf-8'), hashlib.sha256).digest()).decode('utf-8') - - def get_signature(self): - # 调用上述方法生成签名 - self.nonce = self.generate_nonce() - self.timestamp = self.get_timestamp() - self.sign_str = self.build_sign_str() - self.signature = self.calculate_signature(self.SECRET, self.sign_str) - # return self.signature - -class Graphs: - # 绘制标题 - @staticmethod - def draw_title(title: str): - # 获取所有样式表 - style = getSampleStyleSheet() - # 拿到标题样式 - ct = style['Heading1'] - # 单独设置样式相关属性 - ct.fontName = 'SimSun' # 字体名 - ct.fontSize = 18 # 字体大小 - ct.leading = 50 # 行间距 - ct.textColor = colors.green # 字体颜色 - ct.alignment = 1 # 居中 - ct.bold = True - # 创建标题对应的段落,并且返回 - return Paragraph(title, ct) - - # 绘制小标题 - @staticmethod - def draw_little_title(title: str): - # 获取所有样式表 - style = getSampleStyleSheet() - # 拿到标题样式 - ct = style['Normal'] - # 单独设置样式相关属性 - ct.fontName = 'SimSun' # 字体名 - ct.fontSize = 15 # 字体大小 - ct.leading = 30 # 行间距 - ct.textColor = colors.red # 字体颜色 - # 创建标题对应的段落,并且返回 - return Paragraph(title, ct) - - # 绘制普通段落内容 - @staticmethod - def draw_text(text: str): - # 获取所有样式表 - style = getSampleStyleSheet() - # 获取普通样式 - ct = style['Normal'] - ct.fontName = 'SimSun' - ct.fontSize = 12 - ct.wordWrap = 'CJK' # 设置自动换行 - ct.alignment = 0 # 左对齐 - ct.firstLineIndent = 32 # 第一行开头空格 - ct.leading = 25 - return Paragraph(text, ct) - - # 绘制表格 - @staticmethod - def draw_table(*args): - # 列宽度 - col_width = args[0] - style = [ - ('FONTNAME', (0, 0), (-1, -1), 'SimSun'), # 字体 - ('FONTSIZE', (0, 0), (-1, 0), 12), # 第一行的字体大小 - ('FONTSIZE', (0, 1), (-1, -1), 10), # 第二行到最后一行的字体大小 - ('BACKGROUND', (0, 0), (-1, 0), '#d5dae6'), # 设置第一行背景颜色 - ('ALIGN', (0, 0), (-1, -1), 'CENTER'), # 第一行水平居中 - ('ALIGN', (0, 1), (-1, -1), 'LEFT'), # 第二行到最后一行左右左对齐 - ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), # 所有表格上下居中对齐 - ('TEXTCOLOR', (0, 0), (-1, -1), colors.darkslategray), # 设置表格内文字颜色 - ('GRID', (0, 0), (-1, -1), 0.5, colors.grey), # 设置表格框线为grey色,线宽为0.5 - # ('SPAN', (0, 1), (0, 2)), # 合并第一列二三行 - # ('SPAN', (0, 3), (0, 4)), # 合并第一列三四行 - # ('SPAN', (0, 5), (0, 6)), # 合并第一列五六行 - # ('SPAN', (0, 7), (0, 8)), # 合并第一列五六行 - ] - table = Table(args[1:], colWidths=col_width, style=style) - return table - - # 创建图表 - @staticmethod - def draw_bar(bar_data: list, ax: list, items: list): - drawing = Drawing(500, 250) - bc = VerticalBarChart() - bc.x = 45 # 整个图表的x坐标 - bc.y = 45 # 整个图表的y坐标 - bc.height = 200 # 图表的高度 - bc.width = 350 # 图表的宽度 - bc.data = bar_data - bc.strokeColor = colors.black # 顶部和右边轴线的颜色 - bc.valueAxis.valueMin = 5000 # 设置y坐标的最小值 - bc.valueAxis.valueMax = 26000 # 设置y坐标的最大值 - bc.valueAxis.valueStep = 2000 # 设置y坐标的步长 - bc.categoryAxis.labels.dx = 2 - bc.categoryAxis.labels.dy = -8 - bc.categoryAxis.labels.angle = 20 - bc.categoryAxis.categoryNames = ax - - # 图示 - leg = Legend() - leg.fontName = 'SimSun' - leg.alignment = 'right' - leg.boxAnchor = 'ne' - leg.x = 475 # 图例的x坐标 - leg.y = 240 - leg.dxTextSpace = 10 - leg.columnMaximum = 3 - leg.colorNamePairs = items - drawing.add(leg) - drawing.add(bc) - return drawing - - # 绘制图片 - @staticmethod - def draw_img(path): - img = Image(path) # 读取指定路径下的图片 - img.drawWidth = 20*cm # 设置图片的宽度 - img.drawHeight = 10*cm # 设置图片的高度 - return img - -# 定义样式函数 -def style_row(row): - if '周' in row['频度']: - return ['background-color: yellow'] * len(row) - else: - return ['background-color: gray'] * len(row) - - - -class EtaReader(): - def __init__(self,signature,classifylisturl,classifyidlisturl,edbcodedataurl,edbcodelist,edbdatapushurl,edbdeleteurl,edbbusinessurl): - ''' - 初始化 EtaReader 类的实例。 - - 参数: - signature (str): 用于 API 请求的签名。 - classifylisturl (str): 分类列表的 URL。 - classifyidlisturl (str): 分类 ID 列表的 URL。 - edbcodedataurl (str): EDB 代码数据的 URL。 - edbdatapushurl (str): EDB 数据推送的 URL。 - edbcodelist (str): EDB 代码列表的 URL。 - edbdeleteurl (str): EDB 数据删除的 URL。 - edbbusinessurl (str): EDB 业务数据的 URL。 - - 返回: - None - ''' - self.signature = signature - self.classifylisturl = classifylisturl - self.classifyidlisturl = classifyidlisturl - self.edbcodedataurl = edbcodedataurl - self.edbdatapushurl = edbdatapushurl - self.edbcodelist = edbcodelist - self.edbdeleteurl = edbdeleteurl - self.edbbusinessurl = edbbusinessurl - - - def filter_yuanyou_data(self,ClassifyName,data): - ''' - 指标名称保留规则 - ''' - - # 包含 关键词 去除, 返回flase - if any(keyword in data for keyword in ['运费','检修','波动率','地缘政治','股价', - '同比','环比','环差','裂差','4WMA','变频','道琼斯','标普500','纳斯达克', - '四周均值','名占比','残差','DMA', - '连7-连9','4周平均','4周均值','滚动相关性','日本']): - return False - - # 检查需要的特征 - # 去掉 分析 分类下的数据 - if ClassifyName == '分析': - return False - - # 保留 库存中特殊关键词 - if ClassifyName == '库存': - if any(keyword in data for keyword in ['原油' , '美国' ,'全球' ,'中国' ,'富查伊拉','ARA' ]): - return True - else: - pass - else: - pass - - # 去掉 持仓中不是基金的数据 - if ClassifyName == '持仓': - if '基金' not in data: - return False - else: - pass - else: - pass - - # 去掉 航班中不是中国、美国 的数据 - if ClassifyName == '需求': - if '航班' in data : - if '中国' in data or '美国' in data : - return True - else: - return False - else: - pass - else: - pass - - # 分类为 期货市场,同质性数据取第一个 - if ClassifyName == '期货市场': - # 去掉c1-9 以后的 - if 'c1-c' in data: - try: - c = int(data.split('c1-c')[1]) - except: - return False - if c > 9 : - return False - else: - pass - - else: - pass - - # 判断 同质性数据, 字符串开头 - strstartdict = {'ICE Brent c':"ICE Brent c14", - 'NYMWX WTI c':"NYMWX WTI c5", - 'INE SC c':"INE SC c1", - 'EFS c':"EFS c", - 'Dubai Swap c':"Dubai Swap c1", - 'Oman Swap c':"Oman Swap c1", - 'DME Oman c':"DME Oman c1", - 'Murban Futures c':"Murban Futures c1", - 'Dubai连合约价格':'Dubai连1合约价格', - '美国RBOB期货月份合约价格':'美国RBOB期货2309月份合约价格', - 'Brent连合约价格':'Brent连1合约价格', - 'WTI连合约价格':'WTI连1合约价格', - '布伦特连合约价格':'Brent连1合约价格', - 'Brent 连合约价格':'Brent连1合约价格', - 'Dubai连合约价格':'Dubai连1合约价格', - 'Brent连':'Brent连1合约价格', - 'brent连':'Brent连1合约价格', - } - # 判断名称字符串开头是否在 strstartdict.keys中 - match = re.match(r'([a-zA-Z\s]+)(\d+)', data) - if match: - part1 = match.group(1) - part2 = match.group(2) - if part1 in [i for i in strstartdict.keys()]: - if data == strstartdict[part1]: - return True - else: - return False - # data = 'Brent 连7合约价格' - # 判断名称字符串去掉数字后是否在 strstartdict.keys中 - match = re.findall(r'\D+', data) - if match : - if len(match) == 2: - part1 = match[0] - part2 = match[1] - if part1+part2 in [i for i in strstartdict.keys()]: - if data == strstartdict[part1+part2]: - return True - else: - return False - else: - pass - elif len(match) == 1: - match = re.findall(r'\D+', data) - part1 = match[0] - - if part1 in [i for i in strstartdict.keys()]: - if data == strstartdict[part1]: - return True - else: - return False - else: - pass - else: - pass - - # 去掉kpler数据源 - if 'Kpler' in ClassifyName or 'kpler' in ClassifyName: - return False - - return True - - def filter_pp_data(self,ClassifyName,data): - ''' - 指标名称保留规则 - ''' - - # 包含 关键词 去除, 返回flase - # if any(keyword in data for keyword in ['运费','检修','波动率','地缘政治','股价', - # '同比','环比','环差','裂差','4WMA','变频','道琼斯','标普500','纳斯达克', - # '四周均值','名占比','残差','DMA', - # '连7-连9','4周平均','4周均值','滚动相关性','日本']): - # return False - # 包含 关键词 保留, 返回True - if any(keyword in data for keyword in ['拉丝']): - return True - - - - # 检查需要的特征 - # 去掉 期货市场 分类下的数据 - if ClassifyName == '期货市场': - return False - else: - pass - - # 保留 库存 下所有指标 - if ClassifyName == '库存': - return True - else: - pass - - # 保留 进出口 下所有指标 - if ClassifyName == '进出口': - return True - else: - pass - - # 保留 价差 下所有指标 - if ClassifyName == '价差': - return True - else: - pass - - # 保留 供应 下所有指标 - if ClassifyName == '供应': - return True - else: - pass - - - # 保留 需求 下所有指标 - if ClassifyName == '需求': - return True - else: - pass - - - return True - - # 通过edbcode 获取指标数据 - def edbcodegetdata(self,df,EdbCode,EdbName): - # 根据指标id,获取指标数据 - url = self.edbcodedataurl+str(EdbCode) - # 发送GET请求 - response = requests.get(url, headers=self.headers) - - # 检查响应状态码 - if response.status_code == 200: - data = response.json() # 假设接口返回的是JSON数据 - all_data_items = data.get('Data') - # 列表转换为DataFrame - df3 = pd.DataFrame(all_data_items, columns=['DataTime', 'Value', 'UpdateTime']) - # df3 = pd.read_json(all_data_items, orient='records') - - # 去掉UpdateTime 列 - df3 = df3.drop(columns=['UpdateTime']) - # df3.set_index('DataTime') - df3.rename(columns={'Value': EdbName}, inplace=True) - # 将数据存储df1 - df = pd.merge(df, df3, how='outer',on='DataTime',suffixes= ('', '_y')) - # 按时间排序 - df = df.sort_values(by='DataTime', ascending=True) - return df - - else: - # 请求失败,打印错误信息 - logger.info(f'Error: {response.status_code}, {response.text}') - # 主动抛出异常 - raise Exception(f'Error: {response.status_code}, {response.text}') - - def get_eta_api_yuanyou_data(self,data_set,dataset=''): - ''' - 从ETA API获取原油数据 - - 参数: - data_set (str): 数据集名称 - dataset (str): 数据集ID,默认为空 - - 返回: - None - ''' - today = datetime.date.today().strftime("%Y-%m-%d") - - # 定义你的headers,这里可以包含多个参数 - self.headers = { - 'nonce': self.signature.nonce, # 例如,一个认证令牌 - 'timestamp': str(self.signature.timestamp), # 自定义的header参数 - 'appid': self.signature.APPID, # 另一个自定义的header参数 - 'signature': self.signature.signature - } - - # 从列表数据中获取指标名称,判断指标名称频度是否为日 ,如果是,则获取UniqueCode,然后获取指标数据,保存到xlat文件中的sheet表。 - - ''' - df = sheetname 指标列表,存储 指标分类-指标名称-指标id-频度 - df1 = sheetname 指标数据 ,存储 时间-指标名称1-指标名称2... - - ''' - - # 构建新的DataFrame df df1 - df = pd.DataFrame(columns=['指标分类', '指标名称', '指标id', '频度','指标来源','来源id','最后更新时间','更新周期','预警日期','停更周期']) - df1 = pd.DataFrame(columns=['DataTime']) - - - # 外网环境无法访问,请确认是否为内网环境 - try: - # 发送GET请求 获取指标分类列表 - response = requests.get(self.classifylisturl, headers=self.headers) - except requests.exceptions.RequestException as e: - raise Exception(f"请求失败,请确认是否为内网环境: {e}","\033[0m") - - # 检查响应状态码 - if response.status_code == 200: - # 获取成功, 处理响应内容 - data = response.json() # 假设接口返回的是JSON数据 - - # 请求成功,处理响应内容 - # logger.info(data.get('Data')) - # 定义你想要保留的固定值 - fixed_value = 1214 - - # 遍历列表,只保留那些'category' key的值为固定值的数据项 - filtered_data = [item for item in data.get('Data') if item.get('ParentId') == fixed_value] - - #然后循环filtered_data去获取list数据,才能获取到想要获取的ClassifyId - n = 0 - for item in filtered_data: - n+= 1 - # if n>50: - # break - ClassifyId = item["ClassifyId"] #分类id,分类下的指标列表接口的请求参数 - ClassifyName = item["ClassifyName"] #分类名称,要保存到df的指标分类列 - # 根据分类id,获取指标列表 - url = self.classifyidlisturl+str(ClassifyId) - response = requests.get(url, headers=self.headers) - if response.status_code == 200: - # logger.info(response.text) - data2 = response.json() - Data = data2.get('Data') - for i in Data: - # s+= 1 - EdbCode = i.get('EdbCode') - EdbName = i.get('EdbName') # 指标名称,要保存到df2的指标名称列,df的指标名称列 - Frequency = i.get('Frequency') # 频度,要保存到df的频度列 - SourceName = i.get('SourceName') # 来源名称,要保存到df的频度列 - Source = i.get('Source') # 来源ID,要保存到df的频度列 - Unit = i.get('Unit') # 单位,要保存到df的单位列 - # 频度不是 日 或者 周的 跳过 - if Frequency not in ['日度','周度','日','周']: - continue - - # 只保留手工数据中,名称带有 海运出口 海运进口 - if Source == 9 and not ('海运出口' in EdbName or '海运进口' in EdbName): - continue - - # 不要wind数据 - if Source == 2: - continue - - - # 判断名称是否需要保存 - isSave = self.filter_yuanyou_data(ClassifyName,EdbName) - if isSave: - # 保存到df - df1 = self.edbcodegetdata(df1,EdbCode,EdbName) - # 取df1所有行最后一列 - edbname_df = df1[['DataTime',f'{EdbName}']] - edbname_df = edbname_df.dropna() - - if len(edbname_df) == 0: - logger.info(f'指标名称:{EdbName} 没有数据') - continue - try: - time_sequence = edbname_df['DataTime'].values.tolist()[-10:] - except IndexError: - time_sequence = edbname_df['DataTime'].values.tolist() - # 使用Counter来统计每个星期几的出现次数 - from collections import Counter - weekday_counter = Counter(datetime.datetime.strptime(time_str, "%Y-%m-%d").strftime('%A') for time_str in time_sequence) - - # 打印出现次数最多的星期几 - try: - most_common_weekday = weekday_counter.most_common(1)[0][0] - # 计算两周后的日期 - warning_date = (datetime.datetime.strptime(time_sequence[-1], "%Y-%m-%d") + datetime.timedelta(weeks=2)).strftime("%Y-%m-%d") - stop_update_period = (datetime.datetime.strptime(today, "%Y-%m-%d") - datetime.datetime.strptime(time_sequence[-1], "%Y-%m-%d")).days // 7 - - except IndexError: - most_common_weekday = '其他' - stop_update_period = 0 - if '日' in Frequency: - most_common_weekday = '每天' - warning_date = (datetime.datetime.strptime(time_sequence[-1], "%Y-%m-%d") + datetime.timedelta(days=3)).strftime("%Y-%m-%d") - stop_update_period = (datetime.datetime.strptime(today, "%Y-%m-%d") - datetime.datetime.strptime(time_sequence[-1], "%Y-%m-%d")).days - - # 保存频度 指标名称 分类 指标id 到 df - df2 = pd.DataFrame({'指标分类': ClassifyName, - '指标名称': EdbName, - '指标id': EdbCode, - '单位': Unit, - '频度': Frequency, - '指标来源':SourceName, - '来源id':Source, - '最后更新时间':edbname_df['DataTime'].values[-1], - '更新周期':most_common_weekday, - '预警日期':warning_date, - '停更周期':stop_update_period},index=[0], - ) - - # df = pd.merge(df, df2, how='outer') - df = pd.concat([df, df2]) - else: - logger.info(f'跳过指标 {EdbName}') - - # 找到列表中不在指标列中的指标id,保存成新的list - new_list = [item for item in self.edbcodelist if item not in df['指标id'].tolist()] - logger.info(new_list) - # 遍历new_list,获取指标数据,保存到df1 - for item in new_list: - logger.info(item) - # 将item 加入到 df['指标id']中 - try: - itemname = edbcodenamedict[item] - except: - itemname = item - - df1 = self.edbcodegetdata(df1,item,itemname) - df = pd.concat([df, pd.DataFrame({'指标分类': '其他', '指标名称': itemname, '指标id': item, '频度': '其他','指标来源':'其他','来源id':'其他'},index=[0])]) - - # 按时间排序 - df1.sort_values('DataTime',inplace=True,ascending=False) - df1.rename(columns={'DataTime': 'date'},inplace=True) - # df1.dropna(inplace=True) - # 去掉大于今天日期的行 - df1 = df1[df1['date'] <= datetime.datetime.now().strftime('%Y-%m-%d')] - logger.info(df1.head()) - # logger.info(f'{df1.head()}') - - df_zhibiaoshuju = df1.copy() - df_zhibiaoliebiao = df.copy() - return df_zhibiaoshuju,df_zhibiaoliebiao - - def get_eta_api_pp_data(self,data_set,dataset=''): - global ClassifyId - today = datetime.date.today().strftime("%Y-%m-%d") - - # 定义你的headers,这里可以包含多个参数 - self.headers = { - 'nonce': self.signature.nonce, # 例如,一个认证令牌 - 'timestamp': str(self.signature.timestamp), # 自定义的header参数 - 'appid': self.signature.APPID, # 另一个自定义的header参数 - 'signature': self.signature.signature - } - - # 从列表数据中获取指标名称,判断指标名称频度是否为日 ,如果是,则获取UniqueCode,然后获取指标数据,保存到xlat文件中的sheet表。 - - ''' - df = sheetname 指标列表,存储 指标分类-指标名称-指标id-频度 - df1 = sheetname 指标数据 ,存储 时间-指标名称1-指标名称2... - - ''' - - # 构建新的DataFrame df df1 - df = pd.DataFrame(columns=['指标分类', '指标名称', '指标id', '频度']) - df1 = pd.DataFrame(columns=['DataTime']) - - - # 外网环境无法访问,请确认是否为内网环境 - try: - # 发送GET请求 获取指标分类列表 - response = requests.get(self.classifylisturl, headers=self.headers) - except requests.exceptions.RequestException as e: - raise Exception(f"请求失败,请确认是否为内网环境: {e}","\033[0m") - - # 检查响应状态码 - if response.status_code == 200: - # 获取成功, 处理响应内容 - data = response.json() # 假设接口返回的是JSON数据 - - # 请求成功,处理响应内容 - # logger.info(data.get('Data')) - # 定义你想要保留的固定值 - fixed_value = ClassifyId - - # 遍历列表,只保留那些'category' key的值为固定值的数据项 - filtered_data = [item for item in data.get('Data') if item.get('ParentId') == fixed_value] - - #然后循环filtered_data去获取list数据,才能获取到想要获取的ClassifyId - n = 0 - for item in filtered_data: - n+= 1 - # if n>50: - # break - ClassifyId = item["ClassifyId"] #分类id,分类下的指标列表接口的请求参数 - ClassifyName = item["ClassifyName"] #分类名称,要保存到df的指标分类列 - # 根据分类id,获取指标列表 - url = self.classifyidlisturl+str(ClassifyId) - response = requests.get(url, headers=self.headers) - if response.status_code == 200: - # logger.info(response.text) - data2 = response.json() - Data = data2.get('Data') - for i in Data: - # s+= 1 - EdbCode = i.get('EdbCode') - EdbName = i.get('EdbName') # 指标名称,要保存到df2的指标名称列,df的指标名称列 - Frequency = i.get('Frequency') # 频度,要保存到df的频度列 - # 频度不是 日 或者 周的 跳过 - if Frequency not in ['日度','周度','日','周']: - continue - - # 判断名称是否需要保存 - isSave = self.filter_pp_data(ClassifyName,EdbName) - if isSave: - # 保存到df - # 保存频度 指标名称 分类 指标id 到 df - df2 = pd.DataFrame({'指标分类': ClassifyName, '指标名称': EdbName, '指标id': EdbCode, '频度': Frequency},index=[0]) - - # df = pd.merge(df, df2, how='outer') - df = pd.concat([df, df2]) - df1 = self.edbcodegetdata(df1,EdbCode,EdbName) - else: - logger.info(f'跳过指标 {EdbName}') - - # 找到列表中不在指标列中的指标id,保存成新的list - new_list = [item for item in self.edbcodelist if item not in df['指标id'].tolist()] - logger.info(new_list) - # 遍历new_list,获取指标数据,保存到df1 - for item in new_list: - logger.info(item) - # 将item 加入到 df['指标id']中 - try: - itemname = edbcodenamedict[item] - except: - itemname = item - - df1 = self.edbcodegetdata(df1,item,itemname) - df = pd.concat([df, pd.DataFrame({'指标分类': '其他', '指标名称': itemname, '指标id': item, '频度': '其他'},index=[0])]) - - # 按时间排序 - df1.sort_values('DataTime',inplace=True,ascending=False) - df1.rename(columns={'DataTime': 'date'},inplace=True) - # df1.dropna(inplace=True) - # 去掉大于今天日期的行 - df1 = df1[df1['date'] <= datetime.datetime.now().strftime('%Y-%m-%d')] - logger.info(df1.head()) - # logger.info(f'{df1.head()}') - # 保存到xlsx文件的sheet表 - with pd.ExcelWriter(os.path.join(dataset,data_set)) as file: - df1.to_excel(file, sheet_name='指标数据', index=False) - df.to_excel(file, sheet_name='指标列表', index=False) - - df_zhibiaoshuju = df1.copy() - df_zhibiaoliebiao = df.copy() - return df_zhibiaoshuju,df_zhibiaoliebiao - - def push_data(self,data): - - today = datetime.date.today().strftime("%Y-%m-%d") - - # 定义你的headers,这里可以包含多个参数 - self.headers = { - 'nonce': self.signature.nonce, # 例如,一个认证令牌 - 'timestamp': str(self.signature.timestamp), # 自定义的header参数 - 'appid': self.signature.APPID, # 另一个自定义的header参数 - 'signature': self.signature.signature - } - - # 发送post请求 上传数据 - logger.info('请求参数:',data) - response = requests.post(self.edbdatapushurl, headers=self.headers,data=json.dumps(data)) - - # 检查响应状态码 - if response.status_code == 200: - data = response.json() # 假设接口返回的是JSON数据 - - logger.info('上传成功,响应为:', data) - - else: - # 请求失败,打印错误信息 - logger.info(f'Error: {response.status_code}, {response.text}') - # 主动抛出异常 - raise Exception(f'Error: {response.status_code}, {response.text}') - - def del_zhibiao(self,IndexCodeList): - today = datetime.date.today().strftime("%Y-%m-%d") - - # 定义你的headers,这里可以包含多个参数 - self.headers = { - 'nonce': self.signature.nonce, # 例如,一个认证令牌 - 'timestamp': str(self.signature.timestamp), # 自定义的header参数 - 'appid': self.signature.APPID, # 另一个自定义的header参数 - 'signature': self.signature.signature - } - - data = { - "IndexCodeList": IndexCodeList #指标编码列表 - } - # 发送post请求 上传数据 - response = requests.post(self.edbdeleteurl, headers=self.headers,data=json.dumps(data)) - - - # 检查响应状态码 - if response.status_code == 200: - data = response.json() # 假设接口返回的是JSON数据 - - logger.info('删除成功,响应为:', data) - - else: - # 请求失败,打印错误信息 - logger.info(f'Error: {response.status_code}, {response.text}') - # 主动抛出异常 - raise Exception(f'Error: {response.status_code}, {response.text}') - - def del_business(self,data): - '''' - 接口地址 - https://console-docs.apipost.cn/preview/fce869601d0be1d9/9a637c2f9ed0c589?target_id=d3cafcbf-a68c-42b3-b105-7bbd0e95a9cd - - 请求体 body - { - "IndexCode": "W001067", //指标编码 - "StartDate": "2020-04-20", //指标需要删除的开始日期(>=),如果开始日期和结束日期相等,那么就是删除该日期 - "EndDate": "2024-05-28" //指标需要删除的结束日期(<=),如果开始日期和结束日期相等,那么就是删除该日期 - } - ''' - today = datetime.date.today().strftime("%Y-%m-%d") - - # 定义你的headers,这里可以包含多个参数 - self.headers = { - 'nonce': self.signature.nonce, # 例如,一个认证令牌 - 'timestamp': str(self.signature.timestamp), # 自定义的header参数 - 'appid': self.signature.APPID, # 另一个自定义的header参数 - 'signature': self.signature.signature - } - - - # 发送post请求 上传数据 - response = requests.post(self.edbbusinessurl, headers=self.headers,data=json.dumps(data)) - - - # 检查响应状态码 - if response.status_code == 200: - data = response.json() # 假设接口返回的是JSON数据 - - logger.info('删除成功,响应为:', data) - - else: - # 请求失败,打印错误信息 - logger.info(f'Error: {response.status_code}, {response.text}') - # 主动抛出异常 - raise Exception(f'Error: {response.status_code}, {response.text}') - - -def get_market_data(end_time,df): - """ - 获取市场数据,拼接到df中 - """ - # 获取token - token = get_head_auth_report() - # 定义请求参数 - query_data_list_item_nos_data['data']['dateEnd'] = end_time.replace('-','') - # 发送请求 - headers = {"Authorization": token} - logger.info('获取数据中...') - items_res = requests.post(url=query_data_list_item_nos_url, headers=headers, json=query_data_list_item_nos_data, timeout=(3, 35)) - json_data = json.loads(items_res.text) - logger.info(f"获取到的数据:{json_data}") - df3 = pd.DataFrame(json_data['data']) - # 按照dataItemNo 分组 得到多个dataframe ,最后根据dataDate merge 成一个dataframe - df2 = pd.DataFrame() - for i in df3['dataItemNo'].unique(): - df1 = df3[df3['dataItemNo'] == i] - df1 = df1[['dataDate', 'dataValue']] - df1 = df1.rename(columns={'dataValue': i}) - if len(df2) == 0: - df2 = df1 - continue - df2 = pd.merge(df2, df1, how='left') - df2 = df2.rename(columns={'dataDate': 'date'}) - # 20240101 转换为 2024-01-01 - df2['date'] = pd.to_datetime(df2['date'], format='%Y%m%d') - df2['date'] = df2['date'].dt.strftime('%Y-%m-%d') - df = pd.merge(df, df2, how='left',on='date') - return df - - -def get_high_low_data(df): - # 读取excel 从第五行开始 - df1 = pd.read_excel(os.path.join(dataset,'数据项下载.xls'),header=5, names=['numid','date', 'Brentzdj', 'Brentzgj']) - # 合并数据 - df = pd.merge(df, df1, how='left',on='date') - return df - - -# 时间特征,年,月,一年的多少天,周几,第几周,第几季度,每月的第几天, 每季度的第几天,是否每月的第一天,是否每月的最后一天,是否每季度的第一天,是否每季度的最后一天,是否每年的第一天,是否每年的最后一天 -def addtimecharacteristics(df,dataset): - """ - 为输入的 DataFrame 添加日期相关信息列 - - 参数: - df (pandas.DataFrame): 包含日期列 'ds' 的 DataFrame - - 返回: - pandas.DataFrame: 添加了相关列的 DataFrame - """ - df['year'] = df['ds'].dt.year - df['month'] = df['ds'].dt.month - df['day'] = df['ds'].dt.day - df['dayofweek'] = df['ds'].dt.dayofweek - df['weekofyear'] = df['ds'].dt.isocalendar().week - df['dayofyear'] = df['ds'].dt.dayofyear - df['quarternum'] = df['ds'].dt.quarter - # 将ds列转换为季度Period对象 - df['quarter'] = df['ds'].dt.to_period('Q') - # 获取每个季度的开始日期 - df['quarter_start'] = df['quarter'].dt.to_timestamp('s') - # 计算每个日期是所在季度的第几天 - df['dayofquarter'] = (df['ds'] - df['quarter_start']).dt.days + 1 - # 是否月初 - df['is_month_start'] = df['ds'].dt.is_month_start.astype(int) - # 是否月末 - df['is_month_end'] = df['ds'].dt.is_month_end.astype(int) - # 是否季度初 - df['is_quarter_start'] = df['ds'].dt.is_quarter_start.astype(int) - # 是否季度末 - df['is_quarter_end'] = df['ds'].dt.is_quarter_end.astype(int) - # 是否年初 - df['is_year_start'] = df['ds'].dt.is_year_start.astype(int) - # 是否年末 - df['is_year_end'] = df['ds'].dt.is_year_end.astype(int) - # 去掉 quarter_start quarter - df.drop(columns=['quarter_start','quarter'],inplace=True) - df.to_csv(os.path.join(dataset,'指标数据添加时间特征.csv'), index=False) - return df diff --git a/main_yongan.py b/main_yongan.py index 3a4807f..cf7a540 100644 --- a/main_yongan.py +++ b/main_yongan.py @@ -1,7 +1,7 @@ # 读取配置 -from lib.dataread_yongan import * +from lib.dataread import * from lib.tools import SendMail,exception_logger -from models.nerulforcastmodels import ex_Model,model_losss,model_losss_juxiting,brent_export_pdf,tansuanli_export_pdf,pp_export_pdf,model_losss_juxiting +from models.nerulforcastmodels import ex_Model,brent_export_pdf,tansuanli_export_pdf,pp_export_pdf,model_losss_yongan import glob import torch @@ -243,7 +243,7 @@ def predict_main(): # logger.info('模型训练完成') # logger.info('训练数据绘图ing') - # model_results3 = model_losss(sqlitedb,end_time=end_time) + # model_results3 = model_losss_yongan(sqlitedb,end_time=end_time,table_name_prefix=table_name_prefix) # logger.info('训练数据绘图end') # 模型报告 diff --git a/models/nerulforcastmodels.py b/models/nerulforcastmodels.py index e14c5a7..3fdb937 100644 --- a/models/nerulforcastmodels.py +++ b/models/nerulforcastmodels.py @@ -226,6 +226,413 @@ def ex_Model(df,horizon,input_size,train_steps,val_check_steps,early_stop_patien return +# 雍安环境预测评估指数 +@exception_logger +def model_losss_yongan(sqlitedb,end_time,table_name_prefix): + global dataset + global rote + most_model = [sqlitedb.select_data('most_model',columns=['most_common_model'],order_by='ds desc',limit=1).values[0][0]] + most_model_name = most_model[0] + + # 预测数据处理 predict + # df_combined = loadcsv(os.path.join(dataset,"cross_validation.csv")) + # df_combined = dateConvert(df_combined) + df_combined = sqlitedb.select_data('accuracy',where_condition=f"created_dt <= '{end_time}'") + df_combined4 = df_combined.copy() # 备份df_combined,后面画图需要 + # 删除缺失值大于80%的列 + logger.info(df_combined.shape) + df_combined = df_combined.loc[:, df_combined.isnull().mean() < 0.8] + logger.info(df_combined.shape) + # 删除缺失值 + df_combined.dropna(inplace=True) + logger.info(df_combined.shape) + # 其他列转为数值类型 + df_combined = df_combined.astype({col: 'float32' for col in df_combined.columns if col not in ['CREAT_DATE','ds','created_dt'] }) + # 使用 groupby 和 transform 结合 lambda 函数来获取每个分组中 cutoff 的最小值,并创建一个新的列来存储这个最大值 + df_combined['max_cutoff'] = df_combined.groupby('ds')['CREAT_DATE'].transform('max') + + # 然后筛选出那些 cutoff 等于 max_cutoff 的行,这样就得到了每个分组中 cutoff 最大的行,并保留了其他列 + df_combined = df_combined[df_combined['CREAT_DATE'] == df_combined['max_cutoff']] + # 删除模型生成的cutoff列 + df_combined.drop(columns=['CREAT_DATE', 'max_cutoff','created_dt','min_within_quantile','max_within_quantile','id','min_price','max_price','LOW_PRICE','HIGH_PRICE','mean'], inplace=True) + # 获取模型名称 + modelnames = df_combined.columns.to_list()[1:] + if 'y' in modelnames: + modelnames.remove('y') + df_combined3 = df_combined.copy() # 备份df_combined,后面画图需要 + + + # 空的列表存储每个模型的MSE、RMSE、MAE、MAPE、SMAPE + cellText = [] + + # 遍历模型名称,计算模型评估指标 + for model in modelnames: + modelmse = mse(df_combined['y'], df_combined[model]) + modelrmse = rmse(df_combined['y'], df_combined[model]) + modelmae = mae(df_combined['y'], df_combined[model]) + # modelmape = mape(df_combined['y'], df_combined[model]) + # modelsmape = smape(df_combined['y'], df_combined[model]) + # modelr2 = r2_score(df_combined['y'], df_combined[model]) + cellText.append([model,round(modelmse, 3), round(modelrmse, 3), round(modelmae, 3)]) + + model_results3 = pd.DataFrame(cellText,columns=['模型(Model)','平均平方误差(MSE)', '均方根误差(RMSE)', '平均绝对误差(MAE)']) + # 按MSE降序排列 + model_results3 = model_results3.sort_values(by='平均平方误差(MSE)', ascending=True) + model_results3.to_csv(os.path.join(dataset,"model_evaluation.csv"),index=False) + modelnames = model_results3['模型(Model)'].tolist() + allmodelnames = modelnames.copy() + # 保存5个最佳模型的名称 + if len(modelnames) > 5: + modelnames = modelnames[0:5] + if is_fivemodels: + pass + else: + with open(os.path.join(dataset,"best_modelnames.txt"), 'w') as f: + f.write(','.join(modelnames) + '\n') + + # 预测值与真实值对比图 + plt.rcParams['font.sans-serif'] = ['SimHei'] + plt.figure(figsize=(15, 10)) + for n,model in enumerate(modelnames[:5]): + plt.subplot(3, 2, n+1) + plt.plot(df_combined3['ds'], df_combined3['y'], label='真实值') + plt.plot(df_combined3['ds'], df_combined3[model], label=model) + plt.legend() + plt.xlabel('日期') + plt.ylabel('价格') + plt.title(model+'拟合') + plt.subplots_adjust(hspace=0.5) + plt.savefig(os.path.join(dataset,'预测值与真实值对比图.png'), bbox_inches='tight') + plt.close() + + + # # 历史数据+预测数据 + # # 拼接未来时间预测 + df_predict = pd.read_csv(os.path.join(dataset,'predict.csv')) + df_predict.drop('unique_id',inplace=True,axis=1) + df_predict.dropna(axis=1,inplace=True) + + try: + df_predict['ds'] = pd.to_datetime(df_predict['ds'],format=r'%Y-%m-%d') + except ValueError : + df_predict['ds'] = pd.to_datetime(df_predict['ds'],format=r'%Y/%m/%d') + + def first_row_to_database(df): + # # 取第一行数据存储到数据库中 + first_row = df.head(1) + first_row['ds'] = first_row['ds'].dt.strftime('%Y-%m-%d 00:00:00') + # 将预测结果保存到数据库 + if not sqlitedb.check_table_exists('trueandpredict'): + first_row.to_sql('trueandpredict',sqlitedb.connection,index=False) + else: + for col in first_row.columns: + sqlitedb.add_column_if_not_exists('trueandpredict',col,'TEXT') + for row in first_row.itertuples(index=False): + row_dict = row._asdict() + columns=row_dict.keys() + check_query = sqlitedb.select_data('trueandpredict',where_condition = f"ds = '{row.ds}'") + if len(check_query) > 0: + set_clause = ", ".join([f"{key} = '{value}'" for key, value in row_dict.items()]) + sqlitedb.update_data('trueandpredict',set_clause,where_condition = f"ds = '{row.ds}'") + continue + sqlitedb.insert_data('trueandpredict',tuple(row_dict.values()),columns=columns) + + first_row_to_database(df_predict) + + df_combined3 = pd.concat([df_combined3, df_predict]).reset_index(drop=True) + + # 计算每个模型与最佳模型的绝对误差比例,根据设置的阈值rote筛选预测值显示最大最小值 + names = [] + names_df = df_combined3.copy() + for col in allmodelnames: + names_df[f'{col}-{most_model_name}-误差比例'] = abs(names_df[col] - names_df[most_model_name]) / names_df[most_model_name] + names.append(f'{col}-{most_model_name}-误差比例') + + names_df = names_df[names] + def add_rote_column(row): + columns = [] + for r in names_df.columns: + if row[r] <= rote: + columns.append(r.split('-')[0]) + return pd.Series([columns], index=['columns']) + names_df['columns'] = names_df.apply(add_rote_column, axis=1) + + def add_upper_lower_bound(row): + print(row['columns']) + print(type(row['columns'])) + # 计算上边界值 + upper_bound = df_combined3.loc[row.name,row['columns']].max() + # 计算下边界值 + lower_bound = df_combined3.loc[row.name,row['columns']].min() + return pd.Series([lower_bound, upper_bound], index=['min_within_quantile', 'max_within_quantile']) + df_combined3[['min_within_quantile','max_within_quantile']] = names_df.apply(add_upper_lower_bound, axis=1) + + def find_closest_values(row): + x = row.y + if x is None or np.isnan(x): + return pd.Series([None, None], index=['min_price','max_price']) + # row = row.drop('ds') + row = row.values.tolist() + row.sort() + print(row) + # x 在row中的索引 + index = row.index(x) + if index == 0: + return pd.Series([row[index+1], row[index+2]], index=['min_price','max_price']) + elif index == len(row)-1: + return pd.Series([row[index-2], row[index-1]], index=['min_price','max_price']) + else: + return pd.Series([row[index-1], row[index+1]], index=['min_price','max_price']) + + def find_most_common_model(): + # 最多频率的模型名称 + min_model_max_frequency_model = df_combined3['min_model'].tail(60).value_counts().idxmax() + max_model_max_frequency_model = df_combined3['max_model'].tail(60).value_counts().idxmax() + if min_model_max_frequency_model == max_model_max_frequency_model: + # 取60天第二多的模型 + max_model_max_frequency_model = df_combined3['max_model'].tail(60).value_counts().nlargest(2).index[1] + + df_predict['min_model'] = min_model_max_frequency_model + df_predict['max_model'] = max_model_max_frequency_model + df_predict['min_within_quantile'] = df_predict[min_model_max_frequency_model] + df_predict['max_within_quantile'] = df_predict[max_model_max_frequency_model] + + + # find_most_common_model() + + df_combined3['ds'] = pd.to_datetime(df_combined3['ds']) + df_combined3['ds'] = df_combined3['ds'].dt.strftime('%Y-%m-%d') + df_predict2 = df_combined3.tail(horizon) + + # 保存到数据库 + if not sqlitedb.check_table_exists(f'{table_name_prefix}accuracy'): + columns = ','.join(df_combined3.columns.to_list()+['id','CREAT_DATE','min_price','max_price','LOW_PRICE','HIGH_PRICE','mean']) + sqlitedb.create_table('accuracy',columns=columns) + existing_data = sqlitedb.select_data(table_name = "accuracy") + + if not existing_data.empty: + max_id = existing_data['id'].astype(int).max() + df_predict2['id'] = range(max_id + 1, max_id + 1 + len(df_predict2)) + else: + df_predict2['id'] = range(1, 1 + len(df_predict2)) + df_predict2['CREAT_DATE'] = end_time + + save_to_database(sqlitedb,df_predict2,"accuracy",end_time) + + # 上周准确率计算 + accuracy_df = sqlitedb.select_data(table_name = "accuracy") + predict_y = accuracy_df.copy() + # ids = predict_y[predict_y['min_price'].isnull()]['id'].tolist() + ids = predict_y['id'].tolist() + # 准确率基准与绘图上下界逻辑一致 + # predict_y[['min_price','max_price']] = predict_y[['min_within_quantile','max_within_quantile']] + # 模型评估前五均值 + # predict_y['min_price'] = predict_y[modelnames].mean(axis=1) -1 + # predict_y['max_price'] = predict_y[modelnames].mean(axis=1) +1 + # 模型评估前十均值 + predict_y['min_price'] = predict_y[allmodelnames[0:10]].mean(axis=1) -1.5 + predict_y['mean'] = predict_y[allmodelnames[0:10]].mean(axis=1) + predict_y['max_price'] = predict_y[allmodelnames[0:10]].mean(axis=1) +1.5 + # 模型评估前十最大最小 + # allmodelnames 和 predict_y 列 重复的 + # allmodelnames = [col for col in allmodelnames if col in predict_y.columns] + # predict_y['min_price'] = predict_y[allmodelnames[0:10]].min(axis=1) + # predict_y['max_price'] = predict_y[allmodelnames[0:10]].max(axis=1) + for id in ids: + row = predict_y[predict_y['id'] == id] + try: + sqlitedb.update_data('accuracy',f"min_price = {row['min_price'].values[0]},max_price = {row['max_price'].values[0]},mean={row['mean'].values[0]}",f"id = {id}") + except: + logger.error(f'更新accuracy表中的min_price,max_price,mean值失败,row={row}') + + df = accuracy_df.copy() + df['ds'] = pd.to_datetime(df['ds']) + df = df.reindex() + + # 判断预测值在不在布伦特最高最低价范围内,准确率为1,否则为0 + def is_within_range(row): + for model in allmodelnames: + if row['LOW_PRICE'] <= row[col] <= row['HIGH_PRICE']: + return 1 + else: + return 0 + + # 定义一个函数来计算准确率 + def calculate_accuracy(row): + # 比较真实最高最低,和预测最高最低 计算准确率 + # 全子集情况: + if (row['max_price'] >= row['HIGH_PRICE'] and row['min_price'] <= row['LOW_PRICE']) or \ + (row['max_price'] <= row['HIGH_PRICE'] and row['min_price'] >= row['LOW_PRICE']): + return 1 + # 无交集情况: + if row['max_price'] < row['LOW_PRICE'] or \ + row['min_price'] > row['HIGH_PRICE']: + return 0 + # 有交集情况: + else: + sorted_prices = sorted([row['LOW_PRICE'], row['min_price'], row['max_price'], row['HIGH_PRICE']]) + middle_diff = sorted_prices[2] - sorted_prices[1] + price_range = row['HIGH_PRICE'] - row['LOW_PRICE'] + accuracy = middle_diff / price_range + return accuracy + + columns = ['HIGH_PRICE','LOW_PRICE','min_price','max_price'] + df[columns] = df[columns].astype(float) + df['ACCURACY'] = df.apply(calculate_accuracy, axis=1) + # df['ACCURACY'] = df.apply(is_within_range, axis=1) + + # 计算准确率并保存结果 + def _get_accuracy_rate(df,create_dates,ds_dates,endtime): + df3 = df.copy() + df3 = df3[df3['CREAT_DATE'].isin(create_dates)] + df3 = df3[df3['ds'].isin(ds_dates)] + accuracy_rote = 0 + for i,group in df3.groupby('CREAT_DATE'): + accuracy_rote += (group['ACCURACY'].sum()/len(group))*weight_dict[len(group)-1] + accuracy_rote = round(accuracy_rote,2) + df4 = pd.DataFrame(columns=['开始日期','结束日期','准确率']) + df4.loc[len(df4)] = {'开始日期':ds_dates[0],'结束日期':ds_dates[-1],'准确率':accuracy_rote} + df4.to_sql("accuracy_rote", con=sqlitedb.connection, if_exists='append', index=False) + create_dates,ds_dates = get_week_date(end_time) + _get_accuracy_rate(df,create_dates,ds_dates,end_time) + + def _add_abs_error_rate(): + # 计算每个预测值与真实值之间的偏差率 + for model in allmodelnames: + df_combined3[f'{model}_abs_error_rate'] = abs(df_combined3['y'] - df_combined3[model]) / df_combined3['y'] + + # 获取每行对应的最小偏差率值 + min_abs_error_rate_values = df_combined3.apply(lambda row: row[[f'{model}_abs_error_rate' for model in allmodelnames]].min(), axis=1) + # 获取每行对应的最小偏差率值对应的列名 + min_abs_error_rate_column_name = df_combined3.apply(lambda row: row[[f'{model}_abs_error_rate' for model in allmodelnames]].idxmin(), axis=1) + # 将列名索引转换为列名 + min_abs_error_rate_column_name = min_abs_error_rate_column_name.map(lambda x: x.split('_')[0]) + # 获取最小偏差率对应的模型的预测值 + min_abs_error_rate_predictions = df_combined3.apply(lambda row: row[min_abs_error_rate_column_name[row.name]], axis=1) + # 将最小偏差率对应的模型的预测值添加到DataFrame中 + df_combined3['min_abs_error_rate_prediction'] = min_abs_error_rate_predictions + df_combined3['min_abs_error_rate_column_name'] = min_abs_error_rate_column_name + # _add_abs_error_rate() + + # 判断 df 的数值列转为float + for col in df_combined3.columns: + try: + if col != 'ds': + df_combined3[col] = df_combined3[col].astype(float) + df_combined3[col] = df_combined3[col].round(2) + except ValueError: + pass + df_combined3.to_csv(os.path.join(dataset,"testandpredict_groupby.csv"),index=False) + + + # 历史价格+预测价格 + sqlitedb.drop_table('testandpredict_groupby') + df_combined3.to_sql('testandpredict_groupby',sqlitedb.connection,index=False) + + def _plt_predict_ture(df): + lens = df.shape[0] if df.shape[0] < 180 else 90 + df = df[-lens:] # 取180个数据点画图 + # 历史价格 + plt.figure(figsize=(20, 10)) + plt.plot(df['ds'], df['y'], label='真实值') + # 颜色填充 + plt.fill_between(df['ds'], df['max_within_quantile'], df['min_within_quantile'], alpha=0.2) + markers = ['o', 's', '^', 'D', 'v', '*', 'p', 'h', 'H', '+', 'x', 'd'] + random_marker = random.choice(markers) + for model in modelnames: + plt.plot(df['ds'][-horizon:], df[model][-horizon:], label=model,marker=random_marker) + # plt.plot(df_combined3['ds'], df_combined3['min_abs_error_rate_prediction'], label='最小绝对误差', linestyle='--', color='orange') + # 网格 + plt.grid(True) + # 显示历史值 + for i, j in zip(df['ds'], df['y']): + plt.text(i, j, str(j), ha='center', va='bottom') + + # 当前日期画竖虚线 + plt.axvline(x=df['ds'].iloc[-horizon], color='r', linestyle='--') + plt.legend() + plt.xlabel('日期') + plt.ylabel('价格') + + plt.savefig(os.path.join(dataset,'历史价格-预测值.png'), bbox_inches='tight') + plt.close() + + + def _plt_modeltopten_predict_ture(df): + df['max_cutoff'] = df.groupby('ds')['CREAT_DATE'].transform('max') + df = df[df['CREAT_DATE'] == df['max_cutoff']] + df['mean'] = df['mean'].astype(float) + lens = df.shape[0] if df.shape[0] < 180 else 180 + df = df[-lens:] # 取180个数据点画图 + # 历史价格 + plt.figure(figsize=(20, 10)) + plt.plot(df['ds'], df['y'], label='真实值') + plt.plot(df['ds'], df['mean'], label='模型前十均值', linestyle='--', color='orange') + # 颜色填充 + plt.fill_between(df['ds'], df['max_price'], df['min_price'], alpha=0.2) + # markers = ['o', 's', '^', 'D', 'v', '*', 'p', 'h', 'H', '+', 'x', 'd'] + # random_marker = random.choice(markers) + # for model in allmodelnames: + # for model in ['BiTCN','RNN']: + # plt.plot(df['ds'], df[model], label=model,marker=random_marker) + # plt.plot(df_combined3['ds'], df_combined3['min_abs_error_rate_prediction'], label='最小绝对误差', linestyle='--', color='orange') + # 网格 + plt.grid(True) + # 显示历史值 + for i, j in zip(df['ds'], df['y']): + plt.text(i, j, str(j), ha='center', va='bottom') + + # 当前日期画竖虚线 + plt.axvline(x=df['ds'].iloc[-horizon], color='r', linestyle='--') + plt.legend() + plt.xlabel('日期') + plt.ylabel('价格') + + plt.savefig(os.path.join(dataset,'历史价格-预测值1.png'), bbox_inches='tight') + plt.close() + + + def _plt_predict_table(df): + # 预测值表格 + fig, ax = plt.subplots(figsize=(20, 6)) + ax.axis('off') # 关闭坐标轴 + # 数值保留2位小数 + df = df.round(2) + df = df[-horizon:] + df['Day'] = [f'Day_{i}' for i in range(1,horizon+1)] + # Day列放到最前面 + df = df[['Day'] + list(df.columns[:-1])] + table = ax.table(cellText=df.values, colLabels=df.columns, loc='center') + #加宽表格 + table.auto_set_font_size(False) + table.set_fontsize(10) + + # 设置表格样式,列数据最小的用绿色标识 + plt.savefig(os.path.join(dataset,'预测值表格.png'), bbox_inches='tight') + plt.close() + + def _plt_model_results3(): + # 可视化评估结果 + plt.rcParams['font.sans-serif'] = ['SimHei'] + fig, ax = plt.subplots(figsize=(20, 10)) + ax.axis('off') # 关闭坐标轴 + table = ax.table(cellText=model_results3.values, colLabels=model_results3.columns, loc='center') + # 加宽表格 + table.auto_set_font_size(False) + table.set_fontsize(10) + + # 设置表格样式,列数据最小的用绿色标识 + plt.savefig(os.path.join(dataset,'模型评估.png'), bbox_inches='tight') + plt.close() + + _plt_predict_ture(df_combined3) + _plt_modeltopten_predict_ture(df_combined4) + _plt_predict_table(df_combined3) + _plt_model_results3() + + return model_results3 + + # 原油计算预测评估指数 @exception_logger def model_losss(sqlitedb,end_time): diff --git a/yongandataset/jbsh_yuanyou.db b/yongandataset/jbsh_yuanyou.db index e82da782a678ab0fca2480f4d1281365d05b73a6..b35651fca944bcfa371e03af9fd43a227837d5c9 100644 GIT binary patch delta 793 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 c@% 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 P6kG