Как визуализировать шаблоны слов? - PullRequest
1 голос
/ 16 мая 2019

У меня есть структура данных, которая выглядит следующим образом:

<client>: {
    <document>: [
        {'start': <datetime>,
         'end': <datetime>,
         'group': <string>}
    ]
 }

Список словарей в <document> отсортирован по дате 'start', и новая запись не может начинаться раньше, чем предыдущаяЭто конец.Я перебираю эту структуру данных и собираю значения group с течением времени в новую структуру, например:

<client>: {
    <document>: {'progression': <group_1>|<group_2>|...|<group_n>}
 }

, где <group_1> соответствует значению 'group' для первого словаря.в <document> и т. д.Я хочу визуализировать эту последовательность groups для всех документов, поэтому, например, я знаю, что у меня есть 5000 записей, начинающихся с "abc" (перед первым каналом);из них за 2000 следует «def», поэтому "abc"|"def".Из них 500 возвращаются обратно к «abc»: "abc"|"def"|"abc", а за оставшимися 1500 следует «ghi»: "abc"|"def"|"ghi".Остальные 3000 записей, начинающиеся с «abc», следуют некоторому другому шаблону прогрессии.

То, что я пытаюсь сделать, это визуализировать эту прогрессию с помощью чего-то, похожего на диаграмму Санки, или другой подходящей древовидной структуры, в которойверхний узел будет «abc», тогда слева будет «толстая» ветвь, соответствующая другому шаблону прогрессии, и «более тонкая» ветвь справа, соответствующая 2000 «abc» падежам, за которой следует «def»,Тогда «def» будет другим узлом с похожими ветвями, один из которых приведет к новому «abc» (для случая "abc"|"def"|"abc"), а другой - к «ghi» (для случая "abc"|"def"|"ghi"), предпочтительно аннотированный счетчиком вкаждый узел как «дерево» истончается.Я использую комбинацию структур Python Counter для извлечения чисел для каждой потенциальной последовательности, но я не знаю, как я могу создать визуализацию программно.

Насколько я понимаю, это, вероятно, проблема, которая может бытьадресованы с использованием точечного языка и пакетов типа pydot и / или pygraphviz, но я не уверен, что я на правильном пути.

1 Ответ

1 голос
/ 17 мая 2019

Я думаю, что в вашем случае диаграммы Санки будут лучшим выбором. Предположим, у вас есть data структура, которая хранит информацию о ваших группах отсюда: 'progression': <group_1>|<group_2>|...|<group_n>. Тогда вы можете построить диаграмму Санки так:

data = [
    [1,2,3,1,4],
    [1,4,2],
    [1,2,5,3,5],
    [1,3],
    [1,4,5,1,4,3],
    [1,5,4,3],
    [1,2,5,1,3,4],
    [1,5],
    [1,2,1,1,5,2],
    [1,5,4,3],
    [1,1,2,3,4,1]
]

# Append _1, _2... indices to differ paths like 1-2-2-1 and 1-2-1-2
nodes = sorted(list(set(itertools.chain(*[[str(e) + '_' + str(i) for i, e in enumerate(l)] for l in data]))))
countered = defaultdict(int)
for line in data:
    for i in range(len(line) - 1):
        countered[(str(line[i]) + '_' + str(i), str(line[i+1]) + '_' + str(i+1))] += 1
links = [
    {'source': key[0], 'target': key[1], 'value': value}
    for key, value in countered.items()
]

links = {
    'source': [nodes.index(key[0]) for key, value in countered.items()],
    'target': [nodes.index(key[1]) for key, value in countered.items()],
    'value': [value for key, value in countered.items()]
}

data_trace = dict(
    type='sankey',
    domain = dict(
      x =  [0,1],
      y =  [0,1]
    ),
    orientation = "h",
    valueformat = ".0f",
    node = dict(
      pad = 10,
      thickness = 30,
      line = dict(
        color = "black",
        width = 0
      ),
      label =  nodes
    ),
    link = links
)

layout =  dict(
    title = "___",
    height = 772,
    font = dict(
      size = 10
    ),    
)

fig = dict(data=[data_trace], layout=layout)
iplot(fig, validate=True)

Он нарисует вам сюжет Санки так:

enter image description here

Вы можете найти больше информации о том, как Санки работает в сюжете здесь .

...