目录
一、引言
二、任务1
1、填充缺失值
2、用中位数填充“生命值”属性列缺失值
3、 用均值填充“生命值”属性列缺失值
三、任务2
注:英雄联盟英雄属性数据资源可在博客资源中自行获取。
一、引言
英雄联盟作为一款古早的刀塔游戏,可谓之刀塔游戏的鼻祖,这款游戏陪伴我们度过了学生时代。
下面将获取到的英雄联盟的英雄属性数据进行缺失值的填充并对修复后的数据计算前十位角色的相似性矩阵进行分析。
二、任务1
检查原始数据中缺失值情况,并用中位数填充“生命值”属性列缺失值,用均值填充“魔法值”属性列缺失值。
1、填充缺失值
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
pd1 = pd.read_csv("D:\\dataspace\\lolData.csv")
print('缺失值情况',pd1.isnull().sum())
life = pd1.iloc[:,2].values
magic=pd1.iloc[:,4].values
检验缺失值情况如下图:
2、用中位数填充“生命值”属性列缺失值
lifelist=[]
for i in range(len(life)):
if life[i]>0 and life[i]<800:
lifelist.append(life[i])
print(lifelist)
median1=int(np.median(lifelist))
print(median1)
for i in range(len(life)):
if life[i]<=0 or life[i]>=800 or np.isnan(life[i]):
life[i]=median1
print('处理后的生命值数据',life)
3、 用均值填充“生命值”属性列缺失值
magiclist=[]
for i in range(len(magic)):
if magic[i]>0 and magic[i]<800:
magiclist.append(magic[i])
print(magiclist)
mean=int(np.mean(magiclist))
print(mean)
for i in range(len(magic)):
if magic[i]<=0 or magic[i]>=800 or np.isnan(magic[i]):
magic[i]=mean
print('处理后的魔法值数据',magic)
三、任务2
根据任务1修复后的数据,计算数据表中前十位角色的相似性矩阵,并找出距离最近的和距离最远的两位角色
幻翎 洛 |
逆羽 霞 |
青钢影 卡蜜尔 |
翠神 艾翁 |
暴怒骑士 克烈 |
岩雀 塔莉垭 |
铸星龙王 奥瑞利安·索尔 |
戏命师 烬 |
海兽祭司 俄洛伊 |
永猎双子 千珏 |
首先计算数据表中前十位角色的相似性矩阵。
head1=pd1.head(10)
head1=pd.DataFrame(head1)
head2=head1.drop(columns="英雄名字")
# print(head1)
res= np.zeros((10,10))
def cosine_similarity(x, y):
x=np.array(x)
y=np.array(y)
num = np.dot(x,y)
denom = np.linalg.norm(x) * np.linalg.norm(y)
return num / denom
for i in range(10):
for j in range(10):
res[i][j]= cosine_similarity(head2.iloc[i,:],head2.iloc[j,:])
print(res)
计算欧氏距离。
def dist(x,y):
x = np.array(x)
y = np.array(y)
dist1 = np.linalg.norm(x-y)
return dist1
dist11=[]
for i in range(10):
for j in range(i+1,10):
dist2= dist(head2.iloc[i,:],head2.iloc[j,:])
dist11.append(dist2)
print("{0}和{1}的欧几里得距离为{2}".format(i, j,dist2))
print('欧几里得距离\n',dist11)
print('最大值:',max(dist11))
print('最小值',min(dist11))
print(np.argmin(dist11))
print(np.argmax(dist11))
找出距离最近和最远的两位角色。
for i in range(10):
for j in range(i+1,10):
if dist(head2.iloc[i, :], head2.iloc[j, :])==min(dist11):
print("{0}和{1}的欧几里得距离最小".format(i, j))
a=head1.iloc[i,1]
b=head1.iloc[j,1]
print("距离最小的两个英雄是:")
print(a,'|',b)
elif dist(head2.iloc[i, :], head2.iloc[j, :])==max(dist11):
print("{0}和{1}的欧几里得距离最大".format(i, j))
a = head1.iloc[i, 1]
b = head1.iloc[j, 1]
print("距离最大的两个英雄是:")
print(a, '|', b)