PriceForecast/config_shiyoujiao_puhuo.py
2025-03-26 14:37:42 +08:00

410 lines
18 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import logging
import os
import logging.handlers
import datetime
from lib.tools import MySQLDB, SQLiteHandler
# eta 接口token
APPID = "XNLDvxZHHugj7wJ7"
SECRET = "iSeU4s6cKKBVbt94htVY1p0sqUMqb2xa"
# eta 接口url
sourcelisturl = 'http://10.189.2.78:8108/v1/edb/source/list'
classifylisturl = 'http://10.189.2.78:8108/v1/edb/classify/list?ClassifyType='
uniquecodedataurl = 'http://10.189.2.78:8108/v1/edb/data?UniqueCode=4991c37becba464609b409909fe4d992&StartDate=2024-02-01'
classifyidlisturl = 'http://10.189.2.78:8108/v1/edb/list?ClassifyId='
edbcodedataurl = 'http://10.189.2.78:8108/v1/edb/data?EdbCode='
edbdatapushurl = 'http://10.189.2.78:8108/v1/edb/push'
edbdeleteurl = 'http://10.189.2.78:8108/v1/edb/business/edb/del'
edbbusinessurl = 'http://10.189.2.78:8108/v1/edb/business/data/del'
edbcodenamedict = {
'C2403287411': '华北高硫焦与等热值动力煤价格对比',
'C2403282801': '华东高硫焦与等热值动力煤价格对比',
'ID00150321': '石油焦2 # A市场低端价山东',
'ID00150329': '石油焦2 # A市场主流价山东',
'ID00150325': '石油焦2 # A市场高端价山东',
'ID00150333': '石油焦2 # B市场低端价山东',
'ID00150357': '石油焦2 # B市场主流价山东',
'ID00150345': '石油焦2 # B市场高端价山东',
'ID01101276': '高硫焦4B出厂价山东青岛炼化',
'ID00150417': '石油焦:高硫焦:市场低端价:华北地区(日)',
'ID00150425': '石油焦:高硫焦:市场低端价:华南地区(日)',
'ID00150437': '石油焦:高硫焦:市场高端价:华北地区(日)',
'ID00150441': '石油焦:高硫焦:市场高端价:华东地区(日)',
'ID00150445': '石油焦:高硫焦:市场高端价:华南地区(日)',
'ID00150449': '石油焦:高硫焦:市场高端价:西北地区(日)',
'ID00150453': '石油焦:高硫焦:市场高端价:西南地区(日)',
'ID01300358': '石油焦3 # C市场低端价山东',
'ID01300357': '石油焦3 # C市场高端价山东',
'ID00150377': '石油焦3 # :市场主流价:华中地区(日)',
'ID01387678': '煅烧焦中硫3 % S市场价华中地区',
'ID01387656': '煅烧焦中硫3 % S市场价山东',
'ID00150381': '石油焦3 # A市场低端价山东',
'ID00150397': '石油焦3 # B市场低端价山东',
'ID00150405': '石油焦3 # B市场高端价山东',
'ID00150429': '石油焦:高硫焦:市场低端价:西北地区(日)',
'ID00150433': '石油焦:高硫焦:市场低端价:西南地区(日)',
'ID00150457': '石油焦:高硫焦:市场主流价:华北地区(日)',
'ID00150461': '石油焦:高硫焦:市场主流价:华东地区(日)',
'ID00150465': '石油焦:高硫焦:市场主流价:华南地区(日)',
'ID00150469': '石油焦:高硫焦:市场主流价:西北地区(日)',
'ID00150473': '石油焦:高硫焦:市场主流价:西南地区(日)',
'B3e90b34e4b9e7a6ea3': '石油焦市场均价(元/吨)',
'B8a0ab5357569c385a9': '石油焦海绵焦市场均价(元/吨)',
'B8a920b59fe7effd116': '石油焦4 # -5#市场均价(元/吨)',
'B81e66c7dc542809035': '石油焦海绵焦华东高硫焦(低端)(元/吨)(百川)',
'B6fc631d20e277ce496': '石油焦海绵焦华东高硫焦(高端)(元/吨)(百川)',
'Be9ed3ebd44ad291a3c': '石油焦海绵焦华南高硫焦(低端)(元/吨)(百川)',
'B347350473783e640dc': '石油焦海绵焦华南高硫焦(高端)(元/吨)(百川)',
'B7acab268ac4a419f77': '煅烧焦华北中硫(低端S < 3.0,普货)(元/吨)',
'Beecfb2678481997f68': '煅烧焦山东中硫(高端S < 3.0,普货)(元/吨)',
'B4bc4d186dc0f7d6d96': '煅烧焦华中中硫(高端S < 3.0,普货)(元/吨)',
'B46cc7d0a90155b5bfd': '煅烧焦山东高硫(高端S < 3.5,普货)(元/吨)',
'B4501068048575cd6f1': '煅烧焦西北高硫(S < 4.0,普货)(元/吨)',
'Bfccb234f4c4e047314': '煅烧焦中硫普货市场均价(硫 < 3.0 %)(元/吨)',
'B1133e458cc493d7728': '煅烧焦高硫普货市场均价(元/吨)(百川)',
'B185a597decfc71915a': '预焙阳极山东低端(元/吨)(百川)',
'B16b98ff5f959dfdcad': '负极材料市场参考价(元/吨)(百川)',
'B7ce1371e09479bee56': '人造石墨负极材料中端(元/吨)',
'Bab0904b23e968a3068': '天然石墨负极材料中端(元/吨)',
'B180e67aaa174414553': '中间相碳微球负极材料高端(元/吨)',
'B41c03de42ea84d5c2f': '中间相碳微球负极材料中端(元/吨)',
'B5c3b60680b7bbd92af': '负极材料石墨化国内低端价(元/吨)',
'B1bcde6130de031bd42': '山西 改质沥青(元/吨)',
'Bb9f4a1f6dd32b4ad8a': '山东 改质沥青(元/吨)',
'C2411261557491549': '石油焦市场均价(元/吨)/4DMA',
'C2411271143174617': '石油焦市场均价(元/吨)/9DMA',
'RE00010074': '煅烧焦:中硫焦:生产毛利:山东(周)',
'B9d1acaf80383683da3': '石油焦总产量(周)(吨)',
'Bdaa719a38936c8dd76': '石油焦开工率(周)(% )',
'B9459d549a332b200e7': '石油焦行业总库存(周)(吨)',
'Bce6e098b9518370cff': '石油焦工厂库存(周)(吨)',
'B577ce2809772779710': '石油焦市场库存(周)(吨)',
'B5d8c564c62f3e6b77f': '石油焦成本(周)(吨)',
'B43baa98bcaa06c11a5': '石油焦利润(周)(吨)',
'Bdd0c1361d94081211c': '煅烧石油焦总产量(周)(吨)',
'B65315111fa28951b1e': '煅烧石油焦开工率(周)(% )',
'B2aff5f2632a20027d0': '煅烧石油焦行业总库存(周)(吨)',
'B29fbd31128cd71b212': '煅烧石油焦工厂库存(周)(吨)',
'B7a88313a89d1261c53': '煅烧石油焦成本(周)(吨)',
'Bd4fa36b4decec0aafa': '煅烧石油焦利润(周)(吨)',
'B9bd80eac7df81ffbd4': '预焙阳极总产量(周)(吨)',
'B27074786605f4660d2': '预焙阳极开工率(周)(% )',
'Bdc2a5985ecb56b6a0c': '预焙阳极行业总库存(周)(吨)',
'Bce8511f899e487e5b6': '预焙阳极工厂库存(周)(吨)',
'B13ec89105bd866a2bd': '预焙阳极成本(周)(吨)',
'B66c3abcfa15a2e611c': '预焙阳极利润(周)(吨)',
'Ba3bcf63e6e846cd3f8': '负极材料总产量(周)(吨)',
'B10b8f4c702b72f4ee4': '负极材料开工率(周)(% )',
'Bc25e82dd595c5f92fc': '负极材料行业总库存(周)(吨)',
'B0a14d1936a5e072f25': '负极材料工厂库存(周)(吨)',
'Ba9d192464b78194a48': '负极材料成本(周)(吨)',
'B15d62d9f48ccfa5984': '负极材料利润(周)(吨)',
'B7478e77ca116386afd': '针状焦总产量(周)(吨)',
'Bbe316d65258a4d47f4': '针状焦行业总库存(周)(吨)',
'Bf036a360a5eecb591d': '针状焦工厂库存(周)(吨)',
'Bc43a790c62aa57fc9d': '针状焦成本(周)(吨)',
'B23ebedbb88ff412952': '针状焦利润(周)(吨)',
'C2403286685': '黄骅港动力煤等热值',
'C2403285171': '黄骅等热值动力煤',
'C2403287884': '中硫石油焦煅烧利润',
'W000294': '国内主要港口石油焦出货量(隆重)',
'W000293': '日照港库存(隆重)',
'W000292': '港口总库存(隆重)',
'W000283': '主营石油焦产量(隆重)',
'W000282': '地炼石油焦产量(隆重)',
'W000281': '中国石油焦产量(隆重)',
'W000280': '主营石油焦开工负荷率(隆重)',
'W000279': '地炼石油焦开工负荷率(隆重)',
}
edbcodelist = edbcodenamedict.keys()
# 临时写死用指定的列,与上面的edbcode对应后面更改
edbnamelist = ['ds', 'y']+[edbcodenamedict[edbcodename]
for edbcodename in edbcodelist]
# eta自有数据指标编码石油焦铝用还没新增暂且留空
modelsindex = {
}
# 百川数据指标编码
baichuanidnamedict = {
'1588348470396480901': '石油焦滨州-友泰',
'1588348470396480903': '石油焦东营-海科瑞林',
'1588348470396480911': '石油焦东营-亚通',
'1588348470396480888': '石油焦沧州-鑫海',
'1588348470396480917': '石油焦东营-万通',
'1588348470396480925': '石油焦东营-齐润',
'1588348470396481084': '石油焦东营-尚能4 # ',
'1588348470396480930': '石油焦潍坊-寿光鲁清',
'1588348470396480929': '石油焦滨州-鑫岳',
'1588348470396480650': '煅烧石油焦东营-启德-1',
'1588348470396481053': '煅烧石油焦东营-启德-2',
'1588348470396480645': '煅烧石油焦东营-山东汇宇-1',
'1588348470396481049': '煅烧石油焦东营-山东汇宇-2',
'1588348470396481098': '煅烧石油焦东营-山东汇宇-3',
'1588348470396481108': '煅烧石油焦东营-山东汇宇-4'
}
# baichuanidnamedict = {'1588348470396475286': 'test1', '1666': 'test2'} # 北京环境测试用
# eta 上传预测结果的请求体,后面发起请求的时候更改 model datalist 数据
data = {
"IndexCode": "",
"IndexName": "价格预测模型",
"Unit": "",
"Frequency": "日度",
"SourceName": f"价格预测",
"Remark": 'ddd',
"DataList": [
{
"Date": "2024-05-02",
"Value": 333444
}
]
}
# eta 分类
# level3才可以获取到数据所以需要人工把能源化工下所有的level3级都找到
# url = 'http://10.189.2.78:8108/v1/edb/list?ClassifyId=1214'
# ParentId ":1160, 能源化工
# ClassifyId ":1214,原油 3912 石油焦
# ParentId ":1214,",就是原油下所有的数据。
ClassifyId = 3707
# 变量定义--测试环境
server_host = '192.168.100.53' # 内网
# server_host = '183.242.74.28' # 外网
login_pushreport_url = f"http://{server_host}:8080/jingbo-dev/api/server/login"
# 上传报告
upload_url = f"http://{server_host}:8080/jingbo-dev/api/analysis/reportInfo/researchUploadReportSave"
# 停更预警
upload_warning_url = f"http://{server_host}:8080/jingbo-dev/api/basicBuiness/crudeOilWarning/save"
# 查询数据项编码
query_data_list_item_nos_url = f"http://{server_host}:8080/jingbo-dev/api/warehouse/dwDataItem/queryDataListItemNos"
# 上传数据项值
push_data_value_list_url = f"http://{server_host}:8080/jingbo-dev/api/dw/dataValue/pushDataValueList"
login_data = {
"data": {
"account": "api_test",
# "password": "MmVmNzNlOWI0MmY0ZDdjZGUwNzE3ZjFiMDJiZDZjZWU=", # Shihua@123456
"password": "ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U=", # 123456
"tenantHashCode": "8a4577dbd919675758d57999a1e891fe",
"terminal": "API"
},
"funcModule": "API",
"funcOperation": "获取token"
}
upload_data = {
"groupNo": '', # 用户组id
"funcModule": '研究报告信息',
"funcOperation": '上传原油价格预测报告',
"data": {
"ownerAccount": 'arui', # 报告所属用户账号
"reportType": 'OIL_PRICE_FORECAST', # 报告类型固定为OIL_PRICE_FORECAST
"fileName": '2000-40-5-50--100-原油指标数据.xlsx-Brent活跃合约--2024-09-06-15-01-29-预测报告.pdf', # 文件名称
"fileBase64": '', # 文件内容base64
"categoryNo": 'yyjgycbg', # 研究报告分类编码
"smartBusinessClassCode": 'YCJGYCBG', # 分析报告分类编码
"reportEmployeeCode": "E40116", # 报告人
"reportDeptCode": "D0044", # 报告部门
"productGroupCode": "RAW_MATERIAL" # 商品分类
}
}
warning_data = {
"groupNo": '', # 用户组id
"funcModule": '原油特征停更预警',
"funcOperation": '原油特征停更预警',
"data": {
'WARNING_TYPE_NAME': '特征数据停更预警',
'WARNING_CONTENT': '',
'WARNING_DATE': ''
}
}
query_data_list_item_nos_data = {
"funcModule": "数据项",
"funcOperation": "查询",
"data": {
"dateStart": "20200101",
"dateEnd": "20241231",
"dataItemNoList": ["Brentzdj", "Brentzgj"] # 数据项编码,代表 brent最低价和最高价
}
}
push_data_value_list_data = {
"funcModule": "数据表信息列表",
"funcOperation": "新增",
"data": [
{"dataItemNo": "91230600716676129",
"dataDate": "20230113",
"dataStatus": "add",
"dataValue": 100.11
},
{"dataItemNo": "91230600716676129P|ETHYL_BEN|CAPACITY",
"dataDate": "20230113",
"dataStatus": "add",
"dataValue": 100.55
},
{"dataItemNo": "91230600716676129P|ETHYL_BEN|CAPACITY",
"dataDate": "20230113",
"dataStatus": "add",
"dataValue": 100.55
}
]
}
# 八大维度数据项编码
bdwd_items = {
'ciri': 'syjphycbdwdcr',
'benzhou': 'syjphycbdwdbz',
'cizhou': 'syjlyycbdwdcz',
'gezhou': 'syjlyycbdwdgz',
'ciyue': 'syjlyycbdwdcy',
'cieryue': 'syjlyycbdwdcey',
'cisanyue': 'syjlyycbdwdcsy',
'cisiyue': 'syjlyycbdwdcsiy',
}
# 北京环境数据库
# host = '192.168.101.27'
# port = 3306
# dbusername = 'root'
# password = '123456'
# dbname = 'jingbo_test'
# 京博测试环境
host = 'rm-2zehj3r1n60ttz9x5ko.mysql.rds.aliyuncs.com'
port = 3306
dbusername = 'jingbo'
password = 'shihua@123'
dbname = 'jingbo-test'
table_name = 'v_tbl_crude_oil_warning'
baichuan_table_name = 'V_TBL_BAICHUAN_YINGFU_VALUE'
# select BAICHUAN_ID, DATA_DATE, DATA_VALUE from V_TBL_BAICHUAN_YINGFU_VALUE where BAICHUAN_ID in ('1588348470396475286', '1666')
# 开关
is_train = True # 是否训练
is_debug = False # 是否调试
is_eta = True # 是否使用eta接口
is_market = False # 是否通过市场信息平台获取特征 ,在is_eta 为true 的情况下生效
is_timefurture = True # 是否使用时间特征
is_fivemodels = False # 是否使用之前保存的最佳的5个模型
is_edbcode = False # 特征使用edbcoding列表中的
is_edbnamelist = False # 自定义特征对应上面的edbnamelist
is_update_eta = False # 预测结果上传到eta
is_update_report = True # 是否上传报告
is_update_warning_data = False # 是否上传预警数据
is_update_predict_value = True # 是否上传预测值到市场信息平台
is_del_corr = 0.6 # 是否删除相关性高的特征,取值为 0-1 0 为不删除0.6 表示删除相关性小于0.6的特征
is_del_tow_month = True # 是否删除两个月不更新的特征
# 连接到数据库
db_mysql = MySQLDB(host=host, user=dbusername,
password=password, database=dbname)
db_mysql.connect()
print("数据库连接成功", host, dbname, dbusername)
# 数据截取日期
start_year = 2020 # 数据开始年份
end_time = '' # 数据截取日期
freq = 'B' # 时间频率,"D": 天 "W": 周"M": 月"Q": 季度"A": 年 "H": 小时 "T": 分钟 "S": 秒 "B": 工作日
delweekenday = True if freq == 'B' else False # 是否删除周末数据
is_corr = False # 特征是否参与滞后领先提升相关系数
add_kdj = False # 是否添加kdj指标
if add_kdj and is_edbnamelist:
edbnamelist = edbnamelist+['K', 'D', 'J']
# 模型参数
y = '煅烧焦山东高硫(高端S < 3.5,普货)(元/吨)'
avg_cols = [
]
offsite = 80
offsite_col = []
horizon = 5 # 预测的步长
input_size = 40 # 输入序列长度
train_steps = 50 if is_debug else 1000 # 训练步数,用来限定epoch次数
val_check_steps = 30 # 评估频率
early_stop_patience_steps = 5 # 早停的耐心步数
# --- 交叉验证用的参数
test_size = 200 # 测试集大小定义100后面使用的时候重新赋值
val_size = test_size # 验证集大小,同测试集大小
# 特征筛选用到的参数
k = 100 # 特征筛选数量如果是0或者值比特征数量大代表全部特征
corr_threshold = 0.6 # 相关性大于0.6的特征
rote = 0.06 # 绘图上下界阈值
# 计算准确率
weight_dict = [0.4, 0.15, 0.1, 0.1, 0.25] # 权重
# 文件
data_set = '石油焦普货指标数据.xlsx' # 数据集文件
dataset = 'shiyoujiaopuhuodataset' # 数据集文件夹
# 数据库名称
db_name = os.path.join(dataset, 'jbsh_shiyoujiao_puhuo.db')
sqlitedb = SQLiteHandler(db_name)
sqlitedb.connect()
settings = f'{input_size}-{horizon}-{train_steps}--{k}-{data_set}'
# 获取日期时间
# now = datetime.datetime.now().strftime('%Y%m%d%H%M%S') # 获取当前日期时间
now = datetime.datetime.now().strftime('%Y-%m-%d') # 获取当前日期时间
reportname = f'石油焦普货大模型日度预测报告--{end_time}.pdf' # 报告文件名
reportname = reportname.replace(':', '-') # 替换冒号
if end_time == '':
end_time = now
# 邮件配置
username = '1321340118@qq.com'
passwd = 'wgczgyhtyyyyjghi'
# recv=['liurui_test@163.com','52585119@qq.com']
recv = ['liurui_test@163.com']
# recv=['liurui_test@163.com']
title = 'reportname'
content = y+'预测报告请看附件'
file = os.path.join(dataset, 'reportname')
# file=os.path.join(dataset,'14-7-50--100-原油指标数据.xlsx-Brent连1合约价格--20240731175936-预测报告.pdf')
ssl = True
# 日志配置
# 创建日志目录(如果不存在)
log_dir = 'logs'
if not os.path.exists(log_dir):
os.makedirs(log_dir)
# 配置日志记录器
logger = logging.getLogger('my_logger')
logger.setLevel(logging.INFO)
# 配置文件处理器,将日志记录到文件
file_handler = logging.handlers.RotatingFileHandler(os.path.join(
log_dir, 'pricepredict.log'), maxBytes=1024 * 1024, backupCount=5)
file_handler.setFormatter(logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
# 配置控制台处理器,将日志打印到控制台
console_handler = logging.StreamHandler()
console_handler.setFormatter(logging.Formatter('%(message)s'))
# 将处理器添加到日志记录器
logger.addHandler(file_handler)
logger.addHandler(console_handler)
# logger.info('当前配置:'+settings)