首页 > 解决方案 > 如何修复:将 bigquery 查询的结果与列表进行比较

问题描述

我是 Python 的新手,感谢所有帮助。我想要一个小组的活动列表,他们以这种方式以 4 美元的价格购买:购买日期在purchase_date(1,1,0,1,1,0,1)哪里,以及购买后的天数。1 表示活跃日,0 表示非活跃日。例如,表示购买开始,并且用户在 2 月 4 日、5 日、6 日和 10 日之后处于活动状态。purchase_datearrays indeces+120190203(1,1,1,0,0,0,1)2019-02-03

我尝试了下面的代码。脚步:

  1. 使用购买创建了一个数据表:four_dollar_buyers(user_pseudo_id,purchase_date)。查询它并将结果加载到four_dollar_purchases列表中。
  2. 重复four_dollar购买
  3. 制作了 2 个辅助数组: seven_days_date包含购买后的日期, seven_days_number应包含 1 和 0(在给定日期活跃或不活跃)
  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)。因此,由于某种原因,辅助数组不会改变,在购买日期之后它只给出零。我用 pprint 检查了变量 row[0] 和 actives,它们都包含正确的结果。

标签: pythongoogle-bigquerypython-bigquery

解决方案


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


推荐阅读