使用算法分析python列表,以计算日期范围内的事件

时间:2009-01-11 20:49:17

标签: 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标识用户,第二个字段(日期字段)显示此用户访问我网站上的页面的时间。

我需要分析这些数据,以便得到以下结果

每天有25位用户访问 在2天内访问了100位用户
在4天内访问了300个用户 ......最多25天

我正在使用python,不知道从哪里开始!

修改

我很抱歉看起来我不太清楚我需要什么,因为有些人给出的答案不是我想要的。

我需要知道有多少用户在所有日子里访问过,例如
25天(或每天)访问的10位用户

然后我希望从1到25的每个频率列出相同的内容。因此,根据我上面的原始示例
25位用户仅访问了一天(25人中) 在2天内访问了100个用户(25个中) 等等

我不需要知道每天访问的人数 感谢

6 个答案:

答案 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']]