[PYTHON] Pokemon x Data Science (2) - Version d'essai de la réflexion sur la construction de groupe du bouclier d'épée Pokemon à partir de l'analyse de réseau

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

Importation de données

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

Traitement de l'information

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])]

Visualisation avec Networkx

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()

networkx.png

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.

Visualisation avec 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.

スクリーンショット2020-11-05021410.png

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».

スクリーンショット2020-11-05021707.png

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.

tableau_viz_test.csv1.png

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.

La source

© 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

Pokemon x Data Science (2) - Version d'essai de la réflexion sur la construction de groupe du bouclier d'épée Pokemon à partir de l'analyse de réseau
Pokemon x Data Science (3) - Réflexion sur la construction de partie du bouclier d'épée Pokemon à partir de l'analyse du réseau Où est le centre du réseau?