[PYTHON] Essayez de dessiner un graphe social à l'aide de l'API Twitter v2

Chose que tu veux faire

  1. Je veux vérifier si je peux dessiner un graphique ← ici --Je veux faire un graphe social des relations sur Twitter ――Je souhaite ajuster la proximité de la distance et l'épaisseur de la ligne en fonction de la force de la relation. ――Je veux observer le processus de formation des grappes

Qu'est-ce que l'API Twitter

API qui peut obtenir des données sur Twitter

Pour plus d'informations,

Pour la méthode d'acquisition de l'API, reportez-vous au Résumé des procédures de l'enregistrement de l'API Twitter (méthode de demande de compte) à l'approbation

Graphique social

Social graph - Wikipedia The social graph is a graph that represents social relations between entities. In short, it is a model or representation of a social network, where the word graph has been taken from graph theory.

Un graphique montrant la relation sociale entre les objets (= nœuds). Exprimez l'amitié avec une ligne (= bord).

Sujet principal

Préparation

L'acquisition d'API est omise

Importation de bibliothèque

import json
import random
import pandas as pd
import matplotlib.pyplot as plt
from requests_oauthlib import OAuth1Session
import emoji
import networkx as nx

Stocker le jeton dans la variable

CK = '***************************'
CS = '***************************'
AT = '***************************'
ATS ='***************************'

Définition des fonctions

def get_twitter_session():
    return OAuth1Session(CK, CS, AT, ATS)

Décidez de ce que vous voulez dessiner

user_list = ['himemoriluna','tokoyamitowa', 'amanekanatach','tsunomakiwatame','kiryucoco']

Créer un dictionnaire simple pour le dessin

user_id_list = []
user_name_list = []
for user_screenname_t in user_list:
    ENDPOINT = 'https://api.twitter.com/1.1/users/show.json'
    SEARCH_WORD_SCREENNAME = user_screenname # twitter_ID

    twitter = get_twitter_session()
    params = {'screen_name': SEARCH_WORD_SCREENNAME}
    req = twitter.get(ENDPOINT, params=params)
    req_json = json.loads(req.text)
    user_id_list += [req_json['id']]
    user_name_list += [req_json['name']]


target_id_dict = {}
for i in range(0,5):
    target_id_dict[user_id_list[i]] = user_list[i]

# {1200396798281445376: 'himemoriluna',
#  1200357161747939328: 'tokoyamitowa',
#  1200396304360206337: 'amanekanatach',
#  1200397643479805957: 'tsunomakiwatame',
#  1200397238788247552: 'kiryucoco'}

target_name_dict = {}
for i in range(0,5):
    target_name_dict[user_list[i]] = user_name_list[i]

# {'himemoriluna': 'Himemori Luna',
#  'tokoyamitowa': 'Towa éternel',
#  'amanekanatach': 'Kanata Amane',
#  'tsunomakiwatame': 'Pour enroulement carré',
#  'kiryucoco': 'Kiryu Coco'}

Obtenez des données

ʻObtenir l'utilisateur que l'utilisateur spécifié par user_list` suit et conserver le résultat dans le type de dictionnaire.

follow_ids_dict = {}
for user_id in user_id_list:
    ENDPOINT = 'https://api.twitter.com/1.1/friends/ids.json'
    SEARCH_WORD_ID = user_id

    twitter = get_twitter_session()
    params = {'screen_name': SEARCH_WORD_SCREENNAME}
    req = twitter.get(ENDPOINT, params=params)

    #Obtenez jusqu'à 5000 informations de suivi
    follow_ids = json.loads(req.text)
    follow_ids_dict[user_id] = follow_ids['ids']

Créer un dictionnaire pour contenir les noms d'utilisateurs

follow_name_dict = {}
follow_screenname_dict = {}
for user_id in follow_ids_dict.keys():
    follow_name_list = []
    follow_screenname_list = []
    for user_id_nt in follow_ids_dict[user_id]:
        ENDPOINT = endpoint['user']
        SEARCH_WORD_ID = user_id_nt

        twitter = get_twitter_session()
        params = {'user_id': SEARCH_WORD_ID}
        req = twitter.get(ENDPOINT, params=params)

        req_json = json.loads(req.text)

        follow_name_list += [req_json['name']]
        follow_screenname_list += [req_json["screen_name"]]

    follow_name_dict[target_name_dict[user_id]] = follow_name_list
    follow_screenname_dict[target_name_dict[user_id]] = follow_screenname_list

Création de DataFrame

Cette fois, nous allons visualiser un graphe dans lequel les branches sont orientées (branches dirigées) et les branches sont pondérées.

(C'est gênant si le pictogramme est affiché au passage, alors supprimez-le)

def remove_emoji(str_):
    return ''.join(c for c in str_ if c not in emoji.UNICODE_EMOJI)
#Sélectionnez l'un des éléments suivants
# use_dict = follow_ids_dict #Visualisez avec un ID interne
# use_dict = follow_screenname_dict #Identifiant d'utilisateur(@xxxx)Visualisez avec
use_dict = follow_name_dict #Visualiser par nom d'utilisateur

Row_From = [] #point de départ
Row_To = [] #point final

for i in use_dict.keys():
    for j in follow_name_dict[i]:
        Row_From += [remove_emoji(target_name_dict[i])]
        Row_To += [remove_emoji(j)]

result = pd.DataFrame(
    data={'From':Row_From, 'To':Row_To},
    columns=['From', 'To'])

result.head()
From To
0 Himemori Luna Talent Otouf
1 Himemori Luna ROG Global
2 Himemori Luna Fall Guys
3 Himemori Luna Tomari
4 Himemori Luna Nishizawa 5㍉

Puisque le but de ce temps est une expérience de visualisation, le poids de la branche est décidé de manière appropriée avec un nombre aléatoire.

def return_randint(num):
    return random.randrange(1, 10000)/1000000000
result['WC'] = 0
result['WC'] = result['WC'].apply(return_randint)
network = result
From To WC
0 Himemori Luna Talent Otouf 7.649000e-06
1 Himemori Luna ROG Global 7.657000e-06
2 Himemori Luna Fall Guys 9.127000e-06
3 Himemori Luna Tomari 4.878000e-06
4 Himemori Luna Nishizawa 5㍉ 8.054000e-06

Visualisation

La valeur par défaut font_family ne peut afficher que des caractères alphanumériques. Précisez parce que vous souhaitez afficher le japonais.

network_np = network.values
G = nx.DiGraph()
G.add_weighted_edges_from(network_np)

weighted_edges = []
for i in range(len(network)):
    weighted_edges += [list(network.iloc[i])]

G_practice = nx.DiGraph()

G_practice.add_weighted_edges_from(weighted_edges)
pos=nx.spring_layout(G)

fig = plt.figure(figsize=(40, 40), dpi=100,facecolor='w', linewidth=0, edgecolor='w')
nx.draw_networkx(G_practice,pos,font_size=16,font_family='IPAexGothic')
fig.show()

image.png

↑ j'ai pu dessiner quelque chose comme ça ('ω')

Perspectives d'avenir

Cette fois, le graphique des relations sociales a été réalisé à partir des informations de suivi sur Tiwtter. À l'avenir, nous rechercherons des variables qui peuvent décrire les relations avec plus de précision et, sur cette base, nous ajusterons les poids des branches et les découperons.

référence

Recommended Posts

Essayez de dessiner un graphe social à l'aide de l'API Twitter v2
Essayez d'utiliser l'API Twitter
Essayez d'utiliser l'API Twitter
Dessin graphique avec matplotlib
Essayez de supprimer des tweets en masse à l'aide de l'API de Twitter
Essayez d'utiliser l'API PeeringDB 2.0
Créez un robot de réponse automatique en temps réel à l'aide de l'API Twitter Streaming
Essayez d'utiliser l'API Admin de la passerelle Janus
Dessiner une courbe Silverstone en utilisant Python
Essayez d'utiliser l'API de Pleasant (python / FastAPI)
Essayez d'utiliser l'API d'action de Python argparse
Créer une API CRUD à l'aide de l'API rapide
Utilisation du dessin de graphe à l'aide de Matplotlib + Seaborn de Python sous Windows, un environnement d'exécution non Python
Essayez d'utiliser l'API Wunderlist en Python
Essayez d'utiliser l'API Kraken avec Python
Comment dessiner un graphique avec Matplotlib
Essayez de dessiner une animation simple en Python
Essayez de dessiner une distribution normale avec matplotlib
J'ai essayé d'utiliser l'API de données YOUTUBE V3
J'ai essayé de dessiner une ligne en utilisant une tortue
Tweet à l'aide de l'API Twitter en Python
Créer un graphique à l'aide du module Sympy
Essayez d'utiliser un langage de programmation probabiliste (Pyro)
Essayez de dessiner une carte avec python + cartopy 0.18.0
Essayez d'utiliser Platypus, une bibliothèque d'optimisation polyvalente
Dessinez un graphique avec PyQtGraph Part 1-Drawing
Apprentissage par renforcement 10 Essayez d'utiliser un réseau neuronal formé.
Essayez d'utiliser le code QR avec Raspberry Pi
100 langage de traitement knock-79 (en utilisant scikit-learn): dessin de graphe avec rappel de précision
Essayez d'utiliser l'API BitFlyer Ligntning en Python
Essayez d'utiliser Sourcetrail, un outil de visualisation de code source
Créons une API REST en utilisant SpringBoot + MongoDB
Essayez l'authentification OAuth Slack avec Flask (API Slack V2)
Essayez de dessiner un diagramme de contour en utilisant matplotlib avec OpenFOAM
Essayez d'utiliser l'API kabu station de au Kabucom Securities
Essayez de dessiner une carte avec le package folium de Python
Préparer un pseudo serveur API à l'aide d'actions GitHub
Essayez d'utiliser l'API ChatWork et l'API Qiita en Python
Essayez d'utiliser l'API DropBox Core avec Python