题目描述:
数据库构造如下:
第一列表示用户ID,第三列表示用户做的这道题的题目ID,第二列表示用户做这道题的日期。这里我们定义用户第一次做了某道题目,那么用户就做了新题。问题是在以上的数据库中,求从10-1到10-2每天都做新题的用户由多少人
解题思路:
首先抽出当天做新题的同学;接着统计那些从10-1到10-10每天都做新题的同学。第一个问题,可以先抽出当天的uid-pid对;再和当天之前的数据中匹配,如果匹配数大于1,则丢弃该(uid, pid),否则保留;在保留下来的(uid, pid)对中去除pid,合并uid,得到当天做新题的uid。后一个问题,考虑用select when语句解决。
代码:
这里使用python的numpy和pandas两个库进行处理,且假设数据存放在csv文件中。
import pandas as pd
import numpy as np
def do_new_problems(data, date):
today = data[data.date == date]
before = data[data.date < date]
record = pd.merge(today, before, how='left', on=['uid', 'pid'])
Uids = record[np.isnan(record.date_y)][['uid', 'pid']]
Uids.drop_duplicates('uid', inplace=True)
return Uids
def always_do_new_problems(data, dates):
if not dates:
print('dates should has at least one element')
return
tmps = []
for date in dates:
tmps.append(do_new_problems(data, date))
res = tmps[0]
for tmp in tmps[1: ]:
res = pd.merge(res, tmp, how='inner', on='uid')
return res
data = pd.read_csv('YuanTiKu.csv')
dates = [1001, 1002]
always_learner = always_do_new_problems(data, dates)
print(always_learner)
print('总是做新题的用户数量有:{0}个'.format(len(always_learner)))