docs: def insert(self, index, column, default_value='', values=None,
                 compute_value_func=None, compute_key=None):
          """
              This will insert a new column at index and then set the value
              unless compute_value is provided
          :param index: int index of where to insert the column
          :param column: str of the name of the column
          :param default_value: obj of the default value
          :param values: obj of the column values (length should equal table)
          :param compute_value_func: func to compute the value given the row
          :param compute_key: str of the column to send to computer_value_func
                  instead of row
          :return: None
          """
          for row in self.table:
              value = values.pop(0) if values else default_value
              if compute_value_func is not None:
                  value = compute_value_func(
                      row if compute_key is None else row[compute_key])
  
              if index is None:
                  row.append(value)
              else:
                  row.insert(index, value)
  
          if index is None:
              self.row_columns += [column]
              if self.row_columns is not self.columns and \
                              column not in self.columns:
                  self.columns.append(column)
          else:
              self.row_columns = self.row_columns[:index] + [column] \
                                 + self.row_columns[index:]
              self.columns.insert(index, column)
  
          self._parameters[column] = list(set(self.get_column(column)))