什么是交叉表的良好数据模型?

6 投票
4 回答
1675 浏览
提问于 2025-04-15 12:22

我正在用Python实现一个交叉表库,这是我新工作的一项编程练习。目前我已经完成了需求的实现,虽然能用,但看起来不太优雅,还有些重复。我希望能找到一个更好的模型,让数据在基础模型(存储在平面文件中的表格数据)和各种统计分析结果之间流动得更顺畅、更干净。

现在,我的流程是这样的:首先是每一行的元组集合,然后是一个直方图,用来统计这些元组出现的频率,最后是一个序列化器,它有点笨拙地把输出整理成一组表格单元格来显示。不过,我发现我经常需要回到表格或直方图那里,因为信息总是不够。

所以,有什么好的想法吗?

补充说明:这里有一些数据示例,以及我希望能从中构建的内容。请注意,“.”表示一些“缺失”的数据,这些数据只在特定条件下被计算。

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 个回答

0

因为这是一个早期的Python编程练习,他们可能希望你了解Python内置的一些机制,看看哪些适合用来解决这个问题的初版。字典结构看起来是个不错的选择。你从制表符分隔的文件中得到的第一列值可以作为字典的键。通过这个键找到的条目本身也可以是一个字典,它的键是第二列的值。当你第一次遇到一对值时,可以初始化一个子字典的条目,计数从1开始。

1

S W 在 activestate.com 上发布了一个关于这个问题的很好的基础教程,链接在这里:点击查看

大致的意思是……

  1. 首先定义两个空的数组,xsort=[] 和 ysort=[],这两个数组用来存放你的坐标轴。你可以通过遍历你的数据来填充这些数组,或者用其他方法。
  2. 接着定义一个字典 rs={},这个字典里面又包含字典,用来存放你的表格数据。你需要通过遍历数据来更新这个字典,具体来说就是增加 rs[yvalue][xvalue] 的值。如果需要的话,记得创建缺失的键。

比如说,某一行 y 的总和可以用 sum([rs[y][x] for x in xsort]) 来计算。

1

你可以使用一个在内存中的 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
# ...

撰写回答