【问题标题】:How to calculate cumulative moving average in Python/SQLAlchemy/Flask如何在 Python/SQLAlchemy/Flask 中计算累积移动平均线
【发布时间】:2011-11-01 17:37:05
【问题描述】:

我会给出一些上下文,这样才有意义。我在表格(评级)中捕获产品的客户评级,并希望能够返回基于时间的评级的累积移动平均值。

一个基本的例子如下:每天评分:

02 FEB - Rating: 5 - Cum Avg: 5
03 FEB - Rating: 4 - Cum Avg: (5+4)/2 = 4.5
04 FEB - Rating: 1 - Cum Avg: (5+4+1)/3 = 3.3
05 FEB - Rating: 5 - Cum Avg: (5+4+1+5)/4 = 3.75
Etc...

我正在尝试一种不会大规模扩展的方法。

我目前的想法是有一个函数,当将一行插入到 Rating 表中时,该函数会根据该产品的前一行计算 Cum Avg

所以字段应该是这样的:

TABLE: Rating
| RatingId | DateTime | ProdId | RatingVal | RatingCnt | CumAvg |

但这似乎是一种相当不可靠的数据存储方式。

实现这一点的(或任何)方法是什么?如果我要使用各种“触发器”,你如何在 SQLAlchemy 中做到这一点?

感谢所有建议!

【问题讨论】:

  • 在 SQL 中绝对可以做到这一点——请参阅:stackoverflow.com/questions/4107479/… ...我不确定如何让 SQLAlchemy 生成这样的查询(并且您的数据库可能不支持必要的语法。)
  • @Sean Vieria:感谢您的链接——我知道这在纯 SQL 中是可能的,但这再次意味着随着评级数量的增加,随着对每一行进行计算,性能会变得更差。我可能会尝试实现我最初的想法,即在输入每一行时存储它,因为我知道这会扩展。我只是不确定我是否忽略了一些基本的东西。感谢您的帮助!

标签: python sqlalchemy flask flask-sqlalchemy


【解决方案1】:

我不了解 SQLAlchemy,但我可能会使用这样的方法:

  • 将累积平均值和评分计数与单个评分分开存储。
  • 每次获得新评分时,更新累积平均值和评分计数:
    • new_count = old_count + 1
    • new_average = ((old_average * old_count) + new_rating) / new_count
  • (可选)为每个新评级存储一行。

可以使用一条 SQL 语句更新平均和评分计数。

【讨论】:

  • 谢谢,我昨天实现了大部分,这就是我最终采用的方法,我必须完成它,然后我会发回我使用的代码。它以负责任且可预测的方式扩展,这就是我所追求的。
  • 如果用户可以编辑评级?这种方法行得通吗?
  • 存储 sum 和计数比存储 average 和计数要容易得多。
猜你喜欢
  • 1970-01-01
  • 2021-04-01
  • 2023-03-09
  • 2012-06-19
  • 2021-05-30
  • 2017-09-28
  • 2020-01-06
相关资源
最近更新 更多