直接上代码了
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams["font.sans-serif"]=["SimHei"] # 正常显示中文及负号
mpl.rcParams["axes.unicode_minus"]=False
path = "E:/Model_building/A/"
s7 = pd.read_excel(path+"sheet1-7.xlsx")
s1 = pd.read_excel(path+"sheet3.xlsx")
s7 = pd.DataFrame(s7.values)
s1 = pd.DataFrame(s1.values) # 导入数据
看一下s1和s7,由于是一整个建模的题目,所以不做太多解释了,知道数据处理的方式就好。
上面是s7,1到8为8种元素在每一种地区的值,下面s1为八种元素的属性
下面需要用s1的数据对s7进行操作,对于每一行,进行行的for循环。为了不影响s7,令一个s8=s7需要注意,Python中的赋值为相同地址,所以copy复制一下。
s8 = s7.copy() # dataframe 复制需用copy函数
for i in range(1,9):
s8.iloc[:, i] /= s1.iloc[i-1, 2] # 每一列的每一行元素进行计算
在下面计算一行中每一个数据占这一行总和的比值,使用两个for循环,一个遍历行计算和,一个遍历这一行的列计算比值
s9 = s8.copy()
for i in range(5):
s = s9.iloc[i, 1:].sum() # 计算每一行的和
for k in range(1,9):
s9.iloc[i,k] /= s
s9.to_excel(path+"sheet9.xlsx")
下面用matplotlib的pie()画饼图,一共五个图形,遍历五遍
name = ['生活区', '工业', '山区', '交通', '绿地']
for i in range(5):
labels = ['As', 'Cd', 'Cr', 'Cu', 'Hg', 'Ni', 'Pb', 'Zn']
elements = list(s9.iloc[i,1:])
plt.pie(elements, labels=labels, autopct="%3.1f%%" ) # 饼图
plt.title(name[i])
plt.show()
下面统计每一种地区的采样数,Pg值,以及该值对应的污染程度,形成一个比较可以看得下去的表格。当然可以使用excel或者手工计算完成,这里使用Python
l = []
for i in range(5):
p = s8.iloc[i,1:].mean()
m = s8.iloc[i,1:].max()
l.append( np.sqrt((pow(p,2)+pow(m,2))/2) ) # 计算Pg列,即采样点综合污染指数
s1 = pd.read_excel(path+"sheet1.xlsx")
s1.columns = ['1', '2', '3', '4', '5', '6']
c = s1.groupby('6').count()
c = list(c.iloc[:,0]) # 统计每种地区的采样点个数
newdata = pd.DataFrame(np.zeros([5,3]))
newdata.iloc[:,1] = l
for i in range(5):
c[i] = name[i]+"("+str(c[i])+")" # 将采样点名称和个数合并成字符串
newdata.iloc[:,0] = c
for i in range(5): # 按照每种P值的范围,确定等级
a = newdata.iloc[i,1]
if a <= 0.7:
newdata.iloc[i,2] = "安全"
elif a <= 1:
newdata.iloc[i,2] = "警戒"
elif a <= 2:
newdata.iloc[i,2] = "轻"
elif a <= 3:
newdata.iloc[i,2] = "中"
else:
newdata.iloc[i,2] = "重"
print(newdata)
最后的结果: