将 pandas dtype 转换为 BigQuery 类型表示

Vor*_*Vor 2 python numpy pandas google-bigquery

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

目标

  1. 确定 data_types
  2. 返回JSON其中 key 是列名,value 是数据类型之一: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
Run Code Online (Sandbox Code Playgroud)

结果

[{'type': 'INTEGER', 'name': 'VALUE'}, {'type': 'INTEGER', 'name': 'ID'}, {'type': 'STRING', 'name': 'Key'}, {'type': 'STRING', 'name': 'EmailAddress'}]
Run Code Online (Sandbox Code Playgroud)

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

我想改进什么

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

Fel*_*ffa 5

好消息!从 0.13 版开始,pandas 正式(并且实验性地)支持 Google BigQuery。

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

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

(感谢皮尔逊!)