使用计算日期范围内发生次数的算法分析python列表
下面显示了我拥有的一些数据格式的结构:列表列表使用计算日期范围内发生次数的算法分析python列表,python,algorithm,Python,Algorithm,下面显示了我拥有的一些数据格式的结构:列表列表 data = [ [1,2008-12-01], [1,2008-12-01], [2,2008-12-01] ... (the lists continue) ] 日期范围为2008-12-01至2008-12-25 第一个字段通过id标识用户,第二个字段是日期字段,该用户访问我的站点上的页面时显示 我需要分析这些数据,以便得到以下结果 1天内访问了25个用户 两天内访问了100名用户 4天内访问了300名用户 ... 最多
data =
[
[1,2008-12-01],
[1,2008-12-01],
[2,2008-12-01]
... (the lists continue)
]
日期范围为2008-12-01至2008-12-25
第一个字段通过id标识用户,第二个字段是日期字段,该用户访问我的站点上的页面时显示
我需要分析这些数据,以便得到以下结果
1天内访问了25个用户
两天内访问了100名用户
4天内访问了300名用户
... 最多25天
我正在使用python,不知道从哪里开始
编辑
很抱歉,我似乎对我需要的东西不够清楚,因为有几个人给出了我不想要的答案
我需要知道每天有多少用户访问过,例如。
25天或每天访问10个用户
然后,我想为1-25天的每个频率列出相同的。根据我上面的原始示例
25个用户中只有一天访问了25个
25天中有2天访问了100个用户
等
我不需要知道每天有多少人来访
谢谢你的结果是一本字典,对吗
{ userNumber: setOfDays }
这个怎么样,开始吧
from collections import defaultdict
visits = defaultdict(set)
for user, date in someList:
visits[user].add(date)
这会给你一本字典,上面有他们访问的日期
counts = defaultdict(int)
for user in visits:
v= len(visits[user])
count[v] += 1
这就为你提供了一个访问量字典,一个访问量如此之多的用户字典
这就是您要查找的内容吗?首先,我要提到的是,您需要将日期存储为字符串。目前,它会对您当前的条目进行算术运算。因此,如果您这样格式化数据,它将工作得更好:
data =
[
[1,"2008-12-01"],
[1,"2008-12-01"],
[2,"2008-12-01"]
]
接下来,我们可以这样做来获取每天的数字:
result = {}
for (id, date) in data:
if date not in result:
result[date] = 1
else:
result[date] += 1
现在,您可以通过执行以下操作获取特定日期的用户数:
print result[some_date]
不清楚您的具体要求是什么。以下是我的看法:
#!/usr/bin/env python
from collections import defaultdict
data = [
[1,'2008-12-01'],
[3,'2008-12-25'],
[1,'2008-12-01'],
[2,'2008-12-01'],
]
d = defaultdict(set)
for id, day in data:
d[day].add(id)
for day in sorted(d):
print('%d user(s) visited on %s' % (len(d[day]), day))
它打印:
2 user(s) visited on 2008-12-01
1 user(s) visited on 2008-12-25
这样如何:这将为您提供一组天数和计数:
In [39]: from itertools import groupby ##itertools is a part of the standard library.
In [40]: l=[[1, '2008-12-01'],
....: [1, '2008-12-01'],
....: [2, '2008-12-01'],
....: [1, '2008-12-01'],
....: [3, '3008-12-04']]
In [41]: l.sort()
In [42]: l
Out[42]:
[[1, '2008-12-01'],
[1, '2008-12-01'],
[1, '2008-12-01'],
[2, '2008-12-01'],
[3, '3008-12-04']]
In [43]: for key, group in groupby(l, lambda x: x[0]):
....: group=list(group)
....: print key,' :: ', len(group), ' :: ', group
....:
....:
1 :: 3 :: [[1, '2008-12-01'], [1, '2008-12-01'], [1, '2008-12-01']]
2 :: 1 :: [[2, '2008-12-01']]
3 :: 1 :: [[3, '3008-12-04']]
用户::访问次数::访问日期
在这里,用户-1在2008-12-01访问了3次,如果您希望只计算不同的日期,那么
for key, group in groupby(l, lambda x: x[0]):
group=list(group)
print key,' :: ', len(set([(lambda y: y[1])(each) for each in group])), ' :: ', group
....:
....:
1 :: 1 :: [[1, '2008-12-01'], [1, '2008-12-01'], [1, '2008-12-01']]
2 :: 1 :: [[2, '2008-12-01']]
3 :: 1 :: [[3, '3008-12-04']]
在SQL中重写S.Lott的答案作为练习,只是为了检查我是否正确地得到了需求
SELECT * FROM someList;
userid | date
--------+------------
1 | 2008-12-01
1 | 2008-12-02
1 | 2008-12-03
1 | 2008-12-04
1 | 2008-12-05
2 | 2008-12-03
2 | 2008-12-04
2 | 2008-12-05
3 | 2008-12-04
4 | 2008-12-04
5 | 2008-12-05
5 | 2008-12-05
SELECT countdates, COUNT(userid) AS nusers
FROM ( SELECT userid, COUNT (DISTINCT date) AS countdates
FROM someList
GROUP BY userid ) AS visits
GROUP BY countdates
HAVING countdates <= 25
ORDER BY countdates;
countdates | nusers
------------+--------
1 | 3
3 | 1
5 | 1
这可能不是最具python风格、最高效、最聪明的方式,或者其他任何方式。但也许您可以确认我是否正确理解了这些要求:
>>> log=[[1, '2008-12-01'], [1, '2008-12-01'],[2, '2008-12-01'],[2, '2008-12-03'], [1, '2008-12-04'], [3, '2008-12-04'], [4, '2008-12-04']]
>>> all_dates = sorted(set([d for d in [x[1] for x in log]]))
>>> for i in range(0, len(all_dates)):
... log_slice = [d for d in log if d[1] <= all_dates[i]]
... num_users = len(set([u for u in [x[0] for x in log_slice]]))
... print "%d users visited in %d days" % (num_users, i + 1)
...
2 users visited in 1 days
2 users visited in 2 days
4 users visited in 3 days
>>>
您将第一个字典声明为“访问”,因此您的意思是:对于访问中的用户:visit=lenvisions[users]count[visit]+=1,甚至:对于访问中的访问。itervalues:count[lenvisit]+=1这应该使用collections.defaultdict,就像S.Lott的代码一样。它是一个简化这种字典添加的类。它给出了在给定日期访问的人数,因为您是按日期分组的。他想知道有多少人访问过x次。他需要按用户id分组,而不是按日期分组。你能清楚地把问题重写一遍吗。这是指“计算用户访问的不同天数”还是“25天中每天访问的不同用户数”??