前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >王者荣耀喜欢玩的英雄赢不了,不喜欢的却能赢?那你对比过他们的属性吗?

王者荣耀喜欢玩的英雄赢不了,不喜欢的却能赢?那你对比过他们的属性吗?

作者头像
松鼠爱吃饼干
发布2021-09-02 10:07:44
2650
发布2021-09-02 10:07:44
举报
文章被收录于专栏:Python分享Python分享

导入库

代码语言:javascript
复制
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.mixture import GaussianMixture
from sklearn.preprocessing import StandardScaler
from pyecharts.charts import Pie
from pyecharts import options as opts
from collections import Counter




Python从零基础入门到实战系统教程、源码、视频、在线一对一解答,可以加群:1039649593

1. 所有英雄属性

代码语言:javascript
复制
plt.rcParams['font.sans-serif'] = ['SimHei']  # 正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
data = pd.read_csv('/home/mw/input/hero3741/all_hero_init_attr.csv', encoding='gb18030')
代码语言:javascript
复制
feature = ['英雄名字', '生存能力', '攻击伤害', '技能效果',
           '上手难度', '最大生命', '最大法力', '物理攻击',
           '法术攻击', '物理防御', '物理减伤率', '法术防御',
           '法术减伤率', '移速', '物理护甲穿透', '法术护甲穿透',
           '攻速加成', '暴击几率', '暴击效果', '物理吸血', '法术吸血',
           '冷却缩减', '攻击范围', '韧性', '生命回复', '法力回复']
data_init = data[feature]
data_init.head()
代码语言:javascript
复制
# 把空值设置为0
data_init = data_init.fillna(0)
# print(data_init.isnull().sum())
'''
正则匹配包含%%的数据
p = r'(%%)'
a = data_init['物理减伤率'].astype("object").str.extract(p)
print(a)
'''

features_remain = ['生存能力', '攻击伤害', '技能效果',
                    '上手难度', '最大生命', '最大法力', '物理攻击',
                    '法术攻击', '物理防御', '物理减伤率', '移速', '攻击范围', '生命回复', '法力回复']

data_init = data_init[features_remain]

data_init['物理减伤率'] = data_init['物理减伤率'].apply(lambda x: float(x.strip('%'))/100)

data_init['攻击范围'] = data_init['攻击范围'].map({'远程': 1, '近程': 0})

# print(data_init)

ss = StandardScaler()
data_init = ss.fit_transform(data_init)

gmm = GaussianMixture(n_components=20, covariance_type='full')
gmm.fit(data_init)

prediction = gmm.predict(data_init)
# print(prediction)
data.insert(0, '分组', prediction)
data.to_csv('/home/mw/input/hero3741/all_hero_init_attr_our.csv', index=False, sep=',', encoding='gb18030')


df = data[['分组', '英雄名字']]  # 获取需要的两列

grouped = df.groupby(['分组'])  # 以”分组“列来进行分组
k = []

# 获取分组后的 组和值,保存为字典,放到列表中
for name, group in grouped:
    k.append({name: list(group['英雄名字'].values)})

kk = []
for i in k:
    for k, v in i.items():
        kk.append(v)

length = []
key = []
for i in kk:
    key.append(str(i))
    length.append(len(i))
代码语言:javascript
复制
key, length
代码语言:javascript
复制
pie = Pie()
pie.add("", [list(z) for z in zip(key, length)],
       radius=["30%", "75%"], center=["45%", "50%"], rosetype="radius",
       )
pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}, {d}%"))
pie.set_global_opts(
            title_opts=opts.TitleOpts(title="英雄初始属性分类图"),
            legend_opts=opts.LegendOpts(
                type_="scroll", pos_left="80%", orient="vertical"
            ),
        )
pie.render_notebook()

2. 根据英雄属性进行聚类分析

代码语言:javascript
复制
plt.rcParams['font.sans-serif'] = ['SimHei']  # 正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
data = pd.read_csv('/home/mw/input/hero3741/all_hero_init_attr.csv', encoding='gb18030')
代码语言:javascript
复制
data.head()
代码语言:javascript
复制
feature = ['英雄名字', '生存能力', '攻击伤害', '技能效果',
           '上手难度', '最大生命', '最大法力', '物理攻击',
           '法术攻击', '物理防御', '物理减伤率', '法术防御',
           '法术减伤率', '移速', '物理护甲穿透', '法术护甲穿透',
           '攻速加成', '暴击几率', '暴击效果', '物理吸血', '法术吸血',
           '冷却缩减', '攻击范围', '韧性', '生命回复', '法力回复']
代码语言:javascript
复制
data_init = data[feature]
代码语言:javascript
复制
data_init = data_init.fillna(0)
代码语言:javascript
复制
corr = data_init[feature].corr()
plt.figure(figsize=(14, 14))
sns.heatmap(corr, annot=True)
plt.show()
代码语言:javascript
复制
features_remain = ['生存能力', '攻击伤害', '技能效果',
                    '上手难度', '最大生命', '最大法力', '物理攻击',
                    '法术攻击', '物理防御', '物理减伤率', '移速', '攻击范围', '生命回复', '法力回复']
代码语言:javascript
复制
data_init = data_init[features_remain]
data_init.head()
代码语言:javascript
复制
data_init['物理减伤率'] = data_init['物理减伤率'].apply(lambda x: float(x.strip('%'))/100)

data_init['攻击范围'] = data_init['攻击范围'].map({'远程': 1, '近程': 0})
代码语言:javascript
复制
data_init.head()
代码语言:javascript
复制
ss = StandardScaler()
data_init = ss.fit_transform(data_init)
代码语言:javascript
复制
gmm = GaussianMixture(n_components=20, covariance_type='full')
gmm.fit(data_init)
代码语言:javascript
复制
GaussianMixture(covariance_type='full', init_params='kmeans', max_iter=100,
                means_init=None, n_components=20, n_init=1,
                precisions_init=None, random_state=None, reg_covar=1e-06,
                tol=0.001, verbose=0, verbose_interval=10, warm_start=False,
                weights_init=None)
代码语言:javascript
复制
data.insert(0, '分组', prediction)
data.to_csv('/home/mw/input/hero3741/all_hero_init_attr_our.csv', index=False, sep=',', encoding='gb18030')
代码语言:javascript
复制
pie = Pie()
pie.add("", [list(z) for z in zip(key, length)],
       radius=["30%", "75%"],
            center=["40%", "50%"],
            rosetype="radius")
pie.set_global_opts(
            title_opts=opts.TitleOpts(title="英雄聚类分布"),
            legend_opts=opts.LegendOpts(
                type_="scroll", pos_left="80%", orient="vertical"
            ),
        )
pie.render_notebook()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 松鼠爱吃饼干 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导入库
  • 1. 所有英雄属性
  • 2. 根据英雄属性进行聚类分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档