ModeTest.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import pandas as pd
  2. import numpy as np
  3. from torch import nn
  4. from torch.utils.data import DataLoader
  5. from dataset.TimeDataset import TimeSeriesDataset
  6. from training import TimeSeriesTransformer
  7. import torch
  8. import matplotlib.pyplot as plt
  9. from utils.Arg import Arg
  10. arg = Arg()
  11. input_dim = arg.input_dim
  12. output_dim = arg.output_dim
  13. input_seq_length = arg.input_seq_length
  14. output_seq_length = arg.output_seq_length
  15. d_model = arg.d_model
  16. nhead = arg.nhead
  17. num_layers = arg.num_layers
  18. dropout = arg.dropout
  19. batch_size = arg.batch_size
  20. epochs = arg.epochs
  21. time_split = arg.time_split
  22. def rmse(predictions, targets):
  23. return np.sqrt(((predictions - targets) ** 2).mean())
  24. def calculate_rmse_for_intervals(list1, list2, step=96):
  25. assert len(list1) == len(list2), "两个列表的长度必须相等"
  26. rmse_results = []
  27. for i in range(0, len(list1), step):
  28. predictions = np.array(list1[i:i + step])
  29. targets = np.array(list2[i:i + step])
  30. rmse_val = rmse(predictions, targets)
  31. rmse_results.append(rmse_val)
  32. return rmse_results
  33. cap = arg.power_max
  34. def calculate_accuracy(output_values, target_values,powermax,powermin):
  35. output_values_i = output_values[0:len(output_values)]
  36. target_values_i = target_values[0:len(target_values)]
  37. for i in range(len(output_values)):
  38. output_values_i[i] = output_values_i[i] * (powermax - powermin) + powermin
  39. if output_values[i] < 0: output_values[i] = 0
  40. target_values_i[i] = target_values_i[i] * (powermax - powermin) + powermin
  41. cal = calculate_rmse_for_intervals(output_values_i,target_values_i)
  42. totalacc = 0
  43. acc_list = []
  44. for i in range(len(cal)):
  45. accuracy = (1-cal[i]/cap)*100
  46. #print("第{}天的准确率为{}".format(i,accuracy))
  47. acc_list.extend([accuracy])
  48. totalacc = totalacc+accuracy
  49. return acc_list,totalacc/len(cal)
  50. def test(test_loader,C_TIME,powermax,powermin,name):
  51. test_loss = 0.0
  52. criterion = nn.MSELoss()
  53. with torch.no_grad():
  54. #model = TimeSeriesTransformer(input_dim, output_dim, d_model, nhead, num_layers, dropout)
  55. model = TimeSeriesTransformer()
  56. model.load_state_dict(torch.load(f'./save/{name}'))
  57. output_values = []
  58. target_values = []
  59. datetime_values = C_TIME
  60. for i, (inputs_3, target) in enumerate(test_loader):
  61. #inputs_3 = inputs_3.permute(1, 0, 2)
  62. #target = target.unsqueeze(0)
  63. #tgt = inputs_3[-1].unsqueeze(0)
  64. #output = model(inputs_3, tgt)
  65. #print(output.shape)
  66. #inputs_3 = inputs_3.permute(1, 0, 2)
  67. #tgt = inputs_3[-1:]
  68. output = model(inputs_3)#,tgt)
  69. test_loss += criterion(output, target).item()
  70. test_loss /= len(test_loader)
  71. output_values.extend(output.squeeze().tolist())
  72. target_values.extend(target.squeeze().tolist())
  73. acclist,acc = calculate_accuracy(output_values, target_values,powermax,powermin)
  74. print('Test Loss: {:.4f},Test accuracy:{:.4f}'.format(test_loss,acc))
  75. print(np.min(output_values))
  76. print(np.max(output_values))
  77. for i in range(len(output_values)):
  78. output_values[i] = output_values[i] * (powermax - powermin) + powermin
  79. if output_values[i] < 0: output_values[i] = 0
  80. target_values[i] = target_values[i] * (powermax - powermin) + powermin
  81. plt.plot(output_values, label='model Output')
  82. plt.plot(target_values, label='Actual Value')
  83. for i in range(0, len(output_values) // 96 + 1):
  84. plt.axvline(x=96 * i, linestyle='--', color='gray')
  85. plt.annotate(round(acclist[i],2), xy=(96 * i+48, plt.ylim()[1]-5), xytext=(96 * i, plt.ylim()[1]-5), va='top', ha='left',fontsize=8)
  86. plt.axvline(x=len(output_values), linestyle='--', color='gray')
  87. plt.xlabel('Sample Index')
  88. plt.ylabel('Value')
  89. plt.legend()
  90. plt.show()
  91. df1 = pd.DataFrame(output_values)
  92. df2 = pd.DataFrame(target_values)
  93. df3 = pd.DataFrame(datetime_values)
  94. df = pd.concat([df1, df2], axis=1)
  95. df = pd.concat([df3, df], axis=1)
  96. df.columns=["时间","预测功率","实际功率"]
  97. df.to_excel('./save/短期对比.xlsx', index=False, sheet_name='对比数据')
  98. return test_loss,acc
  99. def data_prase(NWP_test,power_test):
  100. data_NWP = pd.read_csv(NWP_test)
  101. data_power = pd.read_csv(power_test).iloc[:,1]
  102. C_TIME = data_NWP.iloc[:,0]
  103. dataset = TimeSeriesDataset(power_test, NWP_test)
  104. test_loader = DataLoader(dataset, batch_size=arg.batch_size)
  105. powermax = arg.power_max
  106. powermin = arg.power_min
  107. return test_loader,C_TIME,powermax,powermin
  108. def test_model(year,month,name):
  109. NWP_test = f'./data/training/NWP/NWP_{year}_{month}.csv'
  110. power_test = f'./data/training/power/power_{year}_{month}.csv'
  111. test_loader, C_TIME, powermax, powermin = data_prase(NWP_test,power_test)
  112. test_loss,acc = test(test_loader, C_TIME, powermax, powermin,name)
  113. return test_loss,acc