我正在尝试完成一个练习,即在Python中构建一个简单的机器学习算法。这涉及到一个包含宝可梦战斗和胜者的样本内容的数据框。我要做的是:我有一个包含超过50000个宝可梦战斗样本的数据集,我想计算每个宝可梦赢得战斗的次数,并将这个数字插入到一个包含每个宝可梦一些数据的表格中。代码如下(在Jupyter笔记本中):
import pandas as pdimport numpy as nppokemon = pd.read_csv('datas/pokemons_data.csv')combates = pd.read_csv('datas/combats.csv')pokemonnome_corrigido = dict(zip(pokemon['#'], pokemon['Name']))combates = combates[['First_pokemon', 'Second_pokemon', 'Winner']].replace(nome_corrigido)combatesprimeiro = combates['First_pokemon'].value_counts()segundo = combates['Second_pokemon'].value_counts()vitorias = combates['Winner'].value_counts()total_de_batalhas = primeiro + segundopercentual_vitorias = vitorias/total_de_batalhaspercentual_vitorias = percentual_vitorias.sort_values()percentual_vitorias.head()vitorias.head()pokemon['status_total'] = pokemon['Hit Points'] + pokemon['Attack'] + pokemon['Defense'] + pokemon['Sp. Atk'] + \ pokemon['Sp. Def'] + pokemon['Speed']pokemon['vitorias'] = vitorias[0]pokemon['percentual_vitorias'] = percentual_vitorias[0]pokemon.iloc[:, [1, -3]].head()from sklearn.model_selection import train_test_splitx = pokemon['status_total']y = pokemon['percentual_vitorias']x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.25)from sklearn.linear_model import LinearRegressionx_train = np.array(x_train).reshape(len(x_train) , 1)y_train = np.array(y_train).reshape(len(y_train) , 1)y_test = np.array(y_test).reshape(len(y_test) , 1)x_test = np.array(x_test).reshape(len(x_test) , 1)modelo_linear = LinearRegression()modelo_linear.fit(x_train, y_train)LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)modelo_linear.predict(x)
问题:1) 第一个问题出现在’pokemon[‘vitorias’] = vitorias[0]’这一行。很明显,新列只会填充值“152”,这是“vitorias”数组中的第一个条目(如果没有[0],我会得到NaN,因为我将整个向量映射到数据集中的一个单元格)。我的意图是:在combats.csv数据集中有一行,第一列是一个宝可梦,第二列是另一个宝可梦,第三列是这场战斗的获胜者。我计算了某些宝可梦获胜的次数,并创建了这个数组,每个条目是获胜次数按从大到小的顺序排列。152是梦幻赢得战斗的次数。现在我想在新列’vitorias’中只为梦幻填充这个数字152,其他宝可梦的胜利次数对应于它们赢的次数。我不知道该怎么做。我的问题,我的大问题,是如何将vitorias向量的第一个条目152映射到另一个数据集,即’pokemon’数据集中对应’梦幻’的那一行。也就是说,将宝可梦在vitorias向量中的胜利次数映射到pokemon表中的相应条目。
2) 在modelo_linear.predict(x)这一行,我得到的错误是:预期2D数组,但得到的是1D数组。为什么它期望一个2D数组?我如何修复这个问题?
这是pokemons_data.csv:我试图在“type2”列旁边插入一个新列,显示例如妙蛙种子的获胜次数。所以我进入这个数据框,combats.csv:
并尝试计算每个宝可梦的获胜次数,根据ID进行识别(数字1代表妙蛙种子,2代表妙蛙草,等等)。
回答:
使用pd.join/pd.merge()
将combates
和pokemon
合并,这样你就可以获取First_/Second_pokemon
的名称。其余的就简单了。