【入门】精灵宝可梦数据集分析

  • 数据集下载

    !wget -O pokemon_data.csv https://pai-public-data.oss-cn-beijing.aliyuncs.com/pokemon/pokemon.csv

  • 准备工作

import numpy as np
import pandas as pd
  • 目的:以最效率的方式打赢道馆赛通关

因为宝可梦的攻击力会直接乘以它们所对抗的宝可梦属性相克值,所以在对道馆训练家的宝可梦未知的前提下,所拥有6只宝可梦的总对抗属性权重越高,基础值越高就说明总体战斗力越强。即against值加起来×base_total

# 能力测评   属性值加起来×base_total
def ability_value(x, output_number):
    
    pokemon = x.copy()

    pokemon = pokemon[pokemon.is_legendary == 0] #因为是平民策略,把神兽都排除掉

    Xlist = []   # Xlist 是所有feature name,也就是宝可梦的所有属性名
    for line in pokemon:
        row = line.strip().split(",")
        Xlist.append(row)

    against_data = pokemon[Xlist[1]]
    Xlist = np.array(Xlist)
    for i in range(2, 18):
        # against_data 为所有的against_??权值加起来的总和,和战斗力成正相关
        against_data = against_data + np.array(pokemon[Xlist[i]])


    base_total_value = pokemon["base_total"]
    battle_value = against_data.mul(base_total_value, axis=0)

    rank_value = battle_value.sort_values(by=['against_bug'], ascending=False, na_position='first')
    rank_number = rank_value.axes[0].tolist()
    for i in range(0, output_number):
        print("【name】:  ", pokemon.name[rank_number[i]], " 【base total】: ", pokemon.base_total[rank_number[i]])
    return 0

有些玩家喜欢属性均衡,所以在每个属性下输出3个较强的宝可梦供参考

# 在能力的基础上,属性输出
def type_prefer(x):
    
    pokemon = x.copy()
    type_total = pokemon.type1.drop_duplicates(keep='first')
    type_total.reset_index(drop=True, inplace=True)

    for typenum in range(0, len(type_total)):
        each_type_pokemon1 = pokemon.loc[pokemon['type1'] == type_total[typenum]]
        each_type_pokemon2 = pokemon.loc[pokemon['type2'] == type_total[typenum]]
        each_type_pokemon = each_type_pokemon1.append(each_type_pokemon2)
        print("type name: ", type_total[typenum])
        ability_value(each_type_pokemon, 3)  # 每种属性输出最牛逼的3个
        print("------------------")

将捕捉难度和培养难度都考虑进去,再看那只宝可梦值得培养

# 从培养难度考虑,培养经验值除以捕捉率,再乘以能力值,全部标准化
def training_hard_level(x, output_number):
    
    pokemon = x.copy()

    pokemon = pokemon[pokemon.is_legendary == 0]  # 因为是平民策略,把神兽都排除掉

    # monitor的捕捉率按255算,因为反正能力值都一样,算好抓的
    pokemon.capture_rate[773] = 255
    pokemon.capture_rate = pd.to_numeric(pokemon.capture_rate)

    normalization_base_total = (pokemon.base_total - pokemon.base_total.min()) / (
                pokemon.base_total.max() - pokemon.base_total.min())
    normalization_capture_rate = (pokemon.capture_rate - pokemon.capture_rate.min()) / (
                pokemon.capture_rate.max() - pokemon.capture_rate.min())
    normalization_experience_growth = (pokemon.experience_growth - pokemon.experience_growth.min()) / (
                pokemon.experience_growth.max() - pokemon.experience_growth.min())

    Difficulty_level = normalization_experience_growth / normalization_capture_rate * normalization_base_total
    Difficulty_level = Difficulty_level.sort_values(ascending=False, na_position='first')

    rank_number = Difficulty_level.axes[0].tolist()
    for i in range(0, output_number):
        print("【name】:  ", pokemon.name[rank_number[i]], " 【base total】: ", pokemon.base_total[rank_number[i]])
    return 0

每个世代的宝可梦不同,一般来讲,后面的游戏会包括前几个世代的宝可梦,所以根据八个不同的generation考虑

if __name__ == '__main__':
    pokemon_Data = pd.read_csv("./pokemon_data.csv")
    # 首先要确定是哪一代的游戏 1-7代
    Xlist = []
    for line in pokemon_Data:
        row = line.strip().split(",")
        Xlist.append(row)

    generation_1 = pokemon_Data.iloc[0:151]
    generation_2 = pokemon_Data.iloc[0:251]
    generation_3 = pokemon_Data.iloc[0:386]
    generation_4 = pokemon_Data.iloc[0:493]
    generation_5 = pokemon_Data.iloc[0:649]
    generation_6 = pokemon_Data.iloc[0:721]
    generation_7 = pokemon_Data.iloc[0:801]

    print("以第一代为例:")
    print("===============纯从能力值考虑,前十名的宝可梦有:==================")
    ability_value(generation_1,10)
    print("==============考虑捕捉+训练难度,前十名的宝可梦有:===============")
    training_hard_level(generation_1, 10)
    print("============考虑属性多样爱好者,每个属性的前三甲宝可梦有:===========")
    type_prefer(generation_1)

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值