Вероятно, самый простой из возможных «алгоритмов» трендов - это скользящее среднее n-дня.Я не уверен, как структурированы ваши данные, но скажу, что у вас есть что-то вроде этого:
books = {'Twilight': [500, 555, 580, 577, 523, 533, 556, 593],
'Harry Potter': [650, 647, 653, 642, 633, 621, 625, 613],
'Structure and Interpretation of Computer Programs': [1, 4, 15, 12, 7, 3, 8, 19]
}
Простое скользящее среднее просто берет последние n
значения и усредняет их:
def moving_av(l, n):
"""Take a list, l, and return the average of its last n elements.
"""
observations = len(l[-n:])
return sum(l[-n:]) / float(observations)
Обозначение слайса просто захватывает конец списка, начиная с n-й до последней переменной.Скользящее среднее является довольно стандартным способом сглаживания любого шума, который может внести один шип или провал.Функцию можно использовать так:
book_scores = {}
for book, reader_list in books.iteritems():
book_scores[book] = moving_av(reader_list, 5)
Вы можете поиграть с тем количеством дней, которое вы в среднем набрали.И если вы хотите подчеркнуть последние тенденции, вы также можете использовать что-то вроде взвешенного скользящего среднего .
Если вы хотите сосредоточиться на чем-то, что меньше смотрит на абсолютную аудиторию и вместо этого сосредотачивается наувеличение читательской аудитории, просто найдите процентное изменение 30-дневной скользящей средней и 5-дневной скользящей средней:
d5_moving_av = moving_av(reader_list, 5)
d30_moving_av = moving_av(reader_list, 30)
book_score = (d5_moving_av - d30_moving_av) / d30_moving_av
С помощью этих простых инструментов вы получаете достаточную гибкость в том, насколько вы подчеркиваете прошлые тенденции.и сколько вы хотите сгладить (или не сгладить) шипы.