metrics.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. import numpy as np
  2. def RSE(pred, true):
  3. return np.sqrt(np.sum((true-pred)**2)) / np.sqrt(np.sum((true-true.mean())**2))
  4. def CORR(pred, true):
  5. u = ((true-true.mean(0))*(pred-pred.mean(0))).sum(0)
  6. d = np.sqrt(((true-true.mean(0))**2*(pred-pred.mean(0))**2).sum(0))
  7. return (u/d).mean(-1)
  8. def MAE(pred, true):
  9. return np.mean(np.abs(pred-true))
  10. def MSE(pred, true):
  11. return np.mean((pred-true)**2)
  12. def RMSE(pred, true):
  13. return np.sqrt(MSE(pred, true))
  14. def MAPE(pred, true):
  15. return np.mean(np.abs((pred - true) / true))
  16. def MSPE(pred, true):
  17. return np.mean(np.square((pred - true) / true))
  18. def metric(pred, true):
  19. mae = MAE(pred, true)
  20. mse = MSE(pred, true)
  21. rmse = RMSE(pred, true)
  22. mape = MAPE(pred, true)
  23. mspe = MSPE(pred, true)
  24. return mae,mse,rmse,mape,mspe
  25. # ShortTerm percentage
  26. def ST(pred, true):
  27. return np.abs((pred-true)/pred*100)
  28. # ShortTerm percentage 西北 把不计入的点准确率赋值为-1
  29. def ST_xibei(pred, true, cap):
  30. # pred_8 = pred
  31. a = np.abs(true-pred)
  32. b = true-pred
  33. precentage = []
  34. sum = 0
  35. num1 =0 #过低预测计数
  36. num2 = 0 #过高预测计数
  37. for i in range(len(pred)):
  38. if pred[i] == 0:
  39. if true[i] < cap*0.03:
  40. precentage.append(-1)
  41. pass
  42. else:
  43. precentage.append(0)
  44. elif true[i] == 0:
  45. if pred[i] < cap*0.03:
  46. precentage.append(-1)
  47. pass
  48. else:
  49. precentage.append(0)
  50. # 小于装机容量 0.03不计
  51. elif pred[i] < cap*0.03 and true[i] < cap*0.03:
  52. precentage.append(-1)
  53. pass
  54. else:
  55. tmp = 1-a[i]/pred[i]
  56. if tmp<0:
  57. # print("超低预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
  58. num1+=1
  59. precentage.append(0)
  60. else:
  61. if tmp<0.5 and b[i]>0:
  62. # print("过低预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
  63. num1+=1
  64. elif tmp < 0.5 and b[i] < 0:
  65. # print("过高预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
  66. num2+=1
  67. precentage.append(tmp*100)
  68. print("过低预测{} 过高预测{}".format(num1, num2))
  69. for i in precentage:
  70. sum += i
  71. mean = sum / len(precentage)
  72. return precentage,mean
  73. # ShortTerm percentage 西北 输出低预测和高预测
  74. def ST_xibei_2(pred, true,cap):
  75. # pred_8 = pred
  76. a = np.abs(true-pred)
  77. b = true-pred
  78. precentage = []
  79. sum = 0
  80. num1 =0
  81. num2 = 0
  82. for i in range(len(pred)):
  83. if pred[i] == 0:
  84. if true[i] < cap*0.03:
  85. # precentage.append(100)
  86. pass
  87. else:
  88. precentage.append(0)
  89. elif true[i] == 0:
  90. if pred[i] < cap*0.03:
  91. # precentage.append(100)
  92. pass
  93. else:
  94. precentage.append(0)
  95. # 小于装机容量 0.03不计
  96. elif pred[i] < cap*0.03 and true[i] < cap*0.03:
  97. pass
  98. else:
  99. tmp = 1-a[i]/pred[i]
  100. if tmp<0:
  101. # print("超低预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
  102. num1+=1
  103. precentage.append(0)
  104. else:
  105. if tmp<0.5 and b[i]>0:
  106. # print("过低预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
  107. num1+=1
  108. elif tmp < 0.5 and b[i] < 0:
  109. # print("过高预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
  110. num2+=1
  111. precentage.append(tmp*100)
  112. print("过低预测{} 过高预测{}".format(num1, num2))
  113. for i in precentage:
  114. sum += i
  115. mean = sum / len(precentage)
  116. return precentage,mean
  117. # ShortTerm percentage 西北 输出低预测和高预测 超低预测(超低预测准确率直接为0)
  118. def ST_xibei_xiangxi(pred, true,cap):
  119. # pred_8 = pred
  120. a = np.abs(true-pred)
  121. b = true-pred
  122. precentage = []
  123. sum = 0
  124. num1 =0
  125. num2 = 0
  126. num3 = 0 #超低预测 预测值不为0
  127. num4 = 0 #超高预测
  128. num5 = 0 #超低预测 预测值为0 真实值大于0.03*cap
  129. print('-----------------评测---------------')
  130. for i in range(len(pred)):
  131. if pred[i] == 0:
  132. if true[i] < cap*0.03:
  133. pass
  134. else:
  135. precentage.append(0)
  136. num5 += 1
  137. print('预测值为0 超低点实际值:',true[i])
  138. elif true[i] == 0:
  139. if pred[i] < cap*0.03:
  140. pass
  141. else:
  142. precentage.append(0)
  143. # print('超高点预测值:',pred[i])
  144. num4 +=1
  145. # 小于装机容量 0.03不计
  146. elif pred[i] < cap*0.03 and true[i] < cap*0.03:
  147. pass
  148. else:
  149. tmp = 1-a[i]/pred[i]
  150. if tmp<0:
  151. # print("超低预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
  152. num3+=1
  153. # print('超低点预测值:', pred[i])
  154. precentage.append(0)
  155. else:
  156. if tmp<0.5 and b[i]>0:
  157. # print("过低预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
  158. num1+=1
  159. elif tmp < 0.5 and b[i] < 0:
  160. # print("过高预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
  161. num2+=1
  162. precentage.append(tmp*100)
  163. print("过低预测{} 过高预测{} 超低{} 超高{} 超低为0点{}".format(num1, num2,num3,num4,num5))
  164. for i in precentage:
  165. sum += i
  166. mean = sum / len(precentage)
  167. return precentage,mean
  168. # ShortTerm percentage 西北 输出详细信息
  169. def ST_xibei_1(pred, true):
  170. # pred_8 = pred
  171. cap = 1000
  172. a = np.abs(true-pred)
  173. b = true-pred
  174. precentage = []
  175. sum = 0
  176. num1 =0
  177. num2 = 0
  178. sub_index=[]
  179. for i in range(len(pred)):
  180. if pred[i] == 0:
  181. if true[i] < cap*0.03:
  182. # precentage.append(100)
  183. pass
  184. else:
  185. precentage.append(0)
  186. sub_index.append(i)
  187. elif true[i] == 0:
  188. if pred[i] < cap*0.03:
  189. # precentage.append(100)
  190. pass
  191. else:
  192. precentage.append(0)
  193. sub_index.append(i)
  194. # 小于装机容量 0.03不计
  195. elif pred[i] < cap*0.03 and true[i] < cap*0.03:
  196. pass
  197. else:
  198. tmp = 1-a[i]/pred[i]
  199. if tmp<0:
  200. # print("超低预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
  201. num1+=1
  202. precentage.append(0)
  203. sub_index.append(i)
  204. else:
  205. if tmp<0.5 and b[i]>0:
  206. # print("过低预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
  207. num1+=1
  208. sub_index.append(i)
  209. precentage.append(tmp * 100)
  210. elif tmp < 0.5 and b[i] < 0:
  211. # print("过高预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
  212. num2+=1
  213. sub_index.append(i)
  214. precentage.append(tmp * 100)
  215. # precentage.append(tmp*100)
  216. print("过低预测{} 过高预测{}".format(num1, num2))
  217. for i in precentage:
  218. sum += i
  219. mean = sum / len(precentage)
  220. return precentage,mean,sub_index
  221. # UltraShortTerm percentage
  222. def UST_huabei(pred, true):
  223. a = np.abs(pred-true)
  224. ust4hour=[]
  225. ust1day=[]
  226. count = 0
  227. buji = 0
  228. for i in range(15,len(true),1):
  229. num1 = 0
  230. num2 = 0
  231. for j in range(16):
  232. num1 = num1 + a[i-j, j, 0]
  233. num2 = num2 + pred[i-j, j, 0]
  234. if (num2 / 16) < 0.6 and true[i,0,0] < 0.6:
  235. ele = 0
  236. buji += 1
  237. else:
  238. ele = num1 / num2 if num1 / num2 < 1 else 1
  239. ust4hour.append(ele)
  240. count += 1
  241. if count % 96 == 0:
  242. ele = 0
  243. for k in range(len(ust4hour)-96,len(ust4hour)):
  244. ele = ele + ust4hour[k]
  245. ust1day.append((1-ele/(96-buji))*100)
  246. buji = 0
  247. return ust4hour, ust1day
  248. # UltraShortTerm percentage 西北地区
  249. def UST_XiBei(pred, true, capacity):
  250. pt_sub = np.abs(pred - true)
  251. ust1day = []
  252. denominator = 0
  253. ele = 0
  254. for i in range(0, len(true), 1):
  255. if pred[i]>=capacity*0.03 or true[i]>=capacity*0.03:
  256. ele += abs((true[i]/(true[i]+pred[i]))-0.5)*pt_sub[i]
  257. denominator += pt_sub[i] #分母累加
  258. #每遍历96点 计算
  259. if (i+1)%96==0:
  260. ele = 1-(2*ele/denominator)
  261. ust1day.append(ele)
  262. # 清零重新累加
  263. ele = 0
  264. denominator = 0
  265. ust_sum = 0
  266. for i in ust1day:
  267. ust_sum += i
  268. mean = ust_sum / len(ust1day) * 100
  269. return ust1day, mean
  270. # UltraShortTerm percentage 西北地区
  271. def UST_XiBei_old(pred, true, capacity):
  272. a = np.abs(pred - true)
  273. pos = 8
  274. ust1day = []
  275. count = 0
  276. num1 = []
  277. num2 = 0
  278. num3 = []
  279. jilu = []
  280. for i in range(0, len(true), 1):
  281. if pred[i] >= capacity*0.03 or true[i] >= capacity*0.03:
  282. jilu.append(i)
  283. num1.append(abs(true[i] / (pred[i] + true[i]) - 0.5))
  284. num2 += a[i]
  285. count += 1
  286. if count % 96 == 0:
  287. ele = 0
  288. for j in jilu:
  289. num3.append(a[j] / num2)
  290. for k in range(len(num1)):
  291. ele += num1[k] * num3[k]
  292. ust1day.append(1 - 2 * ele)
  293. num1.clear()
  294. num2 = 0
  295. num3.clear()
  296. jilu.clear()
  297. sum =0
  298. for i in ust1day:
  299. sum += i
  300. mean = sum / len(ust1day)
  301. return ust1day, mean
  302. def UST_ShanDong_wind(pred, true, capacity):
  303. tmp_s = []
  304. for i in range(len(pred)//96):
  305. sub_pred = pred[i*96:(i+1)*96]
  306. sub_true = true[i*96:(i+1)*96]
  307. tmp = (1-np.sqrt(np.mean((sub_pred - sub_true)**2))/capacity)*100
  308. tmp_s.append(tmp)
  309. # for i in range(20):
  310. # print(tmp_s[i])
  311. mean = np.mean(tmp_s)
  312. return mean
  313. #每个时点对未来16个点做出预测
  314. def UST_XiBei_16(pred, true, capacity):
  315. a = np.abs(pred - true)
  316. pos = 8
  317. ust1day = []
  318. count = 0
  319. num1 = []
  320. num2 = 0
  321. num3 = []
  322. jilu = []
  323. for i in range(0, len(true), 1):
  324. if pred[i][pos] >= capacity*0.03 or true[i][pos] >= capacity*0.03:
  325. jilu.append(i)
  326. num1.append(abs(true[i][pos] / (pred[i][pos] + true[i][pos]) - 0.5))
  327. num2 += a[i][pos]
  328. count += 1
  329. if count % 96 == 0:
  330. ele = 0
  331. for j in jilu:
  332. num3.append(a[j][pos] / num2)
  333. for k in range(len(num1)):
  334. ele += num1[k] * num3[k]
  335. ust1day.append(1 - 2 * ele)
  336. num1.clear()
  337. num2 = 0
  338. num3.clear()
  339. jilu.clear()
  340. return ust1day