Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 返回GROUPBY语句后记录计数的平均值_Python_Mysql_Sql_Sqlalchemy - Fatal编程技术网

Python 返回GROUPBY语句后记录计数的平均值

Python 返回GROUPBY语句后记录计数的平均值,python,mysql,sql,sqlalchemy,Python,Mysql,Sql,Sqlalchemy,我有一堆记录,我想计算特定时间单位(小时、天、周)的平均计数。所以一种情况是,我想计算一个给定范围内每天的平均记录数。更清楚地说,这只是一个数字 我现在的做法(这显然不起作用,因为它不取平均值)是以下sqlalchemy查询: db.query(MyClass).filter(MyClass.created.between(start_date, end_date)).group_by(func.HOUR(MyClass.created)).count() 下面是显示创建表yt\U视频的输出:

我有一堆记录,我想计算特定时间单位(小时、天、周)的平均计数。所以一种情况是,我想计算一个给定范围内每天的平均记录数。更清楚地说,这只是一个数字

我现在的做法(这显然不起作用,因为它不取平均值)是以下sqlalchemy查询:

db.query(MyClass).filter(MyClass.created.between(start_date, end_date)).group_by(func.HOUR(MyClass.created)).count()
下面是显示创建表yt\U视频的输出:

| yt_video | CREATE TABLE `yt_video` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `version` int(11) DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `published_date` date DEFAULT NULL,
  `yt_data` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
我真正关心的是创建的时间戳,但希望这能有所帮助。

以下是示例

在您的情况下,使用提供的表定义:

from sqlalchemy import cast, func
from sqlalchemy.types import TIME, DATE
from sqlalchemy.sql import between

time_from = ...  # get filter time maybe using datetime.time()
time_to = ...  # idem
counts = session.query(func.count('*').label('count')).\
    filter(between(cast(MyClass.created, TIME),
           time_from,
           time_to)).\
    group_by(cast(MyClass.created, DATE))

avg = session.query(func.avg(counts.subquery().columns.count)).scalar()

print avg

好奇的是,在MySQL 8及更高版本中,您可以使用相同效果的窗口函数:

# limit(1) should work as well instead of distinct, because we know that all rows
# contain the exact same result.
db.query(func.avg(func.count()).over()).\
    filter(MyClass.created.between(start_date, end_date)).\
    group_by(func.date(MyClass.created)).\
    distinct().\
    scalar()

这是因为逻辑上窗口函数是在GROUP BY生成组行后计算的。

请提供示例数据和表架构。您可以使用numpy.average,也可以获取结果,将所有值相加,然后除以值的计数。