[PYTHON] Pokemon x Data Science (2) - Testversion des Denkens über den Partyaufbau des Pokemon-Schwertschilds aus der Netzwerkanalyse

Hallo, geht es um die fortgesetzte Visualisierung von Pokemon im vorherigen Artikel](https://qiita.com/b_aka/items/7d2b768dfa7817f34fc2).

Es ist keine Übertreibung zu sagen, dass der Schlüssel zu einer Pokemon-Kampfumgebung darin besteht, eine Gruppe aufzubauen, die das Ergebnis bestimmt.

Wenn ich diesmal über den Aufbau der Party nachdenke, möchte ich die Kraft des Netzwerks nutzen, um die Beziehung zwischen Pokemon zu verstehen.

Der vollständige Code stammt von hier

Datenimport

Für die Daten verwenden wir das Ranking "ALL_SEASON_TEMOTI_POKEMON.csv", das zusammen mit den im vorherigen Artikel erstellten Daten übernommen wurde. (* Es wird automatisch erstellt, wenn Sie "main.py" von [hier] ausführen (https://github.com/moxak/pokemon-rankbattle-data-transformer).)

Der Pfad zu diesen Daten

file_path = 'ALL_SEASON_TEMOTI_POKEMON.Pfad zu csv'

Definieren Sie dann die folgende Funktion

import pandas as pd

def make_edge_list(file_path):
    df = pd.read_csv(file_path, encoding='utf-8')
    df = df.groupby(['Pokemon','Pokemon mit einer hohen Kombinationsrate'])['Rank_Pokemon mit einer hohen Kombinationsrate'].mean()
    df = pd.DataFrame(df).reset_index()
    df.columns = ['From', 'To', 'Weight']
    df['Weight'] = 10-df['Weight']
    return df

Lauf!

network = make_edge_list(file_path)

Wenn Sie die folgenden Daten erhalten können, sind Sie erfolgreich. Da ein gerichteter Graph (mit Ausrichtung an der Kante) gezeichnet wird, sind der Start- und Endpunkt des Knotens und das Gewicht der Kante das erforderliche Minimum. Dieses Mal wird ein bestimmtes Pokemon als Startpunkt der Kante (From) festgelegt, das Pokemon, das häufig zusammen übernommen wird, wird als Endpunkt der Kante (To) festgelegt, und das Gewicht der Kante wird als Umkehrung des durchschnittlichen Ranges festgelegt.

From To Weights
Eisen Achilleine 6.60
Eisen Yessan 3.00
Eisen Windig 4.22
... ... ...

35732 rows × 3 columns

Datenverarbeitung

Wenn Sie diese Daten so wie sie sind in das Netzwerk werfen, wird es schwierig, weil es zu viele Knoten und Kanten gibt (es wird extrem schwierig sein, sie zu visualisieren, während die Berechnungszeit abgelaufen ist). Grenzen Sie die Daten daher ein. Beeilen Sie sich Speichern Sie das Rekrutierungsranking in Staffel 12 als CSV mit dem folgenden Code.

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"}_Ranking der Rekrutierungsrate.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 (Standard)"
        elif form == 1:
            name = "Rotom (Di)"
        elif form == 2:
            name = "Rotom (Mittwoch)"
        elif form == 3:
            name = "Rotom (Eis)"
        elif form == 4:
            name = "Rotom (fliegend)"
        elif form == 5:
            name = "Rotom (Gras)"
    else:
        name = pokedex['poke'][int(num) -1]
    return name

Datachunk \ IDs.json in diesem Repository -transformer / blob / main / datachunk / IDs.json) und [datachunk \ bundle.json](https://github.com/moxak/pokemon-rankbattle-data-transformer/blob/main/datachunk/bundle. json) wird geladen.

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)

Gehen Sie wie folgt vor, um Rangdaten für die Staffeln 1-12 zu erhalten.

make_pokemon_rank(ids)

Transformieren Sie das Ranking der Adoptionsrate von json in csv.

season_num = 12
rule = 'Single'
with open(f'Season{season_num}_{rule}_Ranking der Rekrutierungsrate.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)

Danach werden wir diese Daten lesen und uns ab der 12. Staffel auf die Top 150 in der Rekrutierungsrate beschränken.

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

Visualisierung mit Networkx

Informationen zum Betrieb von Networkx in Python finden Sie unter hier.

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

Ich kann nichts lesen ... weinen

Die Anzahl der Knotenkanten ist enorm, und spring_layout (), wodurch das Networkx-Diagramm "gut" wird, scheint mit diesem Datensatz nicht kompatibel zu sein.

Es scheint, dass sich dies ändern wird, wenn Sie mit den Attributen spielen, die sich auf das Networkx-Zeichnen beziehen, aber auf jeden Fall hatte ich das Gefühl, dass die Visualisierung des Netzwerks mit Python eine Grenze hat, also werde ich Cytoscape ausprobieren.

Visualisierung mit Cytoscape

Versuchen Sie dann Cytoscape.

Dieser Artikel enthält sehr detaillierte Informationen zur Verwendung von Cytoscape.

Lesen Sie zuerst die Daten. Führen Sie den folgenden Code aus, um die Datei auszugeben.

make_edge_list(file_path).to_csv("FILE-NAME.csv", index = False)

Starten Sie Cytoscape und importieren Sie die Ausgabe der CSV-Datei früher aus "Datei"> "Importieren"> "Netzwerk aus Datei" oben links.

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

Sie sollten einen Bildschirm wie den folgenden sehen. Da dies ein gerichteter Graph ist, werde ich angeben, was jeder Knoten bedeutet. Da "Von" der Knoten ist, der der Startpunkt der Kante ist, "Quellknoten" und "Bis" der Knoten ist, der der Endpunkt der Kante ist, sind "Zielknoten" und "Gewicht" die Gewichte der Kante, daher verwenden wir "Kantenattribut".

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

Als ich mit der oberen Registerkarte "Layout" und der linken Registerkarte "Stil" herumgespielt habe, habe ich etwas bekommen, das ziemlich nah an dem war, wonach ich gesucht habe.

Sie können sehen, dass sich die Kampfumgebung um Aceburn, Patch Ragon, Drapart und Togekiss dreht, die sich nahe der Mitte des Diagramms befinden und viele Kanten aufweisen.

tableau_viz_test.csv1.png

Cytoscape unterstützt interaktive Vorgänge wie das Verschieben von Knoten durch Ziehen. Es ist sehr gut, dass Sie intuitive Versuche ausführen können, indem Sie verschiedene Vorgänge ausführen, z. B. das Ändern von Stilen mit GUI-Vorgängen.

Das nächste Mal möchte ich mit diesem Netzwerk analysieren. Wir sehen uns wieder.

Quelle

© 2020 Pokémon © 1995-2020 Nintendo / Creatures Inc./GAME FREAK Inc. Pocket Monsters, Pokemon und Pokémon sind eingetragene Marken von Nintendo, Creatures und Game Freak.

Recommended Posts

Pokemon x Data Science (2) - Testversion des Denkens über den Partyaufbau des Pokemon-Schwertschilds aus der Netzwerkanalyse
Pokemon x Data Science (3) - Denken Sie an die Partykonstruktion des Pokemon-Schwertschilds aus der Netzwerkanalyse. Wo befindet sich das Zentrum des Netzwerks?