利用networkx建立比特幣交易有向多重圖
一、內容簡介
上篇博客我們已經準備好了比特幣交易數據集,本次將依託networkx建立比特幣交易數據有向多重圖。
關於networkx的具體介紹可以看這裏 : https://networkx.org/
二、多向圖內容解釋
1、節點及其屬性
節點:交易賬戶地址,例如:16M3qXrGkAYppA1aJug49JtYDxQkdKGLW8
節點屬性:賬戶餘額(目前全部置0)
2、邊及其屬性
邊:由支出賬戶指向接收賬戶
邊屬性:1、交易哈希,例如:7f5a92db44be25414d5c322cc474bfcb94e538f5e511ff2776db6bf7c507bba0
2、區塊高度,交易所在區塊高度,例如:667300
3、出塊時間(時間戳),交易所在區塊出塊時間,例如:1611404276
4、交易金額,例如:0.002489832589155737
特別指出:如果出現兩個賬戶多次進行交易同樣可行,例如
16M3qXrGkAYppA1aJug49JtYDxQkdKGLW8->1387LuWrcYBcGtBsADix6Yo1iLox6VM4m1
進行了兩次交易,那麼節點之間的邊會有兩條
做了如下測試:
import networkx as nx
G=nx.MultiDiGraph()
G.add_nodes_from([1,2,3,4,5])
G.add_edges_from([(1,2,{
'color':'blue','weight':8}),(1,2,{
'color':'red','weight':9}),(1,3),(2,4),(1,4),(2,5)],)
nx.draw_networkx(G)
print(G[1][2])
輸出:節點1和2之間邊的屬性
{0: {'color': 'blue', 'weight': 8}, 1: {'color': red', 'weight': 9}}
注:即使是完全相同的屬性也會有兩條邊
三、完整代碼
from matplotlib import pyplot as plt
import networkx as nx
def main():
# 創建有向多重圖
g = nx.MultiDiGraph()
# 導入文本文件數據
with open('b_coin1.txt', 'r', encoding='utf-8') as fp:
for i in range(5): # 遍歷文件每條交易信息
data = fp.readline() # data存儲每行信息
string = data.split()
transaction = string[0] # 存儲交易哈希
block_height = string[1] # 存儲區塊高度
timestamp = string[2] # 存儲出塊時間
in_account = string[3] # 存儲支出地址
out_account = string[4] # 存儲收入地址
amount = string[5] # 存儲單次交易金額
# 加入節點:賬戶及其屬性(賬戶餘額,暫時全部置0)
g.add_nodes_from([(in_account, {
'balance': 0}), (out_account, {
'balance': 0})])
# 加入連邊:交易及其屬性
g.add_edge(in_account, out_account, transaction=transaction, block_height=block_height, timestamp=timestamp, amount=amount)
# 使用networkx和matplotlib畫出有向多重圖
nx.draw_networkx(g)
plt.show()
# 查詢節點及其屬性
find_nodes_attribute(g)
# 查詢連邊及其屬性
find_edges_attribute(g)
# 查詢節點及其屬性
def find_nodes_attribute(g):
# 遍歷節點
for idx, nd in enumerate(nx.nodes(g)):
print(idx) # 節點序號
print(nd) # 節點
print(g.nodes[nd]) # 節點屬性
# 查詢連邊及其屬性
def find_edges_attribute(g):
# 遍歷連邊
for ind, edge in enumerate(nx.edges(g)):
(u, v) = edge # 連邊
eg = g[u][v][0] # 連邊屬性
print(edge) # 查看連邊信息
print(eg) # 查看連邊屬性
if __name__ == "__main__":
main()
五、matplotlib繪製展示
上述代碼利用了matplotlib對數據集的前十條交易進行了繪製,如下圖: