2017-06-07 52 views
-1

我目前正在从Web API中提取数据,我试图根据以下条件过滤一些值:计算用户在两个给定日期之间出现的次数,但仅限于他/她已经购买的物品树莓派,香蕉PI和覆盆子PI2,而不是项目树莓PI3在Python中限制计数器集合

,我收到具有以下结构的JSON对象:

[{ 
user_id : 0001 
CreatedOn: "2017-02-16 15:54:48", 
item: "raspbery pi", 
VIP: "YES", 
Vendor_CODE: "XYZ12345", 
}, 
{ 
user_id : 0001 
CreatedOn: "2017-02-15 13:49:16", 
item: "raspbery pi2", 
VIP: "YES", 
Vendor_CODE: "XYZ67890", 
}, 
{ 
user_id : 0001 
CreatedOn: "2017-02-10 15:54:48", 
item: "raspbery pi", 
VIP: "YES", 
Vendor_CODE: "RST171820", 
}, 
{ 
user_id : 0001 
CreatedOn: "2017-01-01 21:51:13", 
item: "raspbery pi3", 
VIP: "YES", 
Vendor_CODE: "XOL002321", 
}, 
{ 
user_id : 0005 
CreatedOn: "2017-01-30 17:34:18", 
item: "raspbery pi", 
VIP: "YES", 
Vendor_CODE: "RST171820", 
}, 
{ 
user_id : 0005 
CreatedOn: "2017-05-30 09:04:08", 
item: "banana pi", 
VIP: "YES", 
Vendor_CODE: "ITI342027", 
}] 

目前,我有以下的代码,计数用户出现两次日期的次数。

from django.shortcuts import render 
from django.http import JsonResponse 
from rest_framework.views import APIView 
from rest_framework.response import Response 
from collections import Counter 
from datetime import datetime, timedelta 
import json, urllib.request, dateutil.parser, urllib.parse, 

#Request a response to the Web API 
def get_data(request, *args, **kwargs): 
    # YYYY-MM-DD 
    start_date = datetime.now() - timedelta(days=7) 
    end_date = datetime.now() - timedelta(days=1) 

    with urllib.request.urlopen("http://10.61.202.98:8081/T/ansdb/api/rows/dev/ect",timeout=15) as url: 
    response_data = json.loads(url.read().decode()) 

    #count the number of times the user appears when he bought the 4 items in two given dates 
    count_user_01 = Counter([k['user_id'] for k in response_data if 
     start_date_week < dateutil.parser.parse(k.get('CreatedOn')) < end_date_week]) 

我的方法是添加一些额外的“条件”来算,除了项目树莓PI3所有物品,像:

count_user_01 = Counter([k['user_id'] for k in response_data if 
    start_date_week < dateutil.parser.parse(k.get('CreatedOn')) < end_date_week] and k['item']!='raspberry pi3') 

但如果我这样做,那么我会遇到的错误布尔对象是不可迭代的,我想我收到此错误,因为收集计数器不允许我这样做。

我的问题是:

  1. 我怎样才能实现这个额外的条件到列表中,所以我可以算,除了覆盆子PI3所有的项目,是由一个用户买的?

  2. 目前,我正在计算为特定用户购买的物品,但是如何计算所有用户购买的所有物品?

欢迎提出所有意见,解答和建议。

更新

问题1解决方案是修复在括号中的问题。

count_user_01 = Counter([k['user_id'] for k in response_data if 
start_date_week < dateutil.parser.parse(k.get('CreatedOn')) < end_date_week and k['item']!='raspberry pi3']) 
+0

检查括号。 – user2357112

+0

you mean count_user_01 = Counter([k ['user_id'] for k in response_data if start_date_week

回答

0

我觉得你的括号有问题。试试这个:

count_user_01 = Counter([k['user_id'] for k in response_data if 
    start_date_week < dateutil.parser.parse(k.get('CreatedOn')) < end_date_week and k['item']!='raspberry pi3']) 
+0

这个解决方案帮助我解决了问题1,但是我怎样才能让这些代码适用于问题2? –