Bonjour, parle de la visualisation continue de Pokemon dans l'article précédent](https://qiita.com/b_aka/items/7d2b768dfa7817f34fc2).
Il n'est pas exagéré de dire que la clé d'un environnement de combat Pokémon est de savoir comment créer un groupe, ce qui détermine le résultat.
Cette fois, en pensant à la construction de la fête, j'aimerais utiliser la puissance du réseau pour comprendre la relation entre Pokémon.
Le code complet provient de ici
Pour les données, nous utiliserons le classement ALL_SEASON_TEMOTI_POKEMON.csv
qui a été adopté avec les données créées dans l'article précédent.
(* Il est créé automatiquement lorsque vous exécutez main.py
de here.)
Le chemin vers ces données
file_path = 'ALL_SEASON_TEMOTI_POKEMON.Chemin vers csv'
Ensuite, définissez la fonction suivante
import pandas as pd
def make_edge_list(file_path):
df = pd.read_csv(file_path, encoding='utf-8')
df = df.groupby(['Pokemon','Pokémon avec un taux de combinaison élevé'])['Rank_Pokémon avec un taux de combinaison élevé'].mean()
df = pd.DataFrame(df).reset_index()
df.columns = ['From', 'To', 'Weight']
df['Weight'] = 10-df['Weight']
return df
Courir!
network = make_edge_list(file_path)
Si vous pouvez obtenir les données suivantes, vous avez réussi. Puisqu'un graphe orienté (avec une orientation au bord) est dessiné, les points de début et de fin du nœud et le poids du bord sont le minimum requis. Cette fois, un certain Pokémon est défini comme point de départ du bord (De), le Pokémon qui est souvent adopté ensemble est défini comme point final du bord (To), et le poids du bord est défini comme l'inverse du rang moyen.
From | To | Weights |
---|---|---|
Le fer | Achilleine | 6.60 |
Le fer | Yessan | 3.00 |
Le fer | Venteux | 4.22 |
... | ... | ... |
35732 rows × 3 columns
Si ces données sont jetées dans le réseau telles quelles, ce sera difficile car il y a trop de nœuds et d'arêtes (il sera extrêmement difficile à visualiser pendant que le temps de calcul est écoulé), donc affinez les données. Dépêchez-vous Enregistrez le classement de recrutement de la saison 12 en tant que csv avec le code suivant.
import urllib.request
import json
import datetime
def make_pokemon_rank(ids):
for season_number in ids['list'].keys():
for season_id in ids['list'][season_number].keys():
rst = ids['list'][season_number][season_id]['rst']
ts2 = ids['list'][season_number][season_id]['ts2']
url = f'https://resource.pokemon-home.com/battledata/ranking/{season_id}/{rst}/{ts2}/pokemon'
file_name = f'Season{season_number}_{"Single" if season_id[4]=="1" else "Double"}_Classement des taux de recrutement.json'
if get_response_pokemon_rank(url, file_name):
with open('log', 'a') as f:
print(f'{datetime.datetime.now()} | Generated: {file_name}', file=f)
def get_response_pokemon_rank(url, file_name):
try:
with urllib.request.urlopen(url) as response:
body = json.loads(response.read())
with open(f'{file_name}', 'w') as f:
json.dump(body, f, indent=4)
return True
except urllib.error.URLError as e:
print(e.reason)
return False
def translate_pokemion_name(num, form):
if num == 876:
if form == 0:
name = "Yessan ♂"
else:
name = "Yessan ♀"
elif num == 479:
if form == 0:
name = "Rotom (par défaut)"
elif form == 1:
name = "Rotom (mar.)"
elif form == 2:
name = "Rotom (mercredi)"
elif form == 3:
name = "Rotom (glace)"
elif form == 4:
name = "Rotom (volant)"
elif form == 5:
name = "Rotom (herbe)"
else:
name = pokedex['poke'][int(num) -1]
return name
Datachunk \ IDs.json
dans ce référentiel -transformer / blob / main / datachunk / IDs.json) et [datachunk \ bundle.json
](https://github.com/moxak/pokemon-rankbattle-data-transformer/blob/main/datachunk/bundle. json) est chargé.
ids = "";
with open('.//datachunk//IDs.json', 'r', encoding='utf-8') as json_open:
ids = json.load(json_open)
pokedex = "";
with open('.//datachunk//bundle.json', 'r', encoding='utf-8') as json_open:
pokedex = json.load(json_open)
Procédez comme suit pour obtenir des données de classement pour les saisons 1 à 12.
make_pokemon_rank(ids)
Transformez le classement de recrutement de json en csv.
season_num = 12
rule = 'Single'
with open(f'Season{season_num}_{rule}_Classement des taux de recrutement.json', 'r', encoding='utf-8') as json_open:
data = json.load(json_open)
seasons = []
rules = []
pokemons = []
ranks = []
for index, pokemon in enumerate(data):
seasons += [season_num]
rules += [rule]
pokemons += [translate_pokemion_name(pokemon['id'], pokemon['form'])]
ranks += [index+1]
df_a = pd.DataFrame(data=[seasons, rules, pokemons, ranks]).T
df_a.columns = ['Season', 'Rule', 'Pokemon', 'Rank']
df_a.to_csv(f'Season{season_num}_{rule}_Ado_Rank.csv', index=False)
Après cela, nous lirons ces données et nous nous rapprocherons du top 150 du classement des taux de recrutement à partir de la saison 12.
top150_list = list(df_a['Pokemon'])
network_top150 = network[network['From'].isin(top150_list[:150])]
network_top150 = network_top150[network_top150['To'].isin(top150_list[:150])]
Veuillez vous reporter à ici pour savoir comment utiliser Networkx en Python.
import matplotlib.pyplot as plt
import networkx as nx
plt.rcParams['font.family'] = 'IPAexGothic'
network_np = network_top150.values
G = nx.DiGraph()
G.add_weighted_edges_from(network_np)
pos=nx.spring_layout(G)
fig = plt.figure(figsize=(40, 40), dpi=100,facecolor='w', linewidth=0, edgecolor='w')
nx.draw_networkx(G,pos,font_size=16,font_family='IPAexGothic')
fig.show()
Je ne peux rien lire ... pleurer
Le nombre d'arêtes de nœuds est énorme, et spring_layout ()
, qui rend le graphe Networkx "bon", semble être incompatible avec ce jeu de données.
Il semble que cela changera si vous jouez avec les attributs liés au dessin Networkx, mais dans tous les cas, j'ai senti qu'il y avait une limite à la visualisation du réseau avec python, donc je vais essayer Cytoscape.
Ensuite, essayez Cytoscape.
Cet article décrit en détail comment utiliser Cytoscape.
Tout d'abord, lisez les données. Exécutez le code suivant pour sortir le fichier.
make_edge_list(file_path).to_csv("FILE-NAME.csv", index = False)
Démarrez Cytoscape et importez la sortie du fichier csv plus tôt à partir de file
> import
> Network from File
dans le coin supérieur gauche.
Vous devriez voir un écran comme celui ci-dessous. Puisqu'il s'agit d'un graphe orienté, je vais spécifier ce que signifie chaque nœud. Puisque «From» est le nœud qui est le point de départ du bord, «Noeud source» et «To» est le nœud qui est le point final du bord, donc «Nœud cible» et «Poids» sont les poids du bord, ils sont donc appelés «Attribut de bord».
Quand j'ai joué avec l'onglet supérieur «Mise en page» et l'onglet de gauche «Style», j'ai obtenu quelque chose qui était assez proche de ce que je cherchais.
Vous pouvez voir que l'environnement de combat tourne autour d'Aceburn, Patch Ragon, Drapart et Togekiss, qui sont près du centre du graphique et ont de nombreux bords étendus.
Cytoscape prend en charge les opérations interactives telles que le glissement de nœuds, et il est très bien que vous puissiez effectuer des essais et des erreurs intuitifs dans la mesure où vous pouvez effectuer diverses opérations telles que le changement de styles avec des opérations GUI.
La prochaine fois, j'aimerais analyser l'utilisation de ce réseau. À la prochaine.
© 2020 Pokémon © 1995-2020 Nintendo / Creatures Inc./GAME FREAK Inc. Pocket Monsters, Pokemon et Pokémon sont des marques déposées de Nintendo, Creatures et Game Freak.
Recommended Posts