Mri*_*lla 11 python django statistics popularity trending
我有一个Django应用程序,我需要在其中实现一个简单的趋势/排名算法.我很遗憾:
我有两个型号,Book
和Reader
.每天晚上,新书都会添加到我的数据库中.每本书的读者数量每晚都会更新,即一本书将有多个读者统计记录(每天一个记录).
在给定时期(过去一周,过去一个月或过去一年),我想列出最受欢迎的书籍,我应该使用哪种算法?
流行度不需要以任何方式实时实现,因为每本书的读者数量仅每日更新.
我发现在另一篇SO 帖子中引用了一篇文章,展示了他们如何计算趋势维基百科的文章,但帖子只显示了当前趋势的计算方式.
正如有人在SO上指出的那样,这是一个非常简单的基线趋势算法,只计算两个数据点之间的斜率,所以我猜它显示了昨天和今天之间的趋势.
我不是在寻找像Hacker News,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]
}
Run Code Online (Sandbox Code Playgroud)
一个简单的移动平均线只取最后一个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)
Run Code Online (Sandbox Code Playgroud)
切片表示法只是从第n个到最后一个变量开始抓取列表的尾部.移动平均线是一种相当标准的方法,可以消除单个尖峰或下降可能引入的任何噪声.该函数可以像这样使用:
book_scores = {}
for book, reader_list in books.iteritems():
book_scores[book] = moving_av(reader_list, 5)
Run Code Online (Sandbox Code Playgroud)
你想要玩平均天数.如果你想强调最近的趋势,你也可以看看使用加权移动平均线之类的东西.
如果你想专注于看起来不那么绝对读者的事情,而是专注于增加读者人数,那么只需找到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
Run Code Online (Sandbox Code Playgroud)
使用这些简单的工具,您可以在多大程度上灵活地调整过去的趋势,以及您希望平滑(或不平滑)峰值的程度.
归档时间: |
|
查看次数: |
3929 次 |
最近记录: |