code: def PCA(x, n=False):
      
      # select n if not provided
      if not n:
          n = x.shape[1] - 1   
      # validate inputs
      try:    
          x = np.array(x)
      except:
          raise ValueError('Impossible to convert x to a numpy array.')
      assert type(n) == int, "Provided n is not an integer."
      assert x.shape[1] > n, "The requested n is bigger than \
          number of features in x."
      # eigen values and eigen vectors of data covariance matrix
      eigen_values, eigen_vectors = np.linalg.eig(np.cov(x.T))
      # sort eigen vectors according biggest eigen value
      eigen_order = eigen_vectors.T[(-eigen_values).argsort()]
      # form output - reduced x matrix
      return eigen_order[:n].dot(x.T).T
docs: Principal component analysis function.
  
      **Args:**
  
      * `x` : input matrix (2d array), every row represents new sample
  
      **Kwargs:**
  
      * `n` : number of features returned (integer) - how many columns 
        should the output keep
  
      **Returns:**
      
      * `new_x` : matrix with reduced size (lower number of columns)