基于知识图谱分析贸易关系走向

前言

  • 知识图谱是一种用图模型来描述知识和建模世界万物之间的关联关系的技术方法。在贸易关系的分析中,知识图谱可以将各个国家、地区、商品、贸易政策等作为节点,而它们之间的贸易关系、依赖程度、政策影响等作为边,从而形成一个复杂的网络结构。本文主要分析企业之间的贸易关系来往。
  • 基于收集和处理后的数据,构建知识图谱。每个企业用一个节点表示,而企业之间的关系用边表示。利用可视化技术,将知识图谱以图形化的方式展示出来,便于直观地观察和分析贸易关系的走向。
  • 通过分析企业之间的贸易依存度,可以了解它们之间的贸易紧密程度,从而预测贸易关系的走向。通过基于知识图谱的贸易关系分析,我们可以更深入地了解各个企业之间的贸易关系,预测其未来的走向,为政策制定和商业决策提供有力的支持。此外,通过可视化展示,我们还可以更直观地观察和分析贸易关系的动态变化,提高分析的效率和准确性。

一、基础数据

本博文利用random生成一些随机关系数据,生成关系数据中有两个参数,具体的含义解释如下。

参数含义
n n n最多有 n n n 个节点出发生成关系数据
n e i g h b o r neighbor neighbor每个节点的关系最多走向 n e i g h b o r neighbor neighbor个节点,在数学上成为出度

详细构造数据的函数代码如下:

import random
#构造一个有向图
def build_graph(n, neighbor):
    #n最大起始节点个数
    #neighbor最大出度
    #存储图结构
    node_name = [i for i in range(2*n)]
    graph = dict()
    #存储起始节点
    start = set()
    for i in range(n):
        node = random.choice(node_name)
        if node in start:
            continue
        else:
            start.add(node)
            graph[node] = list()
            for j in range(neighbor):
                target = random.choice(node_name)
                if target != node and target not in graph[node]:
                    graph[node].append(target)
    nodes = []
    rela = 0
    for i in graph.keys():
        nodes.extend(graph[i])
        rela += len(graph[i])
        nodes.extend(list(graph.keys()))
    nodes = list(set(nodes))
    print("Build graph success: %d nodes, %d edges." % (len(nodes), rela))
    return graph

二、贸易规则

序号规则内容
1企业优先与大企业发生贸易
2企业暂停与小企业发生贸易
3大企业为与之发生贸易较多的企业
4小企业为与之发生贸易较少的企业
  • 企业优先与大企业发生贸易
    演进过程中,企业选择与其非关联的企业发生关系时,选择那入度最大的企业。
  • 企业暂停与小企业发生贸易
    演进过程中,企业删除与邻居企业中入度最小的关系,如果邻居企业是知识图谱中入度最大的企业则不删除。
  • 大企业为与之发生贸易较多的企业
    大企业假设为入度比较大的企业。
  • 小企业为与之发生贸易较少的企业
    小企业假设为入度比较小的企业。
def iter(G):
    #代表贸易收入
    in_degree = pd.DataFrame(G.in_degree(), columns = ['node', 'in_degree'])
    add_relas = []
    delete_relas = []
    for node in nodes:
        #找到贸易收入最大的客群
        max_degree = max(G.in_degree(), key=lambda x:x[1])[1]
        max_nodes = in_degree.loc[in_degree['in_degree']==max_degree]['node']
        neighbors = list(G.successors(node))
        #增加贸易关系
        add_nodes = list(set(max_nodes) - {node} -set(neighbors))[:]
        add_rela = [(node, j) for j in add_nodes]
        add_relas.extend(add_rela)
        #减少邻居中贸易较低的客户
        delete_rela = []
        if len(neighbors)>1:
            min_v = min([G.in_degree()[neighbor] for neighbor in neighbors])
            for neighbor in neighbors:
                if G.in_degree()[neighbor] == min_v and min_v != max_degree:
                    delete_rela.append((node, neighbor))
            delete_relas.extend(delete_rela[:])
    G.add_edges_from(add_relas)
    G.remove_edges_from(delete_relas)
    G = graph_plot(G.nodes(), G.edges())

三、知识图谱可视化

  • 为了能够看清楚知识图谱演进过程,利用nx.draw_networkx中,固定位置pos作图。
  • 因为graph_plot函数不仅是作图可视化,同时也要返回更新后的G,方便下一步迭代。
#利用字典构造一张图
import networkx as nx
import matplotlib.pyplot as plt
def graph_plot(nodes, relas):
    num = int(len(nodes)**(0.5)) + 1
    earth = []
    for i in range(num):
        for j in range(num):
            earth.append((i,j))
    G = nx.DiGraph()
    # 添加对应的边和点
    for node in nodes:
        # 结点名称不能为str,desc为标签即结点名称
        G.add_node(node, desc=str(node))
    # 添加边,参数name为边权值
    G.add_edges_from(relas)
    
    pos = earth[:]
    # 按pos所定位置画出节点,无标签无权值
    nx.draw_networkx(G, pos, with_labels=None, node_color="tab:blue", edge_color="tab:green", node_size = 800)

    # 画出标签
    node_labels = nx.get_node_attributes(G, 'desc')
    nx.draw_networkx_labels(G, pos, labels=node_labels)
    plt.title('fixed graph', fontsize=10)
    plt.show()
    return G

四、完整代码

贸易关系最终流向大贸易企业,当然这与我们假设条件的设定有很大的关系。

from build_graph import build_graph
from graph_plot import graph_plot
import networkx as nx
import pandas as pd
graph = build_graph(12, 3)
nodes = []
relas = []
for i in graph.keys():
    nodes.extend(graph[i])
    nodes.extend(list(graph.keys()))
    relas.extend([(i, j) for j in graph[i]])
nodes = list(set(nodes))
print("Get the data graph success: %d nodes, %d edges." % (len(nodes), len(relas)))
G = graph_plot(nodes, relas)
def iter(G):
    tmp = G.copy()
    #代表贸易收入
    in_degree = pd.DataFrame(G.in_degree(), columns = ['node', 'in_degree'])
    add_relas = []
    delete_relas = []
    for node in nodes:
        #找到贸易收入最大的客群
        max_degree = max(G.in_degree(), key=lambda x:x[1])[1]
        max_nodes = in_degree.loc[in_degree['in_degree']==max_degree]['node']
        neighbors = list(G.successors(node))
        #增加贸易关系
        add_nodes = list(set(max_nodes) - {node} -set(neighbors))[:]
        add_rela = [(node, j) for j in add_nodes]
        add_relas.extend(add_rela)
        #减少邻居中贸易收入较低的客户
        delete_rela = []
        if len(neighbors)>1:
            min_v = min([G.in_degree()[neighbor] for neighbor in neighbors])
            for neighbor in neighbors:
                if G.in_degree()[neighbor] == min_v and min_v != max_degree:
                    delete_rela.append((node, neighbor))
            delete_relas.extend(delete_rela[:])
    G.add_edges_from(add_relas)
    G.remove_edges_from(delete_relas)
    G = graph_plot(G.nodes(), G.edges())
v_index = 0
count = 0
for i in range(100):
    print('=>'*20, i)
    if max(G.in_degree(), key=lambda x:x[1])[1] > v_index:
        v_index = max(G.in_degree(), key=lambda x:x[1])[1]
    else:
        count = count + 1
        if count > 5:
            break
    iter(G)

初始图
在这里插入图片描述

演进图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值