123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370 |
- import numpy as np
- def RSE(pred, true):
- return np.sqrt(np.sum((true-pred)**2)) / np.sqrt(np.sum((true-true.mean())**2))
- def CORR(pred, true):
- u = ((true-true.mean(0))*(pred-pred.mean(0))).sum(0)
- d = np.sqrt(((true-true.mean(0))**2*(pred-pred.mean(0))**2).sum(0))
- return (u/d).mean(-1)
- def MAE(pred, true):
- return np.mean(np.abs(pred-true))
- def MSE(pred, true):
- return np.mean((pred-true)**2)
- def RMSE(pred, true):
- return np.sqrt(MSE(pred, true))
- def MAPE(pred, true):
- return np.mean(np.abs((pred - true) / true))
- def MSPE(pred, true):
- return np.mean(np.square((pred - true) / true))
- def metric(pred, true):
- mae = MAE(pred, true)
- mse = MSE(pred, true)
- rmse = RMSE(pred, true)
- mape = MAPE(pred, true)
- mspe = MSPE(pred, true)
-
- return mae,mse,rmse,mape,mspe
- # ShortTerm percentage
- def ST(pred, true):
- return np.abs((pred-true)/pred*100)
- # ShortTerm percentage 西北 把不计入的点准确率赋值为-1
- def ST_xibei(pred, true, cap):
- # pred_8 = pred
- a = np.abs(true-pred)
- b = true-pred
- precentage = []
- sum = 0
- num1 =0 #过低预测计数
- num2 = 0 #过高预测计数
- for i in range(len(pred)):
- if pred[i] == 0:
- if true[i] < cap*0.03:
- precentage.append(-1)
- pass
- else:
- precentage.append(0)
- elif true[i] == 0:
- if pred[i] < cap*0.03:
- precentage.append(-1)
- pass
- else:
- precentage.append(0)
- # 小于装机容量 0.03不计
- elif pred[i] < cap*0.03 and true[i] < cap*0.03:
- precentage.append(-1)
- pass
- else:
- tmp = 1-a[i]/pred[i]
- if tmp<0:
- # print("超低预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
- num1+=1
- precentage.append(0)
- else:
- if tmp<0.5 and b[i]>0:
- # print("过低预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
- num1+=1
- elif tmp < 0.5 and b[i] < 0:
- # print("过高预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
- num2+=1
- precentage.append(tmp*100)
- print("过低预测{} 过高预测{}".format(num1, num2))
- for i in precentage:
- sum += i
- mean = sum / len(precentage)
- return precentage,mean
- # ShortTerm percentage 西北 输出低预测和高预测
- def ST_xibei_2(pred, true,cap):
- # pred_8 = pred
- a = np.abs(true-pred)
- b = true-pred
- precentage = []
- sum = 0
- num1 =0
- num2 = 0
- for i in range(len(pred)):
- if pred[i] == 0:
- if true[i] < cap*0.03:
- # precentage.append(100)
- pass
- else:
- precentage.append(0)
- elif true[i] == 0:
- if pred[i] < cap*0.03:
- # precentage.append(100)
- pass
- else:
- precentage.append(0)
- # 小于装机容量 0.03不计
- elif pred[i] < cap*0.03 and true[i] < cap*0.03:
- pass
- else:
- tmp = 1-a[i]/pred[i]
- if tmp<0:
- # print("超低预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
- num1+=1
- precentage.append(0)
- else:
- if tmp<0.5 and b[i]>0:
- # print("过低预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
- num1+=1
- elif tmp < 0.5 and b[i] < 0:
- # print("过高预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
- num2+=1
- precentage.append(tmp*100)
- print("过低预测{} 过高预测{}".format(num1, num2))
- for i in precentage:
- sum += i
- mean = sum / len(precentage)
- return precentage,mean
- # ShortTerm percentage 西北 输出低预测和高预测 超低预测(超低预测准确率直接为0)
- def ST_xibei_xiangxi(pred, true,cap):
- # pred_8 = pred
- a = np.abs(true-pred)
- b = true-pred
- precentage = []
- sum = 0
- num1 =0
- num2 = 0
- num3 = 0 #超低预测 预测值不为0
- num4 = 0 #超高预测
- num5 = 0 #超低预测 预测值为0 真实值大于0.03*cap
- print('-----------------评测---------------')
- for i in range(len(pred)):
- if pred[i] == 0:
- if true[i] < cap*0.03:
- pass
- else:
- precentage.append(0)
- num5 += 1
- print('预测值为0 超低点实际值:',true[i])
- elif true[i] == 0:
- if pred[i] < cap*0.03:
- pass
- else:
- precentage.append(0)
- # print('超高点预测值:',pred[i])
- num4 +=1
- # 小于装机容量 0.03不计
- elif pred[i] < cap*0.03 and true[i] < cap*0.03:
- pass
- else:
- tmp = 1-a[i]/pred[i]
- if tmp<0:
- # print("超低预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
- num3+=1
- # print('超低点预测值:', pred[i])
- precentage.append(0)
- else:
- if tmp<0.5 and b[i]>0:
- # print("过低预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
- num1+=1
- elif tmp < 0.5 and b[i] < 0:
- # print("过高预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
- num2+=1
- precentage.append(tmp*100)
- print("过低预测{} 过高预测{} 超低{} 超高{} 超低为0点{}".format(num1, num2,num3,num4,num5))
- for i in precentage:
- sum += i
- mean = sum / len(precentage)
- return precentage,mean
- # ShortTerm percentage 西北 输出详细信息
- def ST_xibei_1(pred, true):
- # pred_8 = pred
- cap = 1000
- a = np.abs(true-pred)
- b = true-pred
- precentage = []
- sum = 0
- num1 =0
- num2 = 0
- sub_index=[]
- for i in range(len(pred)):
- if pred[i] == 0:
- if true[i] < cap*0.03:
- # precentage.append(100)
- pass
- else:
- precentage.append(0)
- sub_index.append(i)
- elif true[i] == 0:
- if pred[i] < cap*0.03:
- # precentage.append(100)
- pass
- else:
- precentage.append(0)
- sub_index.append(i)
- # 小于装机容量 0.03不计
- elif pred[i] < cap*0.03 and true[i] < cap*0.03:
- pass
- else:
- tmp = 1-a[i]/pred[i]
- if tmp<0:
- # print("超低预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
- num1+=1
- precentage.append(0)
- sub_index.append(i)
- else:
- if tmp<0.5 and b[i]>0:
- # print("过低预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
- num1+=1
- sub_index.append(i)
- precentage.append(tmp * 100)
- elif tmp < 0.5 and b[i] < 0:
- # print("过高预测 差值{} 真实值{} 预测值{}".format(a[i], true[i], pred[i]))
- num2+=1
- sub_index.append(i)
- precentage.append(tmp * 100)
- # precentage.append(tmp*100)
- print("过低预测{} 过高预测{}".format(num1, num2))
- for i in precentage:
- sum += i
- mean = sum / len(precentage)
- return precentage,mean,sub_index
- # UltraShortTerm percentage
- def UST_huabei(pred, true):
- a = np.abs(pred-true)
- ust4hour=[]
- ust1day=[]
- count = 0
- buji = 0
- for i in range(15,len(true),1):
- num1 = 0
- num2 = 0
- for j in range(16):
- num1 = num1 + a[i-j, j, 0]
- num2 = num2 + pred[i-j, j, 0]
- if (num2 / 16) < 0.6 and true[i,0,0] < 0.6:
- ele = 0
- buji += 1
- else:
- ele = num1 / num2 if num1 / num2 < 1 else 1
- ust4hour.append(ele)
- count += 1
- if count % 96 == 0:
- ele = 0
- for k in range(len(ust4hour)-96,len(ust4hour)):
- ele = ele + ust4hour[k]
- ust1day.append((1-ele/(96-buji))*100)
- buji = 0
- return ust4hour, ust1day
- # UltraShortTerm percentage 西北地区
- def UST_XiBei(pred, true, capacity):
- pt_sub = np.abs(pred - true)
- ust1day = []
- denominator = 0
- ele = 0
- for i in range(0, len(true), 1):
- if pred[i]>=capacity*0.03 or true[i]>=capacity*0.03:
- ele += abs((true[i]/(true[i]+pred[i]))-0.5)*pt_sub[i]
- denominator += pt_sub[i] #分母累加
- #每遍历96点 计算
- if (i+1)%96==0:
- ele = 1-(2*ele/denominator)
- ust1day.append(ele)
- # 清零重新累加
- ele = 0
- denominator = 0
- ust_sum = 0
- for i in ust1day:
- ust_sum += i
- mean = ust_sum / len(ust1day) * 100
- return ust1day, mean
- # UltraShortTerm percentage 西北地区
- def UST_XiBei_old(pred, true, capacity):
- a = np.abs(pred - true)
- pos = 8
- ust1day = []
- count = 0
- num1 = []
- num2 = 0
- num3 = []
- jilu = []
- for i in range(0, len(true), 1):
- if pred[i] >= capacity*0.03 or true[i] >= capacity*0.03:
- jilu.append(i)
- num1.append(abs(true[i] / (pred[i] + true[i]) - 0.5))
- num2 += a[i]
- count += 1
- if count % 96 == 0:
- ele = 0
- for j in jilu:
- num3.append(a[j] / num2)
- for k in range(len(num1)):
- ele += num1[k] * num3[k]
- ust1day.append(1 - 2 * ele)
- num1.clear()
- num2 = 0
- num3.clear()
- jilu.clear()
- sum =0
- for i in ust1day:
- sum += i
- mean = sum / len(ust1day)
- return ust1day, mean
- def UST_ShanDong_wind(pred, true, capacity):
- tmp_s = []
- for i in range(len(pred)//96):
- sub_pred = pred[i*96:(i+1)*96]
- sub_true = true[i*96:(i+1)*96]
- tmp = (1-np.sqrt(np.mean((sub_pred - sub_true)**2))/capacity)*100
- tmp_s.append(tmp)
- # for i in range(20):
- # print(tmp_s[i])
- mean = np.mean(tmp_s)
- return mean
- #每个时点对未来16个点做出预测
- def UST_XiBei_16(pred, true, capacity):
- a = np.abs(pred - true)
- pos = 8
- ust1day = []
- count = 0
- num1 = []
- num2 = 0
- num3 = []
- jilu = []
- for i in range(0, len(true), 1):
- if pred[i][pos] >= capacity*0.03 or true[i][pos] >= capacity*0.03:
- jilu.append(i)
- num1.append(abs(true[i][pos] / (pred[i][pos] + true[i][pos]) - 0.5))
- num2 += a[i][pos]
- count += 1
- if count % 96 == 0:
- ele = 0
- for j in jilu:
- num3.append(a[j][pos] / num2)
- for k in range(len(num1)):
- ele += num1[k] * num3[k]
- ust1day.append(1 - 2 * ele)
- num1.clear()
- num2 = 0
- num3.clear()
- jilu.clear()
- return ust1day
|