###### tags: `計算智慧與規劃` `期末專題` # 計算結果程式碼 ```python= import csv MinList = [1000 for i in range(11)] MaxList = [0 for i in range(11)] def pick(data) : newdata = [] for i in range(len(data)) : if (data[i][2] == "PM2.5 " or data[i][2] == "AMB_TEMP ") : newdata.append(data[i]) if (data[i][2] == "CO " or data[i][2] == "NO ") : newdata.append(data[i]) if (data[i][2] == "NO2 " or data[i][2] == "NOx ") : newdata.append(data[i]) if (data[i][2] == "O3 " or data[i][2] == "PM10 ") : newdata.append(data[i]) if (data[i][2] == "RAINFALL " or data[i][2] == "RH ") : newdata.append(data[i]) if (data[i][2] == "SO2 ") : newdata.append(data[i]) return newdata def changeType(data) : for i in range(len(data)) : num = 0 for j in range(3,len(data[i])) : if(is_number(data[i][j])) : data[i][j] = float(data[i][j]) else : data[i][j] = "empty" # 判斷是否能轉換成 float def is_number(s): try: float(s) return True except ValueError: return False def turn(data) : # 先計算這筆資料是366天還是 365天 day = int(len(data) / 11) # 12 項分別是10個變數、pM2.5、時間 newdata = [["empty" for i in range(12)] for i in range(day*24)] for i in range(day) : for pos in range(24) : newdata[i*24+pos][0] = data[i*11][1] + str(pos) for v in range(11) : newdata[i*24+pos][v+1] = data[i*11+v][pos+3] return newdata # 只要有空值全部刪掉 def check(data) : newdata = [] for i in range(len(data)) : num = 0 for j in range(len(data[i])) : if data[i][j] != "empty" : num = num + 1 if (num == 12) : newdata.append(data[i]) return newdata def changeSpace(data) : pos = len(data[0]) for i in range(len(data)) : tmp = data[i][pos-1] data[i][pos-1] = data[i][pos-4] data[i][pos-4] = tmp def MinMax(data) : for i in range(len(data)) : for pos in range(11) : if (MaxList[pos] < data[i][pos+1]) : MaxList[pos] = data[i][pos+1] if (MinList[pos] > data[i][pos+1]) : MinList[pos] = data[i][pos+1] print("MinList", MinList, "MaxList", MaxList) def norm(data) : for i in range(len(data)) : for pos in range(11) : data[i][pos+1] = (data[i][pos+1] - MinList[pos]) / (MaxList[pos] - MinList[pos]) return data def change(weight) : new = [0 for i in range(len(weight))] for i in range(len(weight)) : for j in range(len(weight[0])) : new[i] = weight[i][1].split(",") new[i].pop() for i in range(len(new)) : for j in range(len(new[0])) : new[i][j] = float(new[i][j]) return new def difScore(data, weight) : scores = [] for i in range(len(weight)) : scores.append(score(data, weight, i)) # 回到沒有正規化 notNorm(scores) print(scores) def score(data, weight, num) : # 全部的誤差 total = 0 for pos in range(len(data)) : # 猜測的pm2.5 guess = 0 for i in range(10) : guess += float(weight[num][i]) * float(data[pos][i+1]) # 扣掉誤差 guess = guess - weight[num][10] # 取絕對值 if(guess - data[pos][len(weight)-1] >= 0) : fit = guess - data[pos][len(weight)-1] else : fit = data[pos][len(weight)-1] - guess # 加入總誤差 total += fit # 平均誤差 newscore = total / len(data) return newscore def notNorm(scores) : for i in range(len(scores)) : scores[i] = scores[i] * (MaxList[10] - MinList[10]) def main() : name = input() olddata = [] # 讀入舊檔案 url = "C:/Users/rita5/Desktop/鋼鐵/全部_2019/高屏空品區_2019/高屏空品區/"+name+'_2019.csv' with open(url, newline= '') as csvfile : rows = csv.reader(csvfile, delimiter = ',') for row in rows : olddata.append(row) # 挑選需要的資料 olddata = pick(olddata) # 把資料從 string 轉成 float changeType(olddata) # 把資料轉成 1小時為單位 olddata = turn(olddata) # 檢查有沒有空值或亂碼 olddata = check(olddata) # 把 pm2.5 換到最後面 changeSpace(olddata) # 讀入新檔案 newdata = [] #url = "C:/Users/rita5/Desktop/鋼鐵/全部_2019/高屏空品區_2019/高屏空品區/"+name+'_2019.csv' url = "C:/Users/rita5/Desktop/鋼鐵/全部_2020/"+name+'_2020.csv' with open(url, newline= '') as csvfile : rows = csv.reader(csvfile, delimiter = ',') for row in rows : newdata.append(row) # 挑選需要的資料 newdata = pick(newdata) # 把資料從 string 轉成 float changeType(newdata) # 把資料轉成 1小時為單位 newdata = turn(newdata) # 檢查有沒有空值或亂碼 newdata = check(newdata) # 把 pm2.5 換到最後面 changeSpace(newdata) # 計算2019 最大最小 MinMax(olddata) # 把2020資料用2019年的最大最小正規化 newdata = norm(newdata) # 讀入權重 weight = [] url = "C:/Users/rita5/Desktop/鋼鐵/Weight"+name+'_2019.csv' with open(url, newline= '', encoding="utf-8") as csvfile : rows = csv.reader(csvfile, delimiter = ',') for row in rows : weight.append(row) # 整理資料, 只拿權重部分 weight = change(weight) # 計算分數 difScore(newdata, weight) if __name__ == "__main__" : main() ```