docs: def estimate_cpd(self, node, prior_type='BDeu', pseudo_counts=[], equivalent_sample_size=5):
          """
          Method to estimate the CPD for a given variable.
  
          Parameters
          ----------
          node: int, string (any hashable python object)
              The name of the variable for which the CPD is to be estimated.
  
          prior_type: 'dirichlet', 'BDeu', 'K2',
              string indicting which type of prior to use for the model parameters.
              - If 'prior_type' is 'dirichlet', the following must be provided:
                  'pseudo_counts' = dirichlet hyperparameters; 2-D array of shape
                   (node_card, product of parents_card) with a "virtual" count for 
                   each variable state in the CPD.
                   The virtual counts are added to the actual state counts found in the data.
                   (if a list is provided, a lexicographic ordering of states is assumed)
              - If 'prior_type' is 'BDeu', then an 'equivalent_sample_size'
                  must be specified instead of 'pseudo_counts'. This is equivalent to
                  'prior_type=dirichlet' and using uniform 'pseudo_counts' of
                  `equivalent_sample_size/(node_cardinality*np.prod(parents_cardinalities))`.
              - A prior_type of 'K2' is a shorthand for 'dirichlet' + setting every pseudo_count to 1,
                  regardless of the cardinality of the variable.
  
          Returns
          -------
          CPD: TabularCPD
  
          Examples
          --------
          >>> import pandas as pd
          >>> from pgmpy.models import BayesianModel
          >>> from pgmpy.estimators import BayesianEstimator
          >>> data = pd.DataFrame(data={'A': [0, 0, 1], 'B': [0, 1, 0], 'C': [1, 1, 0]})
          >>> model = BayesianModel([('A', 'C'), ('B', 'C')])
          >>> estimator = BayesianEstimator(model, data)
          >>> cpd_C = estimator.estimate_cpd('C', prior_type="dirichlet", pseudo_counts=[1, 2])
          >>> print(cpd_C)
          ╒══════╤══════╤══════╤══════╤════════════════════╕
          │ A    │ A(0) │ A(0) │ A(1) │ A(1)               │
          ├──────┼──────┼──────┼──────┼────────────────────┤
          │ B    │ B(0) │ B(1) │ B(0) │ B(1)               │
          ├──────┼──────┼──────┼──────┼────────────────────┤
          │ C(0) │ 0.25 │ 0.25 │ 0.5  │ 0.3333333333333333 │
          ├──────┼──────┼──────┼──────┼────────────────────┤
          │ C(1) │ 0.75 │ 0.75 │ 0.5  │ 0.6666666666666666 │
          ╘══════╧══════╧══════╧══════╧════════════════════╛
          """
  
          node_cardinality = len(self.state_names[node])
          parents = sorted(self.model.get_parents(node))
          parents_cardinalities = [len(self.state_names[parent]) for parent in parents]
          cpd_shape = (node_cardinality, np.prod(parents_cardinalities, dtype=int))
  
          if prior_type == 'K2':
              pseudo_counts = np.ones(cpd_shape, dtype=int)
          elif prior_type == 'BDeu':
              alpha = float(equivalent_sample_size) / (node_cardinality * np.prod(parents_cardinalities))
              pseudo_counts = np.ones(cpd_shape, dtype=float) * alpha
          elif prior_type == 'dirichlet':
              pseudo_counts = np.array(pseudo_counts)
              if pseudo_counts.shape != cpd_shape:
                  raise ValueError("The shape of pseudo_counts must be: {shape}".format(
                     shape=str(cpd_shape)))
          else:
              raise ValueError("'prior_type' not specified")
  
          state_counts = self.state_counts(node)
          bayesian_counts = state_counts + pseudo_counts
  
          cpd = TabularCPD(node, node_cardinality, np.array(bayesian_counts),
                           evidence=parents,
                           evidence_card=parents_cardinalities,
                           state_names=self.state_names)
          cpd.normalize()
          return cpd