code: def kmeans(X, k, round_values=True):
      
  
      group_names = [str(i) for i in range(X.shape[1])]
      if str(type(X)).endswith("'pandas.core.frame.DataFrame'>"):
          group_names = X.columns
          X = X.values
      kmeans = KMeans(n_clusters=k, random_state=0).fit(X)
  
      if round_values:
          for i in range(k):
              for j in range(X.shape[1]):
                  ind = np.argmin(np.abs(X[:,j] - kmeans.cluster_centers_[i,j]))
                  kmeans.cluster_centers_[i,j] = X[ind,j]
      return DenseData(kmeans.cluster_centers_, group_names, None, 1.0*np.bincount(kmeans.labels_))
docs: Summarize a dataset with k mean samples weighted by the number of data points they
      each represent.
  
      Parameters
      ----------
      X : numpy.array or pandas.DataFrame
          Matrix of data samples to summarize (# samples x # features)
  
      k : int
          Number of means to use for approximation.
  
      round_values : bool
          For all i, round the ith dimension of each mean sample to match the nearest value
          from X[:,i]. This ensures discrete features always get a valid value.
  
      Returns
      -------
      DenseData object.