Что такое хорошая модель данных для кросс-табуляции? - PullRequest
6 голосов
/ 19 июня 2009

Я внедряю библиотеку кросс-табуляции в Python как упражнение по программированию для моей новой работы, и у меня есть реализация требований, которые работают , но неэлегатны и избыточны. Я бы хотел для нее более совершенную модель, которая позволила бы аккуратное, чистое перемещение данных между базовой моделью, хранящейся в виде табличных данных в плоских файлах, и всеми результатами статистического анализа, которые могут быть запрошены.

Прямо сейчас у меня есть переход от набора кортежей для каждой строки в таблице к гистограмме, подсчитывающей частоты появления интересующих кортежей, к сериализатору, который - несколько неуклюже - компилирует вывод в набор ячеек таблицы для отображения. Однако в итоге мне приходится возвращаться к таблице или к гистограмме чаще, чем я хочу, потому что информации никогда не хватает.

Итак, есть идеи?

Edit: вот пример некоторых данных, и из которых я хочу иметь возможность строить Это. Обратите внимание, что "." обозначает немного «отсутствующих» данных, то есть только условно подсчитывали.

1   .   1
1   0   3
1   0   3
1   2   3
2   .   1
2   0   .
2   2   2
2   2   4
2   2   .

Если бы я смотрел на соотношение между столбцами 0 и 2 выше, у меня была бы таблица:

    . 1 2 3 4
1   0 1 0 3 0
2   2 1 1 0 1

Кроме того, я хотел бы иметь возможность рассчитать соотношение частоты / общего, частоты / промежуточного итога и т. Д.

Ответы [ 4 ]

1 голос
/ 15 июля 2011

S W опубликовал хороший базовый рецепт для этого на activestate.com .

Суть, кажется, ...

  1. Определите xsort = [] и ysort = [] как массивы ваших осей. Заполните их, просматривая данные или иным способом.
  2. Определите rs = {} как диктовку ваших табличных данных, перебирая данные и увеличивая rs [yvalue] [xvalue]. Создайте недостающие ключи, если / когда это необходимо.

Тогда, например, сумма для строки y будет sum([rs[y][x] for x in xsort])

1 голос
/ 21 июня 2009

Вы можете использовать базу данных sqlite в памяти в качестве структуры данных и определять нужные операции как запросы SQL.

import sqlite3

c = sqlite3.Connection(':memory:')
c.execute('CREATE TABLE data (a, b, c)')

c.executemany('INSERT INTO data VALUES (?, ?, ?)', [
    (1, None,    1),
    (1,    0,    3),
    (1,    0,    3),
    (1,    2,    3),
    (2, None,    1),
    (2,    0, None),
    (2,    2,    2),
    (2,    2,    4),
    (2,    2, None),
])

# queries
# ...
0 голосов
/ 19 июня 2009

Поскольку это раннее упражнение по программированию для Python, они, вероятно, хотят, чтобы вы увидели, какие встроенные механизмы Python будут подходить для начальной версии проблемы. Структура словаря кажется хорошим кандидатом. Значение первого столбца в вашем файле tab-sep может быть ключом к словарю. Запись, найденная этим ключом, сама может быть словарем, ключ которого является значением второго столбца. Элементами субдикционара будет счет, инициализируемый равным 1, когда вы добавляете новый субдиктарий, когда пара встречается впервые.

0 голосов
/ 19 июня 2009

Почему бы не сохранить его с помощью таблиц HTML? Возможно, он не самый лучший, но вы можете очень легко просмотреть его в браузере.

Edit:

Я просто перечитал вопрос, и вы спрашиваете модель данных, а не модель хранения. Чтобы ответить на этот вопрос ...

Все зависит от того, как вы будете представлять данные. Например, если вы собираетесь выполнять многократные повороты или агрегирование, может иметь смысл хранить их в главном порядке столбцов, таким образом, вы можете просто суммировать столбец, чтобы получить счет, например.

Очень поможет, если вы объясните, какую информацию вы пытаетесь извлечь.

...