以下显示了我的一些数据的结构(格式:列表列表)
data =
[
[1,2008-12-01],
[1,2008-12-01],
[2,2008-12-01]
... (the lists continue)
]
日期范围为2008-12-01至2008-12-25。
第一个字段按ID标识用户,第二个字段(日期字段)显示此用户访问我网站上的页面的时间。
我需要分析这些数据,以便得到以下结果
每天有25位用户访问
在2天内访问了100位用户
在4天内访问了300个用户
......最多25天
我正在使用python,不知道从哪里开始!
修改
我很抱歉看起来我不太清楚我需要什么,因为有些人给出的答案不是我想要的。
我需要知道有多少用户在所有日子里访问过,例如
25天(或每天)访问的10位用户
然后我希望从1到25的每个频率列出相同的内容。因此,根据我上面的原始示例
25位用户仅访问了一天(25人中)
在2天内访问了100个用户(25个中)
等等
我不需要知道每天访问的人数 感谢
答案 0 :(得分:4)
你的结果是字典,对吧?
{ 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
这会为您提供#个访问次数的字典,包含多次访问的用户数。
这是你要找的那种东西吗?
答案 1 :(得分:1)
重写S.Lott在SQL中的答案作为练习,只是为了检查我的要求是否合适......
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
答案 2 :(得分:1)
这可能不是最pythonic或高效或最聪明或任何方式这样做。但也许您可以确认我是否正确理解了这些要求:
>>> 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
>>>
答案 3 :(得分:0)
首先,我应该提到您需要将日期存储为字符串。目前,它会对您当前的条目进行算术运算。因此,如果您像这样格式化data
,它会更好用:
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]
答案 4 :(得分:0)
目前尚不清楚您的要求到底是什么。这是我的看法:
#!/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
答案 5 :(得分:0)
这个怎么样:这给你一组天数和数量:
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']]