Это в основном зависит от вашей цели на самом деле.То, что вы хотите проанализировать, является определяющим фактором в вашем графическом дизайне.Но, глядя на вашу структуру, общая структура будет узлами для Customers
и Products
, которые связаны с Days
(я не знаю, поможет ли это вам лучше, но на самом деле это двудольный граф ).
Итак, ваша структура будет выглядеть примерно так:
node(Person) --- edge(Day) ---> node(Product)
Скажем, Боб покупает карандаш 01.01.12:
node(Bob) --- 1/1/12 ---> node(Pencil)
Хорошо, теперь Боб идет и покупает другой карандаш 1/2/12:
-- 1/1/12 --
/ \
node(Bob) > node(Pencil)
\ /
-- 1/2/12 --
и так далее ...
Это на самом деле возможно с networkx
.Поскольку у вас есть несколько ребер между узлами, вам придется выбирать между MultiGraph
Mor MultiDiGraph
в зависимости от направленности ваших ребер.
In : g = networkx.MultiDiGraph()
In : g.add_node("Bob")
In : g.add_node("Alice")
In : g.add_node("Pencil")
In : g.add_edge("Bob","Pencil",key="1/1/12")
In : g.add_edge("Bob","Pencil",key="1/2/12")
In : g.add_edge("Alice","Pencil",key="1/3/12")
In : g.add_edge("Alice","Pencil",key="1/2/12")
In : g.edges(keys=True)
Out:
[('Bob', 'Pencil', '1/2/12'),
('Bob', 'Pencil', '1/1/12'),
('Alice', 'Pencil', '1/3/12'),
('Alice', 'Pencil', '1/2/12')]
пока неплохо.На самом деле вы можете запросить такие вещи, как «Купила ли Алиса Карандаш 01.01.12?».
In : g.has_edge("Alice","Pencil","1/1/12")
Out: False
In : g.has_edge("Alice","Pencil","1/2/12")
Out: True
Все может ухудшиться, если вы хотите, чтобы все заказы выполнялись в определенные дни.Плохо, я имею в виду не код, а вычисления.С точки зрения кода это довольно просто:
In : [(from_node, to_node) for from_node, to_node, key in g.edges(keys=True) if key=="1/2/12"]
Out: [('Bob', 'Pencil'), ('Alice', 'Pencil')]
Но это сканирует все ребра в сети и фильтрует те, которые вы хотите.Я не думаю, что у networkx
есть лучший способ.