【问题标题】:Convert pandas dtypes to BigQuery type representation将 pandas dtypes 转换为 BigQuery 类型表示
【发布时间】:2014-03-20 03:39:52
【问题描述】:

我刚刚安装了 pandas 和 numpy,对它们没有任何经验。我正在尝试获取类似于您需要传递给 Google BigQuery 的 json 数据结构。 https://developers.google.com/bigquery/docs/reference/v2/jobs#configuration.load.encoding

目标

  1. 确定数据类型
  2. 返回JSON,其中键是列名,值是数据类型之一:STRING, INTEGER, FLOAT, BOOLEAN, TIMESTAMP or RECORD

我尝试过的

 import numpy as np                                                              
 import pandas as pd                                                             
 import config                                                                   
 import boto                                                                     
 from StringIO import StringIO                                                   

 k = boto.connect_s3(**config.AWS_PARAMS).get_bucket('xxxxxxx').get_key('DATA.csv')                                          
 o = StringIO(k.get_contents_as_string())                                             
 df = pd.read_csv(o)                                                             

 def map_dtype(dtype):                                                                                                                                 
     if dtype.kind == 'i':                                                       
         # [int8, int16, int32, int64]                                           
         return "INTEGER"                                                        
     elif dtype.kind == 'u':                                                     
         # [uint8, uint16, uint32, uint64]                                       
         return "INTEGER"                                                        
     else:                                                                       
         return "STRING"                                                         

 fields = []                                                                     
 for c, d  in zip(df.columns, df.dtypes):                                        
         field = {}                                                              
         field['type'] = map_dtype(d)                                            
         field['name'] = c                                                       
         fields.append(field)                                                    


 print fields

结果

[{'type': 'INTEGER', 'name': 'VALUE'}, {'type': 'INTEGER', 'name': 'ID'}, {'type': 'STRING', 'name': 'Key'}, {'type': 'STRING', 'name': 'EmailAddress'}]

如您所见,我得到了正确的结果。但我不喜欢我的做法。我觉得有一种更简单的方法可以做到这一点。

我想改进的地方

  1. map_dtype() 函数,如您所见,我必须在 BigQuery 中使用字符串表示手动映射数据类型
  2. For each loop,感觉应该有一种更简单的方法可以将 data_type 分配给列。

【问题讨论】:

    标签: python numpy pandas google-bigquery


    【解决方案1】:

    我不确定pandas.io.gbq 中的方法是否会对您有很大帮助。如果我理解正确,您有一个 CSV 文件,并且您正在尝试将 dtypes 映射到 BigQuery 类型。据我在pandas.io.gbq 工作时发现,没有真正方便的方法来做到这一点。

    有关 numpy 类型的有用列表,请参阅: http://docs.scipy.org/doc/numpy/reference/arrays.interface.html#arrays-interface

    基本类型字符代码有:

    • t 位域(后面的整数给出位域中的位数)。
    • b 布尔型(整数类型,所有值都只有 True 或 False)
    • i 整数
    • u 无符号整数
    • f 浮点数
    • c 复数浮点
    • O 对象(即内存包含指向 PyObject 的指针)
    • S 字符串(char 的定长序列)
    • U Unicode(Py_UNICODE 的定长序列)
    • V 其他(void * - 每个项目都是固定大小的内存块)

    在这种情况下,我觉得字典是查找的最佳选择,您可以将 for 循环替换为列表理解:

    df = DataFrame({'a' : [1,2], 'b' : [True, False], 'c' : [1.1, 2.1], 'd' : ['a', 'b']})
    type_dict = {
        'b' : 'BOOLEAN',
        'i' : 'INTEGER',
        'f' : 'FLOAT',
        'O' : 'STRING',
        'S' : 'STRING',
        'U' : 'STRING'
    }
    [{'name' : col_name, 'type' : type_dict.get(col_type.kind, 'STRING')} for (col_name, col_type) in df.dtypes.iteritems()]
    

    产量:

    [{'type': 'INTEGER', 'name': 'a'}, {'type': 'BOOLEAN', 'name': 'b'}, {'type': 'FLOAT', 'name': 'c'}, {'type': 'STRING', 'name': 'd'}]
    

    在这种情况下,我在 dict 中明确引用了 'O'、'S' 和 'U' - 您可以通过多种方式处理此问题。显然,需要小心“O”的情况,因为它可能没有有用的字符串表示。同样,由于我使用.get() 方法,我假设不支持的类型的字符串表示总比没有好。这对您来说可能不是这种情况(或者您可能希望避免可能的类型转换),因此最好直接将值查找为 type_dict[col_type] 并根据具体情况处理异常。

    【讨论】:

    • 非常感谢,帮了大忙!
    【解决方案2】:

    好消息!自 0.13 版以来,pandas 正式(和实验性地)支持 Google BigQuery。

    检查read_gbq,尤其是to_gbq(将数据放入BigQuery):http://pandas.pydata.org/pandas-docs/stable/api.html#google-bigquery

    此处提供示例笔记本的视频和链接:

    (感谢皮尔森!)

    【讨论】:

    • 我看到了这些函数,但问题是我不想将数据发送到 BigQuery,我只需要 JSON 格式的输出,具有相同的数据类型
    猜你喜欢
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 2020-08-06
    • 2017-11-22
    • 2020-07-29
    相关资源
    最近更新 更多