如何解决:将BigQuery查询结果与列表进行比较

时间:2019-07-17 11:02:50

标签: python google-bigquery python-bigquery

我是Python的新手,感谢所有帮助。 我想要一个小组的活动清单,他们以4 $的价格购买:purchase_date(1,1,0,1,1,0,1),其中purchase_date是购买日期,而arrays indeces+1是购买后的日子。 1表示活动日,0表示不活动日。 例如。 20190203(1,1,1,0,0,0,1)表示购买是在2019-02-03上进行的,并且用户在2月4日,5日,6日和10日之后一直处于活动状态。

我尝试了以下代码。 步骤:

  1. 使用购买的four_dollar_buyers(user_pseudo_id,purchase_date)创建了一个数据表。对其进行查询并将结果加载到four_dollar_purchases列表中。
  2. four_dollar的购买进行迭代
  3. 制作了2个辅助数组: seven_days_date包含购买后的日期 seven_days_number应包含一和零(在给定的状态下为活动状态或不为活动状态) 天)
  4. 遍历seven_days_date,从 给定日期,则得出当天活动用户的ID。加载 查询结果进入名为“ actives”的列表
  5. 如果给定购买的user_id处于有效状态,则 seven_days_number数组应在给定索引上从0变为1。
client = bigquery.Client(project="project")

QUERY = ('SELECT * FROM `project.four_dollar_buyers`')
query_job = client.query(QUERY)                             
four_dollar_purchases = list(query_job.result())                        

for row in four_dollar_purchases:                                       

  seven_days_date = ["","","","","","",""]                          
  seven_days_number = [0,0,0,0,0,0,0]                                   

  for i in range(7):
    date_time_obj = datetime.strptime(row[1], '%Y%m%d')                 
    date_time_obj = date_time_obj + timedelta(days=1)+timedelta(days=i)         
    seven_days_date[i] = date_time_obj.strftime("%Y%m%d")                   

  for idx, days in enumerate(seven_days_date):

    QUERY = ('''SELECT DISTINCT user_pseudo_id FROM 
    `project.events_'''+days+'''` WHERE event_name IN 
    ("activity_added")''')
    query_job = client.query(QUERY)
    actives = list(query_job.result())                          


  if row[0] in actives:                                 
    seven_days_number[idx] = 1                              


  print(row[1] + str(seven_days_number))

不再有错误消息,但是所有结果都类似于20181212(0,0,0,0,0,0,0)。 因此,由于某种原因,辅助数组不会更改,在购买日期之后,它仅给出零。 我检查了变量row [0]并使用pprint激活它们,它们都包含正确的结果。

2 个答案:

答案 0 :(得分:0)

天不是ralaxpy建议的整数类型。因此,您可以使用枚举或其他方式来使用索引来修改列表。

答案 1 :(得分:0)

query_job = client.query(QUERY)
actives = list(query_job.result())

for dict in actives:
  if dict[0] == row[0]:
    seven_days_number[idx] = 1

print(row[1] + str(seven_days_number))