Как вычислить кумулятивную скользящую среднюю в 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]
пока