-
数据集下载
!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)