Beispiel #1
0
def to_tde(df, extractname, data_type, index = False, new_extract = False, append = True):
    '''
    change pandas dataframe to tableau data extract
    '''
    table_definition_map = { 
                            'bool' :    Type.BOOLEAN,
                            'integer':  Type.INTEGER,
                            'double':   Type.DOUBLE,
                            'date':     Type.DATE,
                            'datetime': Type.DATETIME,
                            'unicode':  Type.UNICODE_STRING,
                            'char':     Type.CHAR_STRING
                            }
    value_set_map = {
                  Type.BOOLEAN:        lambda row, col_num, value: row.setBoolean( col_num, bool(value) ),
                  Type.INTEGER:        lambda row, col_num, value: row.setInteger( col_num, int(value) ),
                  Type.DOUBLE:         lambda row, col_num, value: row.setDouble( col_num, float(value) ),
                  Type.UNICODE_STRING: lambda row, col_num, value: row.setString( col_num, unicode(value) ),
                  Type.CHAR_STRING:    lambda row, col_num, value: row.setCharString( col_num, value ),
                  Type.DATE:           lambda row, col_num, value: row.setDate(col_num, value.year, value.month, value.day),
                  Type.DATETIME:       lambda row, col_num, value: row.setDateTime( col_num,  value.year,  value.month,  value.day,
                                                                                  value.hour,  value.minute,  value.second,
                                                                                  value.microsecond/100 )
                  }
    
    if index:
        df_new = df.reset_index()
    else:
        df_new = df        
        
    if extractname[-4:] != '.tde':
        extractname += '.tde'    
    
    if new_extract & (extractname in os.listdir('.')):
            os.remove(extractname)
    extract_to_save = Extract(extractname)
            
    if extract_to_save.hasTable("Extract") & append:
        table_to_save = extract_to_save.openTable("Extract")
        table_definition = table_to_save.getTableDefinition()
    else:
        table_definition = TableDefinition()
        for colname in df_new.columns:
            type_code = table_definition_map[data_type.get(colname, 'unicode').lower()]
            table_definition.addColumn(colname, type_code)
        table_to_save = extract_to_save.addTable("Extract", table_definition) # currnetly table cannot be Extract!!!
    
    for df_row_tuple in df_new.iterrows():
        new_row = Row(table_definition)
        # new_rwo is a tuple of len 2, index and the row as series
        df_row = df_row_tuple[1]
        for col_num, (col_val, null_col) in enumerate(zip(df_row, df_row.isnull())):
            if null_col:
                new_row.setNull(col_num)
            else:
                value_set_map[table_definition.getColumnType(col_num)](new_row, col_num, col_val)
        table_to_save.insert(new_row)
    
    extract_to_save.close()
    ExtractAPI.cleanup()