Как вычислить кумулятивную скользящую среднюю в Python/SQLAlchemy/Flask

Я дам некоторый контекст, чтобы это имело смысл. Я фиксирую рейтинги клиентов для продуктов в таблице (рейтинг) и хочу иметь возможность возвращать кумулятивную скользящую среднюю оценок на основе времени.

основной пример следует принимать рейтинг в день:

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

Я пытаюсь придумать подход, который не ужасно масштаба.

моя текущая идея состоит в том, чтобы иметь функцию, которая срабатывает, когда строка вставляется в таблицу рейтинга, которая работает Cum Avg на основе предыдущей строки для этого продукта

таким образом, поля будут чем-то вроде:

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

но это кажется довольно сомнительным способом хранения данных.

каким будет (или любой) способ достичь этого? Если бы я использовал "триггер", как вы это делаете в SQLAlchemy?

любые советы приветствуются!

2 ответов


Я не знаю о SQLAlchemy, но я мог бы использовать такой подход:

  • храните кумулятивное среднее и подсчет рейтинга отдельно от индивидуальных оценок.
  • каждый раз, когда вы получаете новый рейтинг, обновите накопительное среднее и количество рейтингов:
    • new_count = old_count + 1
    • new_average = ((old_average * old_count) + new_rating) / new_count
  • дополнительно, сохраните строку для каждого нового рейтинг.

обновление среднего и рейтингового подсчета может быть выполнено с помощью одного оператора SQL.


Я думаю, вы должны сохранить 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]

пока