任何在关系数据库中对数据进行非常基本的统计探索的人都必须计算交叉表,也称为应变表(维基百科页面)。当您需要同时计算有多少项属于多个类别时,这些都是必不可少的。例如:有多少顾客是女性,喜欢巧克力?
对于矩阵有方法可以这样做,使用histogram2d的变体,但是要进行有意义的全面统计分析,您需要有一个表(带有变量名称),您可以从该表中指定要表的变量。此外,它还需要处理其他类型的变量,而不仅仅是数值变量。实际上,数字表格是比较复杂的,因为它需要绑定。R
当然有这样一个叫做table
的函数,它可以很容易地移植到Python。但是,记得我在标题中提到我想使用ORM,为什么?因为交叉表比生成它所用的数据要小得多,所以您可以从数据库中数十亿条记录中计算出一个2x2表。我的观点是:在严肃的应用程序中,您不能将所有的数据都存储在内存中并循环使用它。因此,您必须将表设计转换为SQL查询,以便所有计数都由数据库引擎完成。ORM将处理必要的SQL方言调整,以便您可以使用任何数据库后端运行代码。一个用于简单交叉表的SQL示例(以MySQL方言表示)可以找到这里。
现在,我想我已经激励了您解决这个问题,下面是问题:这个功能在Python中实现了吗?您将如何使用SQLAlchemy或Django ORM来实现这个功能?
发布于 2011-03-11 10:53:08
我不想回答我自己的问题,但有时我们不能等待帮助。既然我找到了答案,也找到了一个好答案,我觉得有责任与社会分享。所以这里是:
table = self.session.query(Table.var1, Table.var2, func.count(Table)).group_by(Table.var1, Table.var2).all()
这将返回一个元组列表,如(行、列、计数)。从这个列表中,您可以组装您的应急表,如果需要,可以计算保证金总数。值得一提的是,计算这条电缆所用的是.28秒作为一个具有296110记录的表,var1和var2分别有5和90级。
现在有一个小函数来组装和打印(2d)表:
def pprint_table():
colnames = list(set([i[1] for i in table]))
rows = defaultdict(lambda:[0]*len(colnames))
for r in table:
rows[r[0]][colnames.index(r[1])] = r[2]
print colnames, 'total'
for rn, r in rows.items():
print rn, r, sum(r)
https://stackoverflow.com/questions/5273397
复制