如何在Python/SQLAlchemy/Flask中计算累积移动均值

8 投票
1 回答
4563 浏览
提问于 2025-04-17 00:10

我先给你一些背景,这样你就能理解我在说什么了。我正在一个表格中记录客户对产品的评分(Rating),并希望能根据时间计算出评分的累积移动平均值。

下面是一个简单的例子,假设每天都有一个评分:

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...

我在想一个方法,确保这个方法不会在数据量大时变得很糟糕。

我现在的想法是,当在评分表中插入一行数据时,触发一个函数,这个函数会根据该产品之前的评分来计算累积平均值。

所以字段可能会是这样的:

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

不过,这样存储数据似乎不是个好主意。

有没有什么好的方法可以实现这个?如果我想用某种“触发器”,在SQLAlchemy中该怎么做呢?

任何建议都非常感谢!

1 个回答

5

我对SQLAlchemy不太了解,但我可能会用这样的方式:

  • 把总的平均分和评分数量单独存储,不和每个单独的评分放在一起。
  • 每次收到新的评分时,更新总的平均分和评分数量:
    • 新的评分数量 = 旧的评分数量 + 1
    • 新的平均分 = ((旧的平均分 * 旧的评分数量) + 新的评分) / 新的评分数量
  • 可以选择为每个新的评分存一行记录。

更新平均分和评分数量可以用一条SQL语句来完成。

撰写回答