From 38fbd7c810c5b01d06a7e02785a5aaac66e42d53 Mon Sep 17 00:00:00 2001 From: workpc Date: Fri, 21 Feb 2025 11:17:10 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9F=B3=E6=B2=B9=E8=8B=AF=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=8C=E8=81=9A=E7=83=AF=E7=83=83=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=EF=BC=8C=E8=81=9A=E7=83=AF=E7=83=83=E5=91=A8=E5=BA=A6?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=EF=BC=8C=E8=81=9A=E7=83=AF=E7=83=83=E4=B8=BB?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 6 +- aisenzhecode/石油苯/日度价格预测_最佳模型.pkl | Bin 0 -> 178996 bytes .../石油苯/纯苯价格预测-自定义日期ytj.ipynb | 604 ++++++++++++++++-- aisenzhecode/石油苯/纯苯数据项.xls | Bin 147968 -> 178688 bytes .../石油苯/纯苯数据项2025年2月18日备份.xls | Bin 0 -> 147968 bytes config_jingbo.py | 15 +- config_juxiting.py | 8 +- config_juxiting_zhoudu.py | 318 +++++++++ lib/dataread.py | 8 +- main_juxiting.py | 92 +-- main_juxiting_zhoudu.py | 301 +++++++++ main_yuanyou.py | 48 +- models/nerulforcastmodels.py | 11 +- 13 files changed, 1251 insertions(+), 160 deletions(-) create mode 100644 aisenzhecode/石油苯/日度价格预测_最佳模型.pkl create mode 100644 aisenzhecode/石油苯/纯苯数据项2025年2月18日备份.xls create mode 100644 config_juxiting_zhoudu.py create mode 100644 main_juxiting_zhoudu.py diff --git a/.gitignore b/.gitignore index d7dbb55..ef35b54 100644 --- a/.gitignore +++ b/.gitignore @@ -10,11 +10,7 @@ __pycache__/ # Distribution / packaging .Python build/ -dataset/ -yuanyoudataset/ -yuanyouzhoududataset/ -yuanyouyuedudataset/ -juxitingdataset/ +*dataset/ logs/ develop-eggs/ dist/ diff --git a/aisenzhecode/石油苯/日度价格预测_最佳模型.pkl b/aisenzhecode/石油苯/日度价格预测_最佳模型.pkl new file mode 100644 index 0000000000000000000000000000000000000000..06b4fce4c8e09f5f12621c6e63f1e47c450e8a60 GIT binary patch literal 178996 zcmeEv2S60Z_y3C65EW5uh+++P6brF%yL-2L2Pn1}O)P+b+(nvzB{nX`f{KcYMo}YC zqsEFIjdHtp#F$t@EYYY@qGE}O8e5Dl|M&Ko1C=FkpuaEvGy0g>nc3NyH#6@u@6GI< z-gc2qc}j8#4P!=zg#<=Nv<;684hi#*2?+}ciq%C%w1r?`bdWYF!CoD$3+^vnDBn+7 znAGBvq)AC`2^C_3BBON?p-FxTl|o`-b>V@rk!hU+3ASUEI0a;$$;WSB1KW4Np$H4Q519~~GQ0uhzQghUUIjM2qn zY6YpHA<=kWY;;J7e|Si&HZmA4%Y_DphX+EyAzT;XAEecV1^bT;(S>SbA+D;qCSkFG z{xPv3Q4mupX7uow!0@Ord_*-VgwM1T=MWSbW={7X{xLoYvQ^I;7Zx%mBn%>7$QS_~ zf`tPw`~$nA08~#E+!~2ECiYxlUqBx;ejzB{@6EobA@nSObm9CI_^dUtlS=Qj1GY|M?l{IuX9poCfH%0 zh5LuXWW>s7t0hz%K3WG&jEG5s#|K7)hQQ?VwehX&YcnIMUy{~dtMu*Q8{%sxUDX(x z2VwIa(rP<+dTj83qZm}q91KlDfC z;V@_YbrHcK5nfJn>1WmQEjdRl{6jlFf`?TyOFK-~R?$|K zvO4%_tNUpk{j_nWU>-%Y4{Im`Hv<>~Vu727^ ze%i)<+9sC1);9IiHuI%m1Zm&#)4KU-Tli^P`e|GFXmbUJ41!Lz}QQu=+C0C1sRrLPXw=` zYeb+f3}!2g8)@$QhenO|2S_35W!y<9N9yFJbR;Pia;9EBNiWE*+;mH!(oD@K-VtZ8 ze^f}czYYZ%f?htk@)K9N+1gJc6?6!V4h+_XM8x{%po)bxj-kWN=pq5EGz2YauL|Ql zWs{;Sp~S`_Vl0Ve+q=749!(x#mKQHR0EACu5FoE4hb^~P2o4z$2;z}EAus${GT8=> zj*TQaDvXXonH_COtt}xfKy*Z`4#c)r7ZV#EI5H%f+)z2^23SUn`q!H*O|gv#3=gqn zFK^}?DYAM@R7j9+gbsQwr*NJmIY=DNj{)T*=(H4>JJvwT2Wdn6Bcoz-6Wf#WUPb48 zGQEP<|CR?UnNOawA+dp$=*sSGp>HK;sf~F#V#$)*hP=xiOL8S?l{8it6GB=e2i2Ba zD3Y_hd2L}yC}XL^i%Tg>hWx5a)?=1TWjl20OrG#6R$H>!bhb?Q+*}0aExF2AGQG4A z%gte#`nik7+(gUmc@~kmsg_$`S^4GWvGAlSt`1|O!gR6zVUaPpvop7Y@?AVxO0scl zLD*ss>jzxB;Hq|nB||Rzb60`6iI%$NSrz7{T59?7g4B|w!srOyh{))0OC4fHhQJa9 z*UGv`ORh2XW*D}$Smr zM+X!tIjf)-rCRmikl~|4{bN3k2+~GJM(D=pnN}9A)HE*@VUh<+;>jNu)RsDw>)ff6 zM`szqBPZM@S@PG&!9{Mk9WIt;yg%G9VMvn9}x{JZ_s6; z14DD`m#6Dd{0D^v<~zVDV`9!C+43x#_Lk{pCt(MyU_ zYNa)M4x0GqSzlZ3$(;)?Eyyi7YM^crIXX6KbgYENC?yGpa+N|$_E&U6OJgdS*Qqi2 zjincX#Wp%TCd6`I?n5j?@5St|Jd#wes-%v=)PHF;NmbZYS&ioxIT40WV!P7o~tSQa}%!5-g;&4(rce?eJP

)Y13Ygy|OR)hCcb_ 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 z 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 tmB@?4HjP\n", "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", "Populating the interactive namespace from numpy and matplotlib\n", "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" @@ -749,11 +750,11 @@ "pylab import has clobbered these variables: ['datetime', '__version__', 'plot', 'random']\n", "`%matplotlib` prevents importing * from pylab and numpy\n", "\n", - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:233: UserWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:233: UserWarning:\n", "\n", "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", "\n", - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:263: FutureWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:263: FutureWarning:\n", "\n", "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", "\n" @@ -764,24 +765,25 @@ "output_type": "stream", "text": [ "Date\n", - "2024-10-17 7541.753418\n", + "2025-02-01 7738.433105\n", "Name: 日度预测价格, dtype: float32\n", - "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20241017', 'dataStatus': 'add', 'dataValue': 7541.75}]}\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20250201', 'dataStatus': 'add', 'dataValue': 7738.43}]}\n", "{\"confirmFlg\":false,\"status\":true}\n", - "20241018\n" + "20250202\n", + "{'dataDate': '20250202', 'dataItemNo': 'C01100047|TURNOVER'}\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:280: UserWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:280: UserWarning:\n", "\n", "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", "\n", "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", "\n", - "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.716e+05, tolerance: 3.895e+04\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.506e+05, tolerance: 4.089e+04\n", "\n" ] }, @@ -799,11 +801,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:233: UserWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:233: UserWarning:\n", "\n", "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", "\n", - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:263: FutureWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:263: FutureWarning:\n", "\n", "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", "\n" @@ -814,24 +816,25 @@ "output_type": "stream", "text": [ "Date\n", - "2024-10-18 7399.281738\n", + "2025-02-02 7700.021484\n", "Name: 日度预测价格, dtype: float32\n", - "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20241018', 'dataStatus': 'add', 'dataValue': 7399.28}]}\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20250202', 'dataStatus': 'add', 'dataValue': 7700.02}]}\n", "{\"confirmFlg\":false,\"status\":true}\n", - "20241019\n" + "20250203\n", + "{'dataDate': '20250203', 'dataItemNo': 'C01100047|TURNOVER'}\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:280: UserWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:280: UserWarning:\n", "\n", "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", "\n", "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", "\n", - "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.669e+05, tolerance: 3.913e+04\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.696e+05, tolerance: 4.096e+04\n", "\n" ] }, @@ -849,11 +852,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:233: UserWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:233: UserWarning:\n", "\n", "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", "\n", - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:263: FutureWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:263: FutureWarning:\n", "\n", "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", "\n" @@ -864,24 +867,25 @@ "output_type": "stream", "text": [ "Date\n", - "2024-10-19 7404.584473\n", + "2025-02-03 7693.463379\n", "Name: 日度预测价格, dtype: float32\n", - "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20241019', 'dataStatus': 'add', 'dataValue': 7404.58}]}\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20250203', 'dataStatus': 'add', 'dataValue': 7693.46}]}\n", "{\"confirmFlg\":false,\"status\":true}\n", - "20241020\n" + "20250204\n", + "{'dataDate': '20250204', 'dataItemNo': 'C01100047|TURNOVER'}\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:280: UserWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:280: UserWarning:\n", "\n", "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", "\n", "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", "\n", - "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.833e+05, tolerance: 3.773e+04\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.780e+05, tolerance: 4.200e+04\n", "\n" ] }, @@ -899,11 +903,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:233: UserWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:233: UserWarning:\n", "\n", "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", "\n", - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:263: FutureWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:263: FutureWarning:\n", "\n", "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", "\n" @@ -914,24 +918,25 @@ "output_type": "stream", "text": [ "Date\n", - "2024-10-20 7375.245605\n", + "2025-02-04 7798.116211\n", "Name: 日度预测价格, dtype: float32\n", - "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20241020', 'dataStatus': 'add', 'dataValue': 7375.25}]}\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20250204', 'dataStatus': 'add', 'dataValue': 7798.12}]}\n", "{\"confirmFlg\":false,\"status\":true}\n", - "20241021\n" + "20250205\n", + "{'dataDate': '20250205', 'dataItemNo': 'C01100047|TURNOVER'}\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:280: UserWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:280: UserWarning:\n", "\n", "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", "\n", "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", "\n", - "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.912e+05, tolerance: 3.684e+04\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.551e+05, tolerance: 4.144e+04\n", "\n" ] }, @@ -949,11 +954,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:233: UserWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:233: UserWarning:\n", "\n", "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", "\n", - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:263: FutureWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:263: FutureWarning:\n", "\n", "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", "\n" @@ -964,24 +969,24 @@ "output_type": "stream", "text": [ "Date\n", - "2024-10-21 7272.15332\n", + "2025-02-05 7865.974609\n", "Name: 日度预测价格, dtype: float32\n", - "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20241021', 'dataStatus': 'add', 'dataValue': 7272.15}]}\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20250205', 'dataStatus': 'add', 'dataValue': 7865.97}]}\n", "{\"confirmFlg\":false,\"status\":true}\n", - "20241022\n" + "20250206\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:280: UserWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:280: UserWarning:\n", "\n", "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", "\n", "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", "\n", - "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.991e+05, tolerance: 3.700e+04\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.553e+05, tolerance: 4.144e+04\n", "\n" ] }, @@ -999,11 +1004,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:233: UserWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:233: UserWarning:\n", "\n", "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", "\n", - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:263: FutureWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:263: FutureWarning:\n", "\n", "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", "\n" @@ -1014,24 +1019,24 @@ "output_type": "stream", "text": [ "Date\n", - "2024-10-22 7265.592773\n", + "2025-02-06 7896.265137\n", "Name: 日度预测价格, dtype: float32\n", - "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20241022', 'dataStatus': 'add', 'dataValue': 7265.59}]}\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20250206', 'dataStatus': 'add', 'dataValue': 7896.27}]}\n", "{\"confirmFlg\":false,\"status\":true}\n", - "20241023\n" + "20250207\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:280: UserWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:280: UserWarning:\n", "\n", "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", "\n", "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", "\n", - "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.866e+05, tolerance: 3.682e+04\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.955e+05, tolerance: 4.168e+04\n", "\n" ] }, @@ -1049,11 +1054,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:233: UserWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:233: UserWarning:\n", "\n", "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", "\n", - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:263: FutureWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:263: FutureWarning:\n", "\n", "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", "\n" @@ -1064,24 +1069,24 @@ "output_type": "stream", "text": [ "Date\n", - "2024-10-23 7314.694336\n", + "2025-02-07 7841.537109\n", "Name: 日度预测价格, dtype: float32\n", - "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20241023', 'dataStatus': 'add', 'dataValue': 7314.69}]}\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20250207', 'dataStatus': 'add', 'dataValue': 7841.54}]}\n", "{\"confirmFlg\":false,\"status\":true}\n", - "20241024\n" + "20250208\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:280: UserWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:280: UserWarning:\n", "\n", "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", "\n", "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", "\n", - "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.886e+05, tolerance: 3.690e+04\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.733e+05, tolerance: 4.197e+04\n", "\n" ] }, @@ -1099,11 +1104,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:233: UserWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:233: UserWarning:\n", "\n", "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", "\n", - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:263: FutureWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:263: FutureWarning:\n", "\n", "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", "\n" @@ -1114,24 +1119,24 @@ "output_type": "stream", "text": [ "Date\n", - "2024-10-24 7340.938477\n", + "2025-02-08 7814.474609\n", "Name: 日度预测价格, dtype: float32\n", - "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20241024', 'dataStatus': 'add', 'dataValue': 7340.94}]}\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20250208', 'dataStatus': 'add', 'dataValue': 7814.47}]}\n", "{\"confirmFlg\":false,\"status\":true}\n", - "20241025\n" + "20250209\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:280: UserWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:280: UserWarning:\n", "\n", "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", "\n", "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", "\n", - "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 4.843e+05, tolerance: 3.691e+04\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.675e+05, tolerance: 4.062e+04\n", "\n" ] }, @@ -1149,11 +1154,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:233: UserWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:233: UserWarning:\n", "\n", "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", "\n", - "C:\\Users\\Hello\\AppData\\Local\\Temp\\ipykernel_13372\\3095856616.py:263: FutureWarning:\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:263: FutureWarning:\n", "\n", "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", "\n" @@ -1164,9 +1169,463 @@ "output_type": "stream", "text": [ "Date\n", - "2024-10-25 7299.914062\n", + "2025-02-09 7832.284668\n", "Name: 日度预测价格, dtype: float32\n", - "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20241025', 'dataStatus': 'add', 'dataValue': 7299.91}]}\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20250209', 'dataStatus': 'add', 'dataValue': 7832.28}]}\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20250210\n", + "{'dataDate': '20250210', 'dataItemNo': 'C01100047|TURNOVER'}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:280: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.531e+05, tolerance: 4.103e+04\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:233: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:263: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2025-02-10 7917.837891\n", + "Name: 日度预测价格, dtype: float32\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20250210', 'dataStatus': 'add', 'dataValue': 7917.84}]}\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20250211\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:280: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.307e+05, tolerance: 4.073e+04\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:233: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:263: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2025-02-11 7919.563965\n", + "Name: 日度预测价格, dtype: float32\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20250211', 'dataStatus': 'add', 'dataValue': 7919.56}]}\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20250212\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:280: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.644e+05, tolerance: 4.133e+04\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:233: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:263: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2025-02-12 7902.145508\n", + "Name: 日度预测价格, dtype: float32\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20250212', 'dataStatus': 'add', 'dataValue': 7902.15}]}\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20250213\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:280: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.711e+05, tolerance: 4.105e+04\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:233: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:263: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2025-02-13 8001.087891\n", + "Name: 日度预测价格, dtype: float32\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20250213', 'dataStatus': 'add', 'dataValue': 8001.09}]}\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20250214\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:280: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.949e+05, tolerance: 4.129e+04\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:233: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:263: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2025-02-14 8032.705566\n", + "Name: 日度预测价格, dtype: float32\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20250214', 'dataStatus': 'add', 'dataValue': 8032.71}]}\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20250215\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:280: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.966e+05, tolerance: 4.129e+04\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:233: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:263: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2025-02-15 8040.26709\n", + "Name: 日度预测价格, dtype: float32\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20250215', 'dataStatus': 'add', 'dataValue': 8040.27}]}\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20250216\n", + "{'dataDate': '20250216', 'dataItemNo': 'C01100047|TURNOVER'}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:280: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.442e+05, tolerance: 4.138e+04\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:233: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:263: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2025-02-16 8044.537109\n", + "Name: 日度预测价格, dtype: float32\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20250216', 'dataStatus': 'add', 'dataValue': 8044.54}]}\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20250217\n", + "{'dataDate': '20250217', 'dataItemNo': 'C01100047|TURNOVER'}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:280: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.555e+05, tolerance: 4.072e+04\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:233: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:263: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2025-02-17 7998.32373\n", + "Name: 日度预测价格, dtype: float32\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20250217', 'dataStatus': 'add', 'dataValue': 7998.32}]}\n", + "{\"confirmFlg\":false,\"status\":true}\n", + "20250218\n", + "{'dataDate': '20250218', 'dataItemNo': 'C01100047|TURNOVER'}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:280: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "d:\\ProgramData\\anaconda3\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning:\n", + "\n", + "Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.680e+05, tolerance: 4.121e+04\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using matplotlib backend: QtAgg\n", + "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n", + "Populating the interactive namespace from numpy and matplotlib\n", + "Fitting 3 folds for each of 180 candidates, totalling 540 fits\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:233: UserWarning:\n", + "\n", + "The argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.\n", + "\n", + "C:\\Users\\EDY\\AppData\\Local\\Temp\\ipykernel_21000\\3095856616.py:263: FutureWarning:\n", + "\n", + "Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\n", + "2025-02-18 7988.078125\n", + "Name: 日度预测价格, dtype: float32\n", + "{'funcModule': '数据表信息列表', 'funcOperation': '新增', 'data': [{'dataItemNo': 'C01100047|FORECAST_PRICE', 'dataDate': '20250218', 'dataStatus': 'add', 'dataValue': 7988.08}]}\n", "{\"confirmFlg\":false,\"status\":true}\n" ] } @@ -1174,16 +1633,23 @@ "source": [ "from datetime import datetime, timedelta\n", "\n", - "start_date = datetime(2024, 10, 17)\n", - "end_date = datetime(2024, 10, 26)\n", + "start_date = datetime(2025, 2, 1)\n", + "end_date = datetime(2025, 2, 19)\n", "\n", "while start_date < end_date:\n", " print(start_date.strftime('%Y%m%d'))\n", " start(start_date)\n", - " # time.sleep(1)\n", + " # time.sleep(2)\n", " # start_1(start_date)\n", " start_date += timedelta(days=1)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/aisenzhecode/石油苯/纯苯数据项.xls b/aisenzhecode/石油苯/纯苯数据项.xls index 5c50fdfa9794f3c5e26d8e166701d26b57b769ae..076c47f3b5dc6148d233b3281789902644e1791b 100644 GIT binary patch delta 47988 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 delta 19792 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 F{SO2%IH3Rl diff --git a/aisenzhecode/石油苯/纯苯数据项2025年2月18日备份.xls b/aisenzhecode/石油苯/纯苯数据项2025年2月18日备份.xls new file mode 100644 index 0000000000000000000000000000000000000000..744b9689c905ad8731e06b1af884d4ce7793ddff GIT binary patch literal 147968 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 literal 0 HcmV?d00001 diff --git a/config_jingbo.py b/config_jingbo.py index e7ba947..e6038ad 100644 --- a/config_jingbo.py +++ b/config_jingbo.py @@ -95,9 +95,9 @@ ClassifyId = 1214 server_host = '192.168.100.53' 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" +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" # 查询数据项编码 login_data = { "data": { @@ -162,8 +162,8 @@ table_name = 'v_tbl_crude_oil_warning' ### 开关 is_train = False # 是否训练 -is_debug = False # 是否调试 -is_eta = True # 是否使用eta接口 +is_debug = True # 是否调试 +is_eta = False # 是否使用eta接口 is_market = True # 是否通过市场信息平台获取特征 ,在is_eta 为true 的情况下生效 is_timefurture = True # 是否使用时间特征 is_fivemodels = False # 是否使用之前保存的最佳的5个模型 @@ -185,7 +185,7 @@ print("数据库连接成功",host,dbname,dbusername) # 数据截取日期 start_year = 2020 # 数据开始年份 -end_time = '' # 数据截取日期 +end_time = '' # 数据截取日期 格式为 2024-01-01 freq = 'B' # 时间频率,"D": 天 "W": 周"M": 月"Q": 季度"A": 年 "H": 小时 "T": 分钟 "S": 秒 "B": 工作日 delweekenday = True if freq == 'B' else False # 是否删除周末数据 is_corr = False # 特征是否参与滞后领先提升相关系数 @@ -194,7 +194,8 @@ if add_kdj and is_edbnamelist: edbnamelist = edbnamelist+['K','D','J'] ### 模型参数 -y = 'Brent连1合约价格' # 原油指标数据的目标变量 Brent连1合约价格 Brent活跃合约 +y = 'Brent连1合约价格' # 原油指标数据的目标变量 Brent连1合约价格 Brent活跃合约 +# y = 'Brent连1合约价格' # 原油指标数据的目标变量 Brent连1合约价格 Brent活跃合约 horizon =5 # 预测的步长 input_size = 40 # 输入序列长度 train_steps = 50 if is_debug else 1000 # 训练步数,用来限定epoch次数 diff --git a/config_juxiting.py b/config_juxiting.py index 503eaed..a08c9f5 100644 --- a/config_juxiting.py +++ b/config_juxiting.py @@ -157,6 +157,7 @@ upload_data = { "funcModule":'研究报告信息', "funcOperation":'上传聚烯烃PP价格预测报告', "data":{ + "groupNo": "000127", "ownerAccount":'arui', #报告所属用户账号 "reportType":'OIL_PRICE_FORECAST', # 报告类型,固定为OIL_PRICE_FORECAST "fileName": '2000-40-5-50--100-原油指标数据.xlsx-Brent活跃合约--2024-09-06-15-01-29-预测报告.pdf', #文件名称 @@ -174,6 +175,7 @@ warning_data = { "funcModule":'原油特征停更预警', "funcOperation":'原油特征停更预警', "data":{ + "groupNo": "000127", 'WARNING_TYPE_NAME':'特征数据停更预警', 'WARNING_CONTENT':'', 'WARNING_DATE':'' @@ -202,16 +204,16 @@ table_name = 'v_tbl_crude_oil_warning' ### 开关 is_train = False # 是否训练 -is_debug = False # 是否调试 +is_debug = True # 是否调试 is_eta = False # 是否使用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 = True # 预测结果上传到eta +is_update_eta = False # 预测结果上传到eta is_update_report = True # 是否上传报告 -is_update_warning_data = False # 是否上传预警数据 +is_update_warning_data = True # 是否上传预警数据 is_del_corr = 0.6 # 是否删除相关性高的特征,取值为 0-1 ,0 为不删除,0.6 表示删除相关性小于0.6的特征 is_del_tow_month = True # 是否删除两个月不更新的特征 diff --git a/config_juxiting_zhoudu.py b/config_juxiting_zhoudu.py new file mode 100644 index 0000000..8cfc725 --- /dev/null +++ b/config_juxiting_zhoudu.py @@ -0,0 +1,318 @@ +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' +edbcodelist = ['ID01385938','lmcads03 lme comdty', +'GC1 COMB Comdty', +'C2404171822', +'dxy curncy', +'S5443199 ', +'S5479800', +'S5443108', +'H7358586', +'LC3FM1 INDEX', +'CNY REGN Curncy', +'s0105897', +'M0067419', +'M0066351', +'S0266372', +'S0266438', +'S0266506', +'ID01384463'] + +# 临时写死用指定的列,与上面的edbcode对应,后面更改 +edbnamelist = [ + 'ds','y', + 'LME铜价', + '黄金连1合约', + 'Brent-WTI', + '美元指数', + '甲醇鲁南价格', + '甲醇太仓港口价格', + '山东丙烯主流价', + '丙烷(山东)', + 'FEI丙烷 M1', + '在岸人民币汇率', + '南华工业品指数', + 'PVC期货主力', + 'PE期货收盘价', +'PP连续-1月', +'PP连续-5月', +'PP连续-9月', +'PP:拉丝:L5E89:出厂价:华北(第二区域):内蒙古久泰新材料(日)' + ] + +edbcodenamedict = { +'ID01385938':'PP:拉丝:1102K:市场价:青州:国家能源宁煤(日)', +'ID01384463':'PP:拉丝:L5E89:出厂价:华北(第二区域):内蒙古久泰新材料(日)', +'lmcads03 lme comdty':'LME铜价', +'GC1 COMB Comdty':'黄金连1合约', +'C2404171822':'Brent-WTI', +'dxy curncy':'美元指数', +'S5443199 ':'甲醇鲁南价格', +'S5479800':'甲醇太仓港口价格', +'S5443108':'山东丙烯主流价', +'H7358586':'丙烷(山东)', +'LC3FM1 INDEX':'FEI丙烷 M1', +'CNY REGN Curncy':'在岸人民币汇率', +'s0105897':'南华工业品指数', +'M0067419':'PVC期货主力', +'M0066351':'PE期货收盘价', +'S0266372':'PP连续-1月', +'S0266438':'PP连续-5月', +'S0266506':'PP连续-9月', + +} + +# eta自有数据指标编码 +modelsindex = { + 'NHITS': 'SELF0000077', + 'Informer':'SELF0000078', + 'LSTM':'SELF0000079', + 'iTransformer':'SELF0000080', + 'TSMixer':'SELF0000081', + 'TSMixerx':'SELF0000082', + 'PatchTST':'SELF0000083', + 'RNN':'SELF0000084', + 'GRU':'SELF0000085', + 'TCN':'SELF0000086', + 'BiTCN':'SELF0000087', + 'DilatedRNN':'SELF0000088', + 'MLP':'SELF0000089', + 'DLinear':'SELF0000090', + 'NLinear':'SELF0000091', + 'TFT':'SELF0000092', + 'FEDformer':'SELF0000093', + 'StemGNN':'SELF0000094', + 'MLPMultivariate':'SELF0000095', + 'TiDE':'SELF0000096', + 'DeepNPTS':'SELF0000097' + } + + + +# eta 上传预测结果的请求体,后面发起请求的时候更改 model datalist 数据 +data = { + "IndexCode": "", + "IndexName": "价格预测模型", + "Unit": "无", + "Frequency": "日度", + "SourceName": f"价格预测", + "Remark": 'ddd', + "DataList": [ + { + "Date": "2024-05-02", + "Value": 333444 + } + ] + } + +# eta 分类 +# level:3才可以获取到数据,所以需要人工把能源化工下所有的level3级都找到 + # url = 'http://10.189.2.78:8108/v1/edb/list?ClassifyId=1214' + #ParentId ":1160, 能源化工 + # ClassifyId ":1214,原油 + #ParentId ":1214,",就是原油下所有的数据。 +ClassifyId = 1161 + + + +############################################################################################################### 变量定义--测试环境 +server_host = '192.168.100.53' + +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" + +login_data = { + "data": { + "account": "api_test", + # "password": "MmVmNzNlOWI0MmY0ZDdjZGUwNzE3ZjFiMDJiZDZjZWU=", # Shihua@123456 + "password": "ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U=", # 123456 + "tenantHashCode": "8a4577dbd919675758d57999a1e891fe", + "terminal": "API" + }, + "funcModule": "API", + "funcOperation": "获取token" +} + +upload_data = { + "funcModule":'研究报告信息', + "funcOperation":'上传聚烯烃PP价格预测报告', + "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":'JXTJGYCBG', #分析报告分类编码 + "reportEmployeeCode":"E40116", # 报告人 + "reportDeptCode" :"D0044" ,# 报告部门 + "productGroupCode":"RAW_MATERIAL" # 商品分类 + } +} + + +warning_data = { + "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最低价和最高价 + } +} + + +# 北京环境数据库 +host = '192.168.101.27' +port = 3306 +dbusername ='root' +password = '123456' +dbname = 'jingbo_test' +table_name = 'v_tbl_crude_oil_warning' + + +### 开关 +is_train = False # 是否训练 +is_debug = False # 是否调试 +is_eta = False # 是否使用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 = True # 预测结果上传到eta +is_update_report = True # 是否上传报告 +is_update_warning_data = False # 是否上传预警数据 +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 = '2025-01-27' # 数据截取日期 +freq = 'W' # 时间频率,"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 = 'AVG-金能大唐久泰青州' +avg_cols = [ + 'PP:拉丝:1102K:出厂价:青州:国家能源宁煤(日)', + 'PP:拉丝:L5E89:出厂价:华北(第二区域):内蒙古久泰新材料(日)', + 'PP:拉丝:L5E89:出厂价:河北、鲁北:大唐内蒙多伦(日)', + 'PP:拉丝:HP550J:市场价:青岛:金能化学(日)' +] +offsite = 80 +offsite_col = ['PP:拉丝:HP550J:市场价:青岛:金能化学(日)'] +horizon =1 # 预测的步长 +input_size = 7 # 输入序列长度 +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 = 'PP指标数据.xlsx' # 数据集文件 +dataset = 'juxitingzhududataset' # 数据集文件夹 + +# 数据库名称 +db_name = os.path.join(dataset,'jbsh_juxiting.db') +sqlitedb = SQLiteHandler(db_name) +sqlitedb.connect() + +settings = f'{input_size}-{horizon}-{train_steps}--{k}-{data_set}-{y}' +# 获取日期时间 +# now = datetime.datetime.now().strftime('%Y%m%d%H%M%S') # 获取当前日期时间 +now = datetime.datetime.now().strftime('%Y-%m-%d') # 获取当前日期时间 +reportname = f'PP大模型预测报告--{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) + diff --git a/lib/dataread.py b/lib/dataread.py index 44b430a..2d4f838 100644 --- a/lib/dataread.py +++ b/lib/dataread.py @@ -44,8 +44,9 @@ plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 # from config_jingbo import * # from config_jingbo_zhoudu import * # from config_yongan import * -# from config_juxiting import * -from config_juxiting_pro import * +from config_juxiting import * +# from config_juxiting_zhoudu import * +# from config_juxiting_pro import * @@ -259,12 +260,13 @@ def upload_warning_info(df_count): try: # 获取当前日期 warning_date = datetime.datetime.now().strftime('%Y-%m-%d') + warning_date2 = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 构建预警内容 content = f'{warning_date}有{df_count}个停更' # 更新预警数据中的日期和内容 - warning_data['data']['WARNING_DATE'] = warning_date + warning_data['data']['WARNING_DATE'] = warning_date2 warning_data['data']['WARNING_CONTENT'] = content # 调用 upload_warning_data 函数上传预警数据 diff --git a/main_juxiting.py b/main_juxiting.py index 7b3a525..f7563d2 100644 --- a/main_juxiting.py +++ b/main_juxiting.py @@ -188,33 +188,35 @@ def predict_main(): sqlitedb.insert_data('most_model', (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), most_common_model,), columns=('ds', 'most_common_model',)) try: - if is_weekday: - # if True: - logger.info('今天是周一,发送特征预警') - # 上传预警信息到数据库 - warning_data_df = df_zhibiaoliebiao.copy() - warning_data_df = warning_data_df[warning_data_df['停更周期']> 3 ][['指标名称', '指标id', '频度','更新周期','指标来源','最后更新时间','停更周期']] - # 重命名列名 - warning_data_df = warning_data_df.rename(columns={'指标名称': 'INDICATOR_NAME', '指标id': 'INDICATOR_ID', '频度': 'FREQUENCY', '更新周期': 'UPDATE_FREQUENCY', '指标来源': 'DATA_SOURCE', '最后更新时间': 'LAST_UPDATE_DATE', '停更周期': 'UPDATE_SUSPENSION_CYCLE'}) - from sqlalchemy import create_engine - import urllib - global password - if '@' in password: - password = urllib.parse.quote_plus(password) + # if is_weekday: + if True: + # logger.info('今天是周一,发送特征预警') + # # 上传预警信息到数据库 + # warning_data_df = df_zhibiaoliebiao.copy() + # warning_data_df = warning_data_df[warning_data_df['停更周期']> 3 ][['指标名称', '指标id', '频度','更新周期','指标来源','最后更新时间','停更周期']] + # # 重命名列名 + # warning_data_df = warning_data_df.rename(columns={'指标名称': 'INDICATOR_NAME', '指标id': 'INDICATOR_ID', '频度': 'FREQUENCY', '更新周期': 'UPDATE_FREQUENCY', '指标来源': 'DATA_SOURCE', '最后更新时间': 'LAST_UPDATE_DATE', '停更周期': 'UPDATE_SUSPENSION_CYCLE'}) + # from sqlalchemy import create_engine + # import urllib + # global password + # if '@' in password: + # password = urllib.parse.quote_plus(password) - engine = create_engine(f'mysql+pymysql://{dbusername}:{password}@{host}:{port}/{dbname}') - warning_data_df['WARNING_DATE'] = datetime.date.today().strftime("%Y-%m-%d %H:%M:%S") - warning_data_df['TENANT_CODE'] = 'T0004' - # 插入数据之前查询表数据然后新增id列 - existing_data = pd.read_sql(f"SELECT * FROM {table_name}", engine) - if not existing_data.empty: - max_id = existing_data['ID'].astype(int).max() - warning_data_df['ID'] = range(max_id + 1, max_id + 1 + len(warning_data_df)) - else: - warning_data_df['ID'] = range(1, 1 + len(warning_data_df)) - warning_data_df.to_sql(table_name, con=engine, if_exists='append', index=False) + # engine = create_engine(f'mysql+pymysql://{dbusername}:{password}@{host}:{port}/{dbname}') + # warning_data_df['WARNING_DATE'] = datetime.date.today().strftime("%Y-%m-%d %H:%M:%S") + # warning_data_df['TENANT_CODE'] = 'T0004' + # # 插入数据之前查询表数据然后新增id列 + # existing_data = pd.read_sql(f"SELECT * FROM {table_name}", engine) + # if not existing_data.empty: + # max_id = existing_data['ID'].astype(int).max() + # warning_data_df['ID'] = range(max_id + 1, max_id + 1 + len(warning_data_df)) + # else: + # warning_data_df['ID'] = range(1, 1 + len(warning_data_df)) + # warning_data_df.to_sql(table_name, con=engine, if_exists='append', index=False) + # if is_update_warning_data: + # upload_warning_info(len(warning_data_df)) if is_update_warning_data: - upload_warning_info(len(warning_data_df)) + upload_warning_info(10) except: logger.info('上传预警信息到数据库失败') @@ -226,26 +228,26 @@ def predict_main(): row, col = df.shape now = datetime.datetime.now().strftime('%Y%m%d%H%M%S') - ex_Model_Juxiting(df, - horizon=horizon, - input_size=input_size, - train_steps=train_steps, - val_check_steps=val_check_steps, - early_stop_patience_steps=early_stop_patience_steps, - is_debug=is_debug, - dataset=dataset, - is_train=is_train, - is_fivemodels=is_fivemodels, - val_size=val_size, - test_size=test_size, - settings=settings, - now=now, - etadata=etadata, - modelsindex=modelsindex, - data=data, - is_eta=is_eta, - end_time=end_time, - ) + # ex_Model_Juxiting(df, + # horizon=horizon, + # input_size=input_size, + # train_steps=train_steps, + # val_check_steps=val_check_steps, + # early_stop_patience_steps=early_stop_patience_steps, + # is_debug=is_debug, + # dataset=dataset, + # is_train=is_train, + # is_fivemodels=is_fivemodels, + # val_size=val_size, + # test_size=test_size, + # settings=settings, + # now=now, + # etadata=etadata, + # modelsindex=modelsindex, + # data=data, + # is_eta=is_eta, + # end_time=end_time, + # ) logger.info('模型训练完成') diff --git a/main_juxiting_zhoudu.py b/main_juxiting_zhoudu.py new file mode 100644 index 0000000..7b3a525 --- /dev/null +++ b/main_juxiting_zhoudu.py @@ -0,0 +1,301 @@ +# 读取配置 +from lib.dataread import * +from lib.tools import SendMail,exception_logger +from models.nerulforcastmodels import ex_Model_Juxiting,model_losss,model_losss_juxiting,brent_export_pdf,tansuanli_export_pdf,pp_export_pdf,model_losss_juxiting + +import glob +import torch +torch.set_float32_matmul_precision("high") + + + +def predict_main(): + """ + 主预测函数,用于从 ETA 获取数据、处理数据、训练模型并进行预测。 + + 参数: + signature (BinanceAPI): Binance API 实例。 + etadata (EtaReader): ETA 数据读取器实例。 + is_eta (bool): 是否从 ETA 获取数据。 + data_set (str): 数据集名称。 + dataset (str): 数据集路径。 + add_kdj (bool): 是否添加 KDJ 指标。 + is_timefurture (bool): 是否添加时间衍生特征。 + end_time (str): 结束时间。 + is_edbnamelist (bool): 是否使用 EDB 名称列表。 + edbnamelist (list): EDB 名称列表。 + y (str): 预测目标列名。 + sqlitedb (SQLiteDB): SQLite 数据库实例。 + is_corr (bool): 是否进行相关性分析。 + horizon (int): 预测时域。 + input_size (int): 输入数据大小。 + train_steps (int): 训练步数。 + val_check_steps (int): 验证检查步数。 + early_stop_patience_steps (int): 早停耐心步数。 + is_debug (bool): 是否调试模式。 + dataset (str): 数据集名称。 + is_train (bool): 是否训练模型。 + is_fivemodels (bool): 是否使用五个模型。 + val_size (float): 验证集大小。 + test_size (float): 测试集大小。 + settings (dict): 模型设置。 + now (str): 当前时间。 + etadata (EtaReader): ETA 数据读取器实例。 + modelsindex (list): 模型索引列表。 + data (str): 数据类型。 + is_eta (bool): 是否从 ETA 获取数据。 + + 返回: + None + """ + global end_time + signature = BinanceAPI(APPID, SECRET) + etadata = EtaReader(signature=signature, + classifylisturl=classifylisturl, + classifyidlisturl=classifyidlisturl, + edbcodedataurl=edbcodedataurl, + edbcodelist=edbcodelist, + edbdatapushurl=edbdatapushurl, + edbdeleteurl=edbdeleteurl, + edbbusinessurl=edbbusinessurl + ) + # 获取数据 + if is_eta: + logger.info('从eta获取数据...') + signature = BinanceAPI(APPID, SECRET) + etadata = EtaReader(signature=signature, + classifylisturl=classifylisturl, + classifyidlisturl=classifyidlisturl, + edbcodedataurl=edbcodedataurl, + edbcodelist=edbcodelist, + edbdatapushurl=edbdatapushurl, + edbdeleteurl=edbdeleteurl, + edbbusinessurl=edbbusinessurl, + ) + df_zhibiaoshuju, df_zhibiaoliebiao = etadata.get_eta_api_pp_data(data_set=data_set, dataset=dataset) # 原始数据,未处理 + + if is_market: + logger.info('从市场信息平台获取数据...') + try: + # 如果是测试环境,最高价最低价取excel文档 + if server_host == '192.168.100.53': + logger.info('从excel文档获取最高价最低价') + df_zhibiaoshuju = get_high_low_data(df_zhibiaoshuju) + else: + logger.info('从市场信息平台获取数据') + df_zhibiaoshuju = get_market_data(end_time,df_zhibiaoshuju) + + except : + logger.info('最高最低价拼接失败') + + # 保存到xlsx文件的sheet表 + with pd.ExcelWriter(os.path.join(dataset,data_set)) as file: + df_zhibiaoshuju.to_excel(file, sheet_name='指标数据', index=False) + df_zhibiaoliebiao.to_excel(file, sheet_name='指标列表', index=False) + + + # 数据处理 + df = datachuli_juxiting(df_zhibiaoshuju, df_zhibiaoliebiao, y=y, dataset=dataset, add_kdj=add_kdj, is_timefurture=is_timefurture, + end_time=end_time) + + else: + # 读取数据 + logger.info('读取本地数据:' + os.path.join(dataset, data_set)) + df,df_zhibiaoliebiao = getdata_juxiting(filename=os.path.join(dataset, data_set), y=y, dataset=dataset, add_kdj=add_kdj, + is_timefurture=is_timefurture, end_time=end_time) # 原始数据,未处理 + + # 更改预测列名称 + df.rename(columns={y: 'y'}, inplace=True) + + if is_edbnamelist: + df = df[edbnamelist] + df.to_csv(os.path.join(dataset, '指标数据.csv'), index=False) + # 保存最新日期的y值到数据库 + # 取第一行数据存储到数据库中 + first_row = df[['ds', 'y']].tail(1) + # 判断y的类型是否为float + if not isinstance(first_row['y'].values[0], float): + logger.info(f'{end_time}预测目标数据为空,跳过') + return None + + # 将最新真实值保存到数据库 + if not sqlitedb.check_table_exists('trueandpredict'): + first_row.to_sql('trueandpredict', sqlitedb.connection, index=False) + else: + for row in first_row.itertuples(index=False): + row_dict = row._asdict() + row_dict['ds'] = row_dict['ds'].strftime('%Y-%m-%d %H:%M:%S') + 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=row_dict.keys()) + + # 更新accuracy表的y值 + if not sqlitedb.check_table_exists('accuracy'): + pass + else: + update_y = sqlitedb.select_data('accuracy',where_condition="y is null") + if len(update_y) > 0: + logger.info('更新accuracy表的y值') + # 找到update_y 中ds且df中的y的行 + update_y = update_y[update_y['ds']<=end_time] + logger.info(f'要更新y的信息:{update_y}') + # try: + for row in update_y.itertuples(index=False): + try: + row_dict = row._asdict() + yy = df[df['ds']==row_dict['ds']]['y'].values[0] + LOW = df[df['ds']==row_dict['ds']]['Brentzdj'].values[0] + HIGH = df[df['ds']==row_dict['ds']]['Brentzgj'].values[0] + sqlitedb.update_data('accuracy', f"y = {yy},LOW_PRICE = {LOW},HIGH_PRICE = {HIGH}", where_condition=f"ds = '{row_dict['ds']}'") + except: + logger.info(f'更新accuracy表的y值失败:{row_dict}') + # except Exception as e: + # logger.info(f'更新accuracy表的y值失败:{e}') + + import datetime + # 判断当前日期是不是周一 + is_weekday = datetime.datetime.now().weekday() == 0 + if is_weekday: + logger.info('今天是周一,更新预测模型') + # 计算最近60天预测残差最低的模型名称 + model_results = sqlitedb.select_data('trueandpredict', order_by="ds DESC", limit="60") + # 删除空值率为90%以上的列 + if len(model_results) > 10: + model_results = model_results.dropna(thresh=len(model_results)*0.1,axis=1) + # 删除空行 + model_results = model_results.dropna() + modelnames = model_results.columns.to_list()[2:-1] + for col in model_results[modelnames].select_dtypes(include=['object']).columns: + model_results[col] = model_results[col].astype(np.float32) + # 计算每个预测值与真实值之间的偏差率 + for model in modelnames: + model_results[f'{model}_abs_error_rate'] = abs(model_results['y'] - model_results[model]) / model_results['y'] + # 获取每行对应的最小偏差率值 + min_abs_error_rate_values = model_results.apply(lambda row: row[[f'{model}_abs_error_rate' for model in modelnames]].min(), axis=1) + # 获取每行对应的最小偏差率值对应的列名 + min_abs_error_rate_column_name = model_results.apply(lambda row: row[[f'{model}_abs_error_rate' for model in modelnames]].idxmin(), axis=1) + # 将列名索引转换为列名 + min_abs_error_rate_column_name = min_abs_error_rate_column_name.map(lambda x: x.split('_')[0]) + # 取出现次数最多的模型名称 + most_common_model = min_abs_error_rate_column_name.value_counts().idxmax() + logger.info(f"最近60天预测残差最低的模型名称:{most_common_model}") + # 保存结果到数据库 + if not sqlitedb.check_table_exists('most_model'): + sqlitedb.create_table('most_model', columns="ds datetime, most_common_model TEXT") + sqlitedb.insert_data('most_model', (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), most_common_model,), columns=('ds', 'most_common_model',)) + + try: + if is_weekday: + # if True: + logger.info('今天是周一,发送特征预警') + # 上传预警信息到数据库 + warning_data_df = df_zhibiaoliebiao.copy() + warning_data_df = warning_data_df[warning_data_df['停更周期']> 3 ][['指标名称', '指标id', '频度','更新周期','指标来源','最后更新时间','停更周期']] + # 重命名列名 + warning_data_df = warning_data_df.rename(columns={'指标名称': 'INDICATOR_NAME', '指标id': 'INDICATOR_ID', '频度': 'FREQUENCY', '更新周期': 'UPDATE_FREQUENCY', '指标来源': 'DATA_SOURCE', '最后更新时间': 'LAST_UPDATE_DATE', '停更周期': 'UPDATE_SUSPENSION_CYCLE'}) + from sqlalchemy import create_engine + import urllib + global password + if '@' in password: + password = urllib.parse.quote_plus(password) + + engine = create_engine(f'mysql+pymysql://{dbusername}:{password}@{host}:{port}/{dbname}') + warning_data_df['WARNING_DATE'] = datetime.date.today().strftime("%Y-%m-%d %H:%M:%S") + warning_data_df['TENANT_CODE'] = 'T0004' + # 插入数据之前查询表数据然后新增id列 + existing_data = pd.read_sql(f"SELECT * FROM {table_name}", engine) + if not existing_data.empty: + max_id = existing_data['ID'].astype(int).max() + warning_data_df['ID'] = range(max_id + 1, max_id + 1 + len(warning_data_df)) + else: + warning_data_df['ID'] = range(1, 1 + len(warning_data_df)) + warning_data_df.to_sql(table_name, con=engine, if_exists='append', index=False) + if is_update_warning_data: + upload_warning_info(len(warning_data_df)) + except: + logger.info('上传预警信息到数据库失败') + + if is_corr: + df = corr_feature(df=df) + + df1 = df.copy() # 备份一下,后面特征筛选完之后加入ds y 列用 + logger.info(f"开始训练模型...") + row, col = df.shape + + now = datetime.datetime.now().strftime('%Y%m%d%H%M%S') + ex_Model_Juxiting(df, + horizon=horizon, + input_size=input_size, + train_steps=train_steps, + val_check_steps=val_check_steps, + early_stop_patience_steps=early_stop_patience_steps, + is_debug=is_debug, + dataset=dataset, + is_train=is_train, + is_fivemodels=is_fivemodels, + val_size=val_size, + test_size=test_size, + settings=settings, + now=now, + etadata=etadata, + modelsindex=modelsindex, + data=data, + is_eta=is_eta, + end_time=end_time, + ) + + + logger.info('模型训练完成') + + logger.info('训练数据绘图ing') + model_results3 = model_losss_juxiting(sqlitedb) + logger.info('训练数据绘图end') + + # 模型报告 + logger.info('制作报告ing') + title = f'{settings}--{end_time}-预测报告' # 报告标题 + reportname = f'PP大模型预测报告--{end_time}.pdf' # 报告文件名 + reportname = reportname.replace(':', '-') # 替换冒号 + pp_export_pdf(dataset=dataset,num_models = 5 if is_fivemodels else 22,time=end_time, + reportname=reportname,sqlitedb=sqlitedb), + + logger.info('制作报告end') + logger.info('模型训练完成') + + # # LSTM 单变量模型 + # ex_Lstm(df,input_seq_len=input_size,output_seq_len=horizon,is_debug=is_debug,dataset=dataset) + + # # lstm 多变量模型 + # ex_Lstm_M(df,n_days=input_size,out_days=horizon,is_debug=is_debug,datasetpath=dataset) + + # # GRU 模型 + # # ex_GRU(df) + + # 发送邮件 + m = SendMail( + username=username, + passwd=passwd, + recv=recv, + title=title, + content=content, + file=max(glob.glob(os.path.join(dataset,'*.pdf')), key=os.path.getctime), + ssl=ssl, + ) + # m.send_mail() + + +if __name__ == '__main__': + # global end_time + # is_on = True + # # 遍历2024-11-25 到 2024-12-3 之间的工作日日期 + # for i_time in pd.date_range('2025-1-20', '2025-2-6', freq='B'): + # end_time = i_time.strftime('%Y-%m-%d') + # try: + # predict_main() + # except: + # pass + + predict_main() \ No newline at end of file diff --git a/main_yuanyou.py b/main_yuanyou.py index 5c754dd..d24d65d 100644 --- a/main_yuanyou.py +++ b/main_yuanyou.py @@ -186,6 +186,8 @@ def predict_main(): if not sqlitedb.check_table_exists('most_model'): sqlitedb.create_table('most_model', columns="ds datetime, most_common_model TEXT") sqlitedb.insert_data('most_model', (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), most_common_model,), columns=('ds', 'most_common_model',)) + if is_update_warning_data: + upload_warning_info(len(warning_data_df)) try: if is_weekday: @@ -229,32 +231,32 @@ def predict_main(): row, col = df.shape now = datetime.datetime.now().strftime('%Y%m%d%H%M%S') - # ex_Model(df, - # horizon=horizon, - # input_size=input_size, - # train_steps=train_steps, - # val_check_steps=val_check_steps, - # early_stop_patience_steps=early_stop_patience_steps, - # is_debug=is_debug, - # dataset=dataset, - # is_train=is_train, - # is_fivemodels=is_fivemodels, - # val_size=val_size, - # test_size=test_size, - # settings=settings, - # now=now, - # etadata=etadata, - # modelsindex=modelsindex, - # data=data, - # is_eta=is_eta, - # end_time=end_time, - # ) + ex_Model(df, + horizon=horizon, + input_size=input_size, + train_steps=train_steps, + val_check_steps=val_check_steps, + early_stop_patience_steps=early_stop_patience_steps, + is_debug=is_debug, + dataset=dataset, + is_train=is_train, + is_fivemodels=is_fivemodels, + val_size=val_size, + test_size=test_size, + settings=settings, + now=now, + etadata=etadata, + modelsindex=modelsindex, + data=data, + is_eta=is_eta, + end_time=end_time, + ) logger.info('模型训练完成') logger.info('训练数据绘图ing') - # model_results3 = model_losss(sqlitedb,end_time=end_time) + model_results3 = model_losss(sqlitedb,end_time=end_time) logger.info('训练数据绘图end') # 模型报告 @@ -262,8 +264,8 @@ def predict_main(): title = f'{settings}--{end_time}-预测报告' # 报告标题 reportname = f'Brent原油大模型预测--{end_time}.pdf' # 报告文件名 reportname = reportname.replace(':', '-') # 替换冒号 - # brent_export_pdf(dataset=dataset,num_models = 5 if is_fivemodels else 22,time=end_time, - # reportname=reportname,sqlitedb=sqlitedb), + brent_export_pdf(dataset=dataset,num_models = 5 if is_fivemodels else 22,time=end_time, + reportname=reportname,sqlitedb=sqlitedb), logger.info('制作报告end') logger.info('模型训练完成') diff --git a/models/nerulforcastmodels.py b/models/nerulforcastmodels.py index b17d55c..3fa05a9 100644 --- a/models/nerulforcastmodels.py +++ b/models/nerulforcastmodels.py @@ -379,16 +379,17 @@ def ex_Model_Juxiting(df,horizon,input_size,train_steps,val_check_steps,early_st logger.info('读取模型:'+ filename) nf = load(filename) # 测试集预测 - # nf_test_preds = nf.cross_validation(df=df_test, val_size=val_size, test_size=test_size, n_windows=None) - # # 测试集预测结果保存 - # nf_test_preds.to_csv(os.path.join(dataset,"cross_validation.csv"),index=False) + nf_test_preds = nf.cross_validation(df=df_test, val_size=val_size, test_size=test_size, n_windows=None) + # 测试集预测结果保存 + nf_test_preds.to_csv(os.path.join(dataset,"cross_validation.csv"),index=False) - # df_test['ds'] = pd.to_datetime(df_test['ds'], errors='coerce') + df_test['ds'] = pd.to_datetime(df_test['ds'], errors='coerce') #进行未来时间预测 df_predict=nf.predict(df_test).reset_index() # 去掉index列 - df_predict.drop(columns=['index'], inplace=True) + if 'index' in df_predict.columns: + df_predict.drop(columns=['index'], inplace=True) # 处理非有限值(NA 或 inf),将其替换为 0 df_predict = df_predict.fillna(0) df_predict = df_predict.replace([np.inf, -np.inf], 0)