class_docstr: Factor results class
  
  For result summary, scree/loading plots and factor rotations
  
  Parameters
  ----------
  factor : Factor
      Fitted Factor class
  
  Attributes
  ----------
  uniqueness : ndarray
      The uniqueness (variance of uncorrelated errors unique to
      each variable)
  communality : ndarray
      1 - uniqueness
  loadings : ndarray
      Each column is the loading vector for one factor
  loadings_no_rot : ndarray
      Unrotated loadings, not available under maximum likelihood
      analysis.
  eigenvals : ndarray
      The eigenvalues for a factor analysis obtained using
      principal components; not available under ML estimation.
  n_comp : int
      Number of components (factors)
  nbs : int
      Number of observations
  fa_method : str
      The method used to obtain the decomposition, either 'pa' for
      'principal axes' or 'ml' for maximum likelihood.
  df : int
      Degrees of freedom of the factor model.
  
  Notes
  -----
  Under ML estimation, the default rotation (used for `loadings`) is
  condition IC3 of Bai and Li (2012).  Under this rotation, the
  factor scores are iid and standardized.  If `G` is the canonical
  loadings and `U` is the vector of uniquenesses, then the
  covariance matrix implied by the factor analysis is `GG' +
  diag(U)`.
  
  Status: experimental, Some refactoring will be necessary when new
      features are added.
class_docstr_tok: ["Factor","results","class","For","result","summary",",","scree\/loading","plots","and","factor","rotations","Parameters","--","--","--","--","--","factor",":","Factor","Fitted","Factor","class","Attributes","--","--","--","--","--","uniqueness",":","ndarray","The","uniqueness","(","variance","of","uncorrelated","errors","unique","to","each","variable",")","communality",":","ndarray","1","-","uniqueness","loadings",":","ndarray","Each","column","is","the","loading","vector","for","one","factor","loadings_no_rot",":","ndarray","Unrotated","loadings",",","not","available","under","maximum","likelihood","analysis",".","eigenvals",":","ndarray","The","eigenvalues","for","a","factor","analysis","obtained","using","principal","components",";","not","available","under","ML","estimation",".","n_comp",":","int","Number","of","components","(","factors",")","nbs",":","int","Number","of","observations","fa_method",":","str","The","method","used","to","obtain","the","decomposition",",","either","'pa","'","for","'principal","axes","'","or","'ml","'","for","maximum","likelihood",".","df",":","int","Degrees","of","freedom","of","the","factor","model",".","Notes","--","--","-","Under","ML","estimation",",","the","default","rotation","(","used","for","`","loadings","`",")","is","condition","IC3","of","Bai","and","Li","(","2012",")",".","Under","this","rotation",",","the","factor","scores","are","iid","and","standardized",".","If","`","G","`","is","the","canonical","loadings","and","`","U","`","is","the","vector","of","uniquenesses",",","then","the","covariance","matrix","implied","by","the","factor","analysis","is","`","GG","'","+","diag","(","U",")","`",".","Status",":","experimental",",","Some","refactoring","will","be","necessary","when","new","features","are","added","."]
docstr: Summary
docstr_tok: ["Summary"]
code: def summary(self):
      """Summary"""
      summ = summary2.Summary()
      summ.add_title("Factor analysis results")
      loadings_no_rot = pd.DataFrame(
          self.loadings_no_rot,
          columns=[
              "factor %d" % (i)
              for i in range(self.loadings_no_rot.shape[1])
          ],
          index=self.endog_names,
      )
      if hasattr(self, "eigenvals"):
          # eigenvals not available for ML method
          eigenvals = pd.DataFrame(
              [self.eigenvals], columns=self.endog_names, index=[""]
          )
          summ.add_dict({"": "Eigenvalues"})
          summ.add_df(eigenvals)
      communality = pd.DataFrame(
          [self.communality], columns=self.endog_names, index=[""]
      )
      summ.add_dict({"": ""})
      summ.add_dict({"": "Communality"})
      summ.add_df(communality)
      summ.add_dict({"": ""})
      summ.add_dict({"": "Pre-rotated loadings"})
      summ.add_df(loadings_no_rot)
      summ.add_dict({"": ""})
      if self.rotation_method is not None:
          loadings = pd.DataFrame(
              self.loadings,
              columns=[
                  "factor %d" % (i)
                  for i in range(self.loadings.shape[1])
              ],
              index=self.endog_names,
          )
          summ.add_dict(
              {"": "%s rotated loadings" % (self.rotation_method)}
          )
          summ.add_df(loadings)
      return summ
  
imports: import warnings
  import numpy
  from numpy.linalg import eigh, inv, norm, matrix_rank
  import pandas
  from scipy.optimize import minimize
  from statsmodels.tools.decorators import cache_readonly
  from statsmodels.base.model import Model
  from statsmodels.iolib import summary2
  from statsmodels.graphics.utils import _import_mpl
  from .factor_rotation import rotate_factors, promax
label_desc: Use image node_id 7 for calling the FactorResults obj's underlying member method code with example usage: obj.summary() and returns: summ