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()
def make_table_definition(df): table_definition = TableDefinition() for column in df.columns: tableau_column = column.title().replace('_', ' ') tableau_dtype = mapper[df[column].dtype]['tableau_datatype'] table_definition.addColumn(tableau_column, tableau_dtype) return table_definition
def setUp(self): self.table_def = TableDefinition() self.table_def.addColumn("int_1", Type.INTEGER) self.table_def.addColumn("int_2", Type.INTEGER) self.table_def.addColumn("date", Type.DATETIME) self.col_metadata = { 1: Type.INTEGER, 2: Type.INTEGER, 3: Type.DATETIME, }
def _build_skeleton(self): """ Gets the columns from the table or view and then auto builds the Tableau table definition - the skeleton of the extract we want to create :return: table_def: Tableau table definition """ table_def = TableDefinition() db_table_columns = self._db_consumer.get_table_definition() for field_name, position, field_type in db_table_columns: table_def.addColumn(field_name, field_type) self.columns[position] = field_type return table_def