import pandas as pd import numpy as np import matplotlib.pyplot as plt import networkx as nx import math plt.rcParams['font.sans-serif'] = 'SimHei' count_prod = pd.read_csv("analysis\\count_prod.csv") print(count_prod) # category print(count_prod.describe()) # pie count_prod_trim = count_prod[count_prod['count'] > 50] plt.pie(count_prod_trim['count'], labels=count_prod_trim['Name']) plt.savefig("analysis\\count_prod_pie") plt.close() # prod_networkx 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 = nx.from_pandas_adjacency(BomCateNet.T, create_using=nx.MultiDiGraph()) labels_dict = {} for code in G.nodes: node_attr = BomNodes.loc[code].to_dict() index_list = count_prod[count_prod['id_product'] == code].index.tolist() index = index_list[0] if len(index_list) == 1 else -1 node_attr['count'] = count_prod['count'].get(index, 0) node_attr['node_size'] = 5 * count_prod['count'].get(index, 0) node_attr['node_color'] = count_prod['count'].get(index, 0) labels_dict[code] = node_attr nx.set_node_attributes(G, labels_dict) # print(labels_dict) pos = nx.nx_agraph.graphviz_layout(G, prog="twopi", args="") dict_node_name = nx.get_node_attributes(G, 'Name') node_labels = {} for node in nx.nodes(G): node_labels[node] = f"{node} {str(dict_node_name[node])}" # node_labels[node] = f"{str(dict_node_name[node])}" colors = list(nx.get_node_attributes(G, 'node_color').values()) vmin = min(colors) vmax = max(colors) cmap = plt.cm.Blues fig = plt.figure(figsize=(10, 10), dpi=300) nx.draw(G, pos, node_size=list(nx.get_node_attributes(G, 'node_size').values()), labels=node_labels, font_size=6, node_color=colors, cmap=cmap, vmin=vmin, vmax=vmax, edge_color='grey') sm = plt.cm.ScalarMappable(cmap=cmap, norm=plt.Normalize(vmin=vmin, vmax=vmax)) sm._A = [] position = fig.add_axes([0.01, 0.05, 0.01, 0.3]) plt.colorbar(sm, fraction=0.01, cax=position) # plt.savefig("analysis\\count_prod_network") plt.close() # dcp_prod count_dcp = pd.read_csv("analysis\\count_dcp.csv", dtype={ 'up_id_firm': str, 'down_id_firm': str }) count_dcp_prod = count_dcp.groupby(['up_id_product','up_name_product', 'down_id_product', 'down_name_product'])['count'].sum() count_dcp_prod = count_dcp_prod.reset_index() count_dcp_prod.sort_values('count', inplace=True, ascending=False) count_dcp_prod.to_csv('analysis\\count_dcp_prod.csv', index=False, encoding='utf-8-sig') count_dcp_prod = count_dcp_prod[count_dcp_prod['count'] > 2] # print(count_dcp_prod) list_prod = count_dcp_prod['up_id_product'].tolist( ) + count_dcp['down_id_product'].tolist() list_prod = list(set(list_prod)) # init graph bom BomNodes = pd.read_csv('BomNodes.csv', index_col=0) BomNodes.set_index('Code', inplace=True) g_bom = nx.MultiDiGraph() g_bom.add_nodes_from(list_prod) bom_labels_dict = {} for code in list_prod: dct_attr = BomNodes.loc[code].to_dict() bom_labels_dict[code] = dct_attr nx.set_node_attributes(g_bom, bom_labels_dict) count_max = count_dcp_prod['count'].max() count_min = count_dcp_prod['count'].min() k = 5 / (count_max - count_min) for _, row in count_dcp_prod.iterrows(): # print(row) lst_add_edge = [( row['up_id_product'], row['down_id_product'], { 'count': row['count'] })] g_bom.add_edges_from(lst_add_edge) # dcp_networkx pos = nx.nx_agraph.graphviz_layout(g_bom, prog="dot", args="") node_labels = nx.get_node_attributes(g_bom, 'Name') temp = {} for key, value in node_labels.items(): temp[key] = key + " " + value node_labels = temp colors = nx.get_edge_attributes(g_bom, "count") colors = [w for (n1, n2, _), w in colors.items()] vmin = min(colors) vmax = max(colors) cmap = plt.cm.Blues # dct_row = {} # for node, p in pos.items(): # if p[1] not in dct_row.keys(): # dct_row[p[1]] = {node: p} # else: # dct_row[p[1]][node] = p # dct_row = dict(sorted(dct_row.items(), key=lambda d: d[0], reverse=True)) # dct_up = dct_row[max(dct_row.keys())] # dct_up = dict(sorted(dct_up.items(), key=lambda d: d[1][0], reverse=True)) # h = list(dct_row.keys())[0] - list(dct_row.keys())[1] # n = len(dct_up.items()) # arr_h = np.linspace(list(dct_row.keys())[0]-h/2, list(dct_row.keys())[0]+2*h, num=n) # dct_up_new = {} # for index, (node, p) in enumerate(dct_up.items()): # dct_up_new[node] = (p[0], arr_h[index]) # pos_new = {} # for row, dct in dct_row.items(): # if row == list(dct_row.keys())[0]: # pos_new.update(dct_up_new) # else: # pos_new.update(dct) pos_new ={} for node, p in pos.items(): pos_new[node] = (p[1], p[0]) fig = plt.figure(figsize=(6, 10), dpi=300) # plt.subplots_adjust(right=0.7) nx.draw(g_bom, pos_new, node_size=50, labels=node_labels, font_size=6, width = 1.5, edge_color=colors, edge_cmap=cmap, edge_vmin=vmin, edge_vmax=vmax) plt.axis('off') axis = plt.gca() axis.set_xlim([1.2*x for x in axis.get_xlim()]) axis.set_ylim([1.2*y for y in axis.get_ylim()]) sm = plt.cm.ScalarMappable(cmap=cmap, norm=plt.Normalize(vmin=vmin, vmax=vmax)) sm._A = [] position=fig.add_axes([0.1, 0.4, 0.01, 0.2]) plt.colorbar(sm, fraction=0.01, cax=position) # plt.savefig("analysis\\count_dcp_prod_network") plt.close()