code: def build_columns(self, X, verbose=False):
          
          splines = self._terms[0].build_columns(X, verbose=verbose)
          for term in self._terms[1:]:
              marginal_splines = term.build_columns(X, verbose=verbose)
              splines = tensor_product(splines, marginal_splines)
  
          if self.by is not None:
              splines *= X[:, self.by][:, np.newaxis]
  
          return sp.sparse.csc_matrix(splines)
docs: construct the model matrix columns for the term
  
          Parameters
          ----------
          X : array-like
              Input dataset with n rows
  
          verbose : bool
              whether to show warnings
  
          Returns
          -------
          scipy sparse array with n rows