code: public NumberColumn<?> numberColumn(int columnIndex) {
          Column<?> c = column(columnIndex);
          if (c.type() == ColumnType.STRING) {
              return ((StringColumn) c).asDoubleColumn();
          } else if (c.type() == ColumnType.BOOLEAN) {
              return ((BooleanColumn) c).asDoubleColumn();
          } else if (c.type() == ColumnType.LOCAL_DATE) {
              return ((DateColumn) c).asDoubleColumn();
          } else if (c.type() == ColumnType.LOCAL_DATE_TIME) {
              return ((DateTimeColumn) c).asDoubleColumn();
          } else if (c.type() == ColumnType.LOCAL_TIME) {
              return ((TimeColumn) c).asDoubleColumn();
          }
          return (NumberColumn<?>) column(columnIndex);
      }
docs: Returns the NumberColumn at the given index.
  If the index points to a String or a boolean column, a new NumberColumn is created and returned
  TODO(lwhite):Consider separating the indexed access and the column type mods, which must be for ML functions (in smile or elsewhere)
  @param columnIndex The 0-based index of a column in the table
  @return A number column
  @throws ClassCastException if the cast to NumberColumn fails