首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pydatalog聚合函数的使用

Pydatalog聚合函数的使用
EN

Stack Overflow用户
提问于 2016-08-17 03:21:24
回答 1查看 442关注 0票数 0

我一直在玩弄各种聚合函数,以获得它们的感觉,在过去的几天我感到困惑之后,我需要澄清。我要么会有完全不直观的行为,要么会犯无益的错误。例如,我测试:

(pX==min_(Y,order_by=Z)) <= Y.in_(4,6,2)&Z.in_(6,)

查看示例输出:

p==X,Y,Z ((6,),4,6,2,6,6,6) p1==X,Y,Z ((6,),6,4,2,6,6) p2==X,Y,Z ((6,),4,2,6,6,6,6)

  1. 为什么最小值是6? 2。为什么绑定到Z的值被重复了3次?3。与找到最小值的列表相比,“order_by”的确切目的是什么? 4.如果“order_by”列表中有多个值,为什么输出会发生变化;为什么在“order_by”列表中有一个特定的值(在这种情况下是6)影响输出?另一个例子是:

(pX==min_(Y,order_by=Z)) <= Y.in_(4,6,2)&Z.in_(0,)

输出:

p==X,Y,Z ((6,),4,6,2,0,0,0) p1==X,Y,Z ((6,),2,6,4,0,0,0) p2==X,Y,Z ((2,),2,6,4,0,0,0)

为什么X的输出--从6到2--根据所提供的索引变化?即使在前面的示例中输出是错误的,至少对于所使用的索引是一致的;在只有一个分钟/最大值的情况下,这使得从那时开始。

我至少可以看到使用min_、max_、sum_函数的输出;但是,当涉及到rank_和running_sum_时,我就迷路了。在定义我的函数时,我遵循类似的过程:

(pX==running_sum_(Z,group_by=Z,order_by=Z)) <= Z.in_(43,34,65)

我试着查看输出:

p==X

我知道错误:

追溯(最近一次调用):File "",第1行,在File "/usr/local/lib/python3.4/dist-packages/pyDatalog/UserList.py",第16行,在repr def repr(Self)中:返回repr(self.data)文件"/usr/local/lib/python3.4/dist-packages/pyDatalog/pyParser.py",行109,在data "/usr/local/lib/python3.4/dist-packages/pyDatalog/pyParser.py",() File "/usr/local/lib/python3.4/dist-packages/pyDatalog/pyParser.py",第566行中,在ask self._data = Body(self.pre_calculations,self).ask() File self.todo.ask第686行中,在ask self._data = literal.lua.ask() File "/usr/local/lib/python3.4/dist-packages/pyDatalog/pyEngine.py",中第909行,in _ invoke (子目标)文件"/usr/local/lib/python3.4/dist-packages/pyDatalog/pyEngine.py",第664行,在invoke todo.do() #获取thunk并执行it文件"/usr/local/lib/python3.4/dist-packages/pyDatalog/pyEngine.py",第640行,在do self.thunk() File "/usr/local/lib/python3.4/dist-packages/pyDatalog/pyEngine.py",第846行,在aggregate.complete(base_subgoal )中,(子目标)文件"/usr/local/lib/python3.4/dist-packages/pyDatalog/pyParser.py",第820行,完整的结果= tuple(l.terms)表示列表中的l(base_subgoal.facts.values()) AttributeError:'bool‘对象没有属性值。

这是什么意思?做错了什么?running_sum_ (和rank_)参数--‘group_ by’和'order_by‘所共有的关系是什么?

由于web上似乎没有示例,因此非常希望有2或3个rank_和running_sum_使用的简短示例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-20 20:21:18

聚合子句分两个步骤解决:

  • 首先解析子句中的未知数,同时忽略聚合函数。
  • 然后对结果应用聚合函数。

下面是您如何编写第一个子句:

代码语言:javascript
复制
(p[None]==min_(Y, order_by=Y)) <= Y.in_((4,6,2))

P后面的括号中的变量在SQL中用作"group by“,并且必须出现在子句的正文中。在这种情况下,它不会改变,所以我使用无。当您想要检索比您所订购的值更多的值时,需要order_by变量。

假设你想取回学校每班最年轻学生的名字。基谓词将是pupil(ClassName, Name, Age)

代码语言:javascript
复制
+ pupil('1A', 'John', 8)
+ pupil('1B', 'Joe', 9)

合计条款如下:

代码语言:javascript
复制
(younger[ClassName] == min_(Name, order_by= Age)) <= pupil(ClassName, Name, Age)

然后查询如下:

代码语言:javascript
复制
(younger[ClassName]==X)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38987592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档