Всем привет! Я хотел бы вычислить координаты узла, а затем экспортировать график в GEXF и обработать его с помощью Gephi. Однако когда я запускаю следующий код
import networkx as nx
import numpy as np
....
area_ratios = [np.sum(new[:,0])/Stotal, np.sum(new[:,1])/Stotal, np.sum(new[:,2])/Stotal]
X = np.array([0, -sqrt(3)/2 * area_ratios[1] , sqrt(3)/2 * area_ratios[2]])
Y = np.array([ area_ratios[0], -1/2 * area_ratios[1] , -1/2 * area_ratios[2]])
point = (np.sum(X), np.sum(Y))
graph.add_node(node_name, {'x-coord': np.asscalar(point[0]*SCALE_FACTOR),
'y-coord': np.asscalar(point[1]*SCALE_FACTOR), 'size': Stotal*3})
nx.write_gexf(graph, PATH + 'mygraph.gexf')
он дает мне KeyError: <type 'numpy.float64'>, хотя np.asscalar предназначен для преобразования соответствующих атрибутов в совместимый тип Python.
Любые идеи?
Ответ 1 · рейтинг 5 · billmanH
Похоже, это было решено давно, но я обнаружил, что у моего кода была аналогичная проблема с использованием значений с плавающей запятой из фрейма данных pandas. Решение было в комментариях, но мне потребовалось время, чтобы понять это, поэтому я подумал, что могу уточнить.
Если вы создаете свои узлы из фрейма данных следующим образом:
G.add_node(df2.loc[row,door_col],
attr_dict={'dropoff':df2.loc[row,'A'],
'pageLoadTime':df2.loc[row,'B'],
'pageviews':df2.loc[row,'C'],
'sessions':df2.loc[row,'D'],
'entrances':df2.loc[row,'E'],
'exits':df2.loc[row,'F'],
'timeOnPage':df2.loc[row,'G'],
'classesB':df2.loc[row,'H']})
Предполагая, что столбцы a-g являются числами с плавающей запятой, это значения np.float64, а не значения с плавающей запятой. nx.write_gexf () выйдет из строя. Однако простое решение - привести их к простым значениям, используя что-то вроде этого:
G.add_node(df2.loc[row,door_col],
attr_dict={'dropoff':float(df2.loc[row,'A']),
'pageLoadTime':float(df2.loc[row,'B']),
'pageviews':float(df2.loc[row,'C']),
'sessions':float(df2.loc[row,'D']),
'entrances':float(df2.loc[row,'E']),
'exits':float(df2.loc[row,'F']),
'timeOnPage':float(df2.loc[row,'G']),
'classesB':str(df2.loc[row,'H'])})
Есть много инструментов, которые борются с типами np.float64. Конвертировать их всегда проще простого.