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

时间:2011-08-23 07:47:29

标签: python sqlalchemy flask flask-sqlalchemy

我会给出一些背景,这是有道理的。我在表(评级)中捕获产品的客户评级,并希望能够根据时间返回评级的累积移动平均值。

每天评分后的基本示例:

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中这样做呢?

赞赏任何建议!

2 个答案:

答案 0 :(得分:5)

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

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

使用单个SQL语句可以更新平均值和评级计数。

答案 1 :(得分:-5)

我认为你应该把MA存储在一个2元素列表中,它会更加简单:

#first rating 5 is rating number 0
a = [5,0]

#next:
for i in rating:
a = [(a[0]*a[1]+lastRating)/(a[1]+1),a[1]+1]

再见