【问题标题】:converting google datastore query result to pandas dataframe in python在python中将谷歌数据存储查询结果转换为熊猫数据框
【发布时间】:2020-01-06 00:11:49
【问题描述】:

我需要将 Google Cloud Datastore 查询结果转换为数据框,以根据检索到的数据创建图表。查询:

def fetch_times(limit):
    start_date = '2019-10-08'
    end_date = '2019-10-19'
    query = datastore_client.query(kind='ParticleEvent')
    query.add_filter(
        'published_at', '>', start_date)
    query.add_filter(
        'published_at', '<', end_date)
    query.order = ['-published_at']
    times = query.fetch(limit=limit)
    return times

为查询返回的每个实体创建一个类似 json 的字符串:

  • Entity('ParticleEvent', 5942717456580608) {'gc_pub_sub_id': '438169950283983', 'data': '605', 'event': '光强度', 'published_at': '2019-10-11T14:37: 45.407Z', 'device_id': 'e00fce6847be7713698287a1'}>

我以为我找到了可以转换为 json 的东西,我可以将其转换为数据框,但是得到一个错误,即 properties 属性不存在:

def to_json(gql_object):
    result = []
    for item in gql_object:
        result.append(dict([(p, getattr(item, p)) for p in item.properties()]))
    return json.dumps(result, cls=JSONEncoder)

有没有办法遍历查询结果以将它们直接转换为数据帧或转换为 json 然后转换为数据帧?

【问题讨论】:

  • Here 是一个类似的帖子,可以帮助你。这个是给fetch JSON from Datastore
  • 您能否在控制台打印什么是项目和整个 gql_object,以便提供解决方案?

标签: python json pandas google-app-engine google-cloud-platform


【解决方案1】:

可以将数据存储实体视为 Python 基础字典!所以你应该能够做一些简单的事情......

df = pd.DataFrame(datastore_entities)

一个数据框。

假设输出是您在上面共享的字符串,那么以下方法可以工作。 ...而pandas 将完成其余所有工作。

如果您需要将实体key 或其任何属性也转换为列,您可以将它们单独打包到字典中:

for e in entities: #go through entities
    e['entity_key'] = e.key #assign the entity key
    e['entity_key_name'] = e.key.name  # for example

df = pd.DataFrame(entities)

【讨论】:

    【解决方案2】:

    您可以使用pd.read_json 将您的 json 查询输出读入数据框。

    假设输出是您在上面共享的字符串,那么以下方法可以工作。

    #Extracting the beginning of the dictionary
    startPos = line.find("{")
    
    df = pd.DataFrame([eval(line[startPos:-1])])
    
    

    输出看起来像:

         gc_pub_sub_id data            event              published_at  \
    0  438169950283983  605  light intensity  2019-10-11T14:37:45.407Z   
    
                      device_id  
    0  e00fce6847be7713698287a1 
    

    这里,line[startPos:-1] 本质上是该字符串输入中的整个字典。使用eval,我们可以将其转换为实际的字典。一旦我们有了它,它就可以很容易地转换成一个数据框对象

    【讨论】:

    • 感谢您的意见。查询输出不是真正的 json,但相似之处在于它是 {keyword: value}。
    • 你能提供一些数据样本吗?如果没有正确的数据格式,很难给出准确的解决方案
    • 我在Entity('ParticleEvent', 5942717456580608) {'gc_pub_sub_id': '438169950283983', 'data': '605', 'event': 'light intensity', 'published_at': '2019-10-11T14:37:45.407Z', 'device_id': 'e00fce6847be7713698287a1'}上方包含了一个示例查询输出
    • 我找到了一个(相当肮脏的)解决方法。我将查询结果对象中的每一项都转换为字符串,然后手动解析字符串,将我需要的数据提取到一个列表中。现在再次查看输出,我可能已经能够剪掉项目的标题部分:Entity('ParticleEvent', 5942717456580608),这将只留下(键:值)。那么它可能被识别为json更容易转换。
    • 您能否发布您的变通解决方案作为答案,以提高其他社区用户的可见性?谢谢。
    【解决方案3】:

    原贴找到了一个变通的办法,就是将查询结果对象中的每一项都转换成字符串,然后手动解析字符串,将需要的数据提取到一个列表中。

    【讨论】:

      【解决方案4】:

      fetch 函数的返回值为google.cloud.datastore.query.Iterator,其行为类似于List[dict],因此fetch 的输出可以直接传递给pd.DataFrame

      import pandas as pd
      
      df = pd.DataFrame(fetch_times(10))
      

      这个和@bkitej类似,但是我添加了原海报的功能的使用。

      【讨论】:

        猜你喜欢
        • 2021-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-13
        • 2021-11-28
        • 2018-03-20
        • 2021-08-21
        相关资源
        最近更新 更多