Как рассчитать накопительное скользящее среднее в Python / SQLAlchemy / Flask - PullRequest
8 голосов
/ 23 августа 2011

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

Ниже приведен базовый пример взятия рейтинга в день:

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 ]

5 голосов
/ 25 августа 2011

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

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

Обновление среднего значения и количества оценок можно выполнить с помощью одного оператора SQL.

0 голосов
/ 23 августа 2011

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

Bye

...