我有一个Django应用程序,其中我需要实现一个简单的趋势/排名算法。作为一个:
我有两种型号,BookReader。每天晚上,新书都会被添加到我的数据库中。每本书的读者数量每晚也会更新,即一本书将有多个读者统计记录(每天一个记录)。
在给定的时间段内(过去的一周、过去的一个月或过去的一年),我想列出最受欢迎的书,我应该使用什么算法?
受欢迎程度不需要以任何方式实时,因为每本书的读者数量只需每天更新。
我发现一篇文章在另一篇文章中被引用,所以这篇文章只显示了当前趋势是如何计算的。
正如有人所指出的,这是一个非常简单的基线趋势算法,只计算两个数据点之间的斜率,所以我猜它显示了昨天和今天之间的趋势。
我不是在寻找一个超级复杂的趋势算法,比如黑客新闻、Reddit等。
我只有两个数据轴,读卡器计数和日期。
关于我应该实现什么和如何实现的任何想法。对于一个从未从事过统计/算法相关工作的人来说,这似乎是一项非常艰巨的任务。
提前谢谢大家。

最佳答案

我能想到的最简单的趋势“算法”可能是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)

slice表示法简单地获取列表的尾部,从第n个变量到最后一个变量。移动平均线是一个相当标准的方法来消除任何噪声,任何一个尖峰或低谷可能引入。可以这样使用函数:
book_scores = {}
for book, reader_list in books.iteritems():
    book_scores[book] = moving_av(reader_list, 5)

你会想和你的平均天数一起玩。如果你想强调最近的趋势,你也可以使用类似于weighted moving average的工具。
如果你想关注的是那些不太关注绝对读者群的东西,而关注的是读者群的增长,只需找到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

有了这些简单的工具,您在强调过去趋势的程度以及平滑(或不平滑)峰值的程度上具有相当大的灵活性。

关于python - 在Django中确定并实现趋势算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9283856/

10-12 17:53