database store graph

This commit is contained in:
HaoYizhi 2023-03-16 15:07:43 +08:00
parent 9435484e3f
commit 082864814b
11 changed files with 62 additions and 31 deletions

Binary file not shown.

Binary file not shown.

View File

@ -8,7 +8,8 @@ import random
import pandas as pd import pandas as pd
import numpy as np import numpy as np
import platform import platform
import networkx as nx
import json
class ControllerDB: class ControllerDB:
dct_parameter = None dct_parameter = None
@ -41,6 +42,8 @@ class ControllerDB:
Firm = pd.read_csv("Firm_amended.csv") Firm = pd.read_csv("Firm_amended.csv")
Firm['Code'] = Firm['Code'].astype('string') Firm['Code'] = Firm['Code'].astype('string')
Firm.fillna(0, inplace=True) Firm.fillna(0, inplace=True)
# fill dct_lst_init_remove_firm_prod
list_dct = [] list_dct = []
for _, row in Firm.iterrows(): for _, row in Firm.iterrows():
code = row['Code'] code = row['Code']
@ -52,19 +55,35 @@ class ControllerDB:
list_dct = [{'133': ['1.4.4.1']}] list_dct = [{'133': ['1.4.4.1']}]
# list_dct = [{'2': ['1.1.3']}] # list_dct = [{'2': ['1.1.3']}]
# list_dct = [{'135': ['1.3.2.1']}] # list_dct = [{'135': ['1.3.2.1']}]
# fill g_bom
BomNodes = pd.read_csv('BomNodes.csv', index_col=0)
BomNodes.set_index('Code', inplace=True)
BomCateNet = pd.read_csv('BomCateNet.csv', index_col=0)
BomCateNet.fillna(0, inplace=True)
g_bom = nx.from_pandas_adjacency(BomCateNet.T,
create_using=nx.MultiDiGraph())
bom_labels_dict = {}
for code in g_bom.nodes:
bom_labels_dict[code] = BomNodes.loc[code].to_dict()
nx.set_node_attributes(g_bom, bom_labels_dict)
g_product_js = json.dumps(nx.adjacency_data(g_bom))
# insert exp
for idx_exp, dct in enumerate(list_dct): for idx_exp, dct in enumerate(list_dct):
self.add_experiment_1(idx_exp, self.dct_parameter['n_max_trial'], self.add_experiment_1(idx_exp, self.dct_parameter['n_max_trial'],
dct) dct, g_product_js) # same g_bom for all exp
print(f'Inserted experiment for exp {idx_exp}!') print(f'Inserted experiment for exp {idx_exp}!')
def add_experiment_1(self, idx_exp, n_max_trial, def add_experiment_1(self, idx_exp, n_max_trial,
dct_lst_init_remove_firm_prod): dct_lst_init_remove_firm_prod, g_bom):
e = Experiment( e = Experiment(
idx_exp=idx_exp, idx_exp=idx_exp,
n_sample=int(self.dct_parameter['n_sample']), n_sample=int(self.dct_parameter['n_sample']),
n_iter=int(self.dct_parameter['n_iter']), n_iter=int(self.dct_parameter['n_iter']),
n_max_trial=n_max_trial, n_max_trial=n_max_trial,
dct_lst_init_remove_firm_prod=dct_lst_init_remove_firm_prod) dct_lst_init_remove_firm_prod=dct_lst_init_remove_firm_prod,
g_bom=g_bom)
db_session.add(e) db_session.add(e)
db_session.commit() db_session.commit()

View File

@ -7,6 +7,7 @@ from firm import FirmAgent
from product import ProductAgent from product import ProductAgent
from orm import db_session, Result from orm import db_session, Result
import platform import platform
import json
class Model(ap.Model): class Model(ap.Model):
@ -20,18 +21,8 @@ class Model(ap.Model):
self.dct_lst_remove_firm_prod = self.p.dct_lst_init_remove_firm_prod self.dct_lst_remove_firm_prod = self.p.dct_lst_init_remove_firm_prod
# init graph bom # init graph bom
BomNodes = pd.read_csv('BomNodes.csv', index_col=0) G_bom = nx.adjacency_graph(json.loads(self.p.g_bom))
BomNodes.set_index('Code', inplace=True) self.product_network = ap.Network(self, G_bom)
BomCateNet = pd.read_csv('BomCateNet.csv', index_col=0)
BomCateNet.fillna(0, inplace=True)
G_bom = nx.from_pandas_adjacency(BomCateNet.T,
create_using=nx.MultiDiGraph())
bom_labels_dict = {}
for code in G_bom.nodes:
bom_labels_dict[code] = BomNodes.loc[code].to_dict()
nx.set_node_attributes(G_bom, bom_labels_dict)
# init graph firm # init graph firm
Firm = pd.read_csv("Firm_amended.csv") Firm = pd.read_csv("Firm_amended.csv")
@ -90,13 +81,8 @@ class Model(ap.Model):
}) for succ_firm in lst_choose_firm] }) for succ_firm in lst_choose_firm]
G_Firm.add_edges_from(lst_add_edge) G_Firm.add_edges_from(lst_add_edge)
self.sample.g_firm = json.dumps(nx.adjacency_data(G_Firm))
self.firm_network = ap.Network(self, G_Firm) self.firm_network = ap.Network(self, G_Firm)
self.product_network = ap.Network(self, G_bom)
out_file = open("myfile.json", "w")
import json
json.dump(nx.adjacency_data(G_Firm), out_file)
out_file.close()
# init product # init product
for ag_node, attr in self.product_network.graph.nodes(data=True): for ag_node, attr in self.product_network.graph.nodes(data=True):
@ -151,6 +137,10 @@ class Model(ap.Model):
# draw network # draw network
# self.draw_network() # self.draw_network()
out_file = open("myfile.json", "w")
json.dump(nx.adjacency_data(G_Firm), out_file)
out_file.close()
def update(self): def update(self):
self.a_lst_total_firms.clean_before_time_step() self.a_lst_total_firms.clean_before_time_step()
# output # output

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 709 KiB

After

Width:  |  Height:  |  Size: 3.0 MiB

BIN
network1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

3
orm.py
View File

@ -46,6 +46,7 @@ class Experiment(Base):
# variables # variables
n_max_trial = Column(Integer, nullable=False) n_max_trial = Column(Integer, nullable=False)
dct_lst_init_remove_firm_prod = Column(PickleType, nullable=False) dct_lst_init_remove_firm_prod = Column(PickleType, nullable=False)
g_bom = Column(Text(4294000000), nullable=False)
sample = relationship('Sample', back_populates='experiment', lazy='dynamic') sample = relationship('Sample', back_populates='experiment', lazy='dynamic')
@ -65,7 +66,7 @@ class Sample(Base):
ts_done = Column(DateTime(timezone=True), onupdate=func.now()) ts_done = Column(DateTime(timezone=True), onupdate=func.now())
stop_t = Column(Integer, nullable=True) stop_t = Column(Integer, nullable=True)
firm_network = Column(Text(4294000000), nullable=True) g_firm = Column(Text(4294000000), nullable=True)
experiment = relationship('Experiment', back_populates='sample', uselist=False) experiment = relationship('Experiment', back_populates='sample', uselist=False)
result = relationship('Result', back_populates='sample', lazy='dynamic') result = relationship('Result', back_populates='sample', lazy='dynamic')

View File

@ -65,13 +65,6 @@
"list_succ_firms = [1, 1]\n", "list_succ_firms = [1, 1]\n",
"round(share * len(list_succ_firms)) if round(share * len(list_succ_firms)) > 0 else 1" "round(share * len(list_succ_firms)) if round(share * len(list_succ_firms)) > 0 else 1"
] ]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
} }
], ],
"metadata": { "metadata": {

28
test.py Normal file
View File

@ -0,0 +1,28 @@
import networkx as nx
import json
in_file = open("myfile.json", "r")
js_file = json.load(in_file)
in_file.close()
firm_network = nx.adjacency_graph(js_file)
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
pos = nx.nx_agraph.graphviz_layout(firm_network, prog="twopi", args="")
node_label = nx.get_node_attributes(firm_network, 'Name')
# print(node_label)
node_degree = dict(firm_network.out_degree())
node_label = {
key: f"{node_label[key]} {node_degree[key]}"
for key in node_label.keys()
}
node_size = list(nx.get_node_attributes(firm_network, 'Revenue_Log').values())
node_size = list(map(lambda x: x**2, node_size))
edge_label = nx.get_edge_attributes(firm_network, "Product")
# multi(di)graphs, the keys are 3-tuples
edge_label = {(n1, n2): label for (n1, n2, _), label in edge_label.items()}
plt.figure(figsize=(12, 12), dpi=300)
nx.draw(firm_network, pos, node_size=node_size, labels=node_label, font_size=6)
nx.draw_networkx_edge_labels(firm_network, pos, edge_label, font_size=4)
plt.savefig("network1.png")