def METHOD_NAME(self, node, weighted=False):
    """
    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.
    weighted: bool
        If weighted=True, the data must contain a `_weight` column specifying the
        weight of each datapoint (row). If False, assigns an equal weight to each
        datapoint.
    Returns
    -------
    Estimated CPD: pgmpy.factors.discrete.TabularCPD
        Estimated CPD for `node`.
    Examples
    --------
    >>> import pandas as pd
    >>> from pgmpy.models import BayesianNetwork
    >>> from pgmpy.estimators import MaximumLikelihoodEstimator
    >>> data = pd.DataFrame(data={'A': [0, 0, 1], 'B': [0, 1, 0], 'C': [1, 1, 0]})
    >>> model = BayesianNetwork([('A', 'C'), ('B', 'C')])
    >>> cpd_A = MaximumLikelihoodEstimator(model, data).estimate_cpd('A')
    >>> print(cpd_A)
    ╒══════╤══════════╕
    │ A(0) │ 0.666667 │
    ├──────┼──────────┤
    │ A(1) │ 0.333333 │
    ╘══════╧══════════╛
    >>> cpd_C = MaximumLikelihoodEstimator(model, data).estimate_cpd('C')
    >>> print(cpd_C)
    ╒══════╤══════╤══════╤══════╤══════╕
    │ A    │ A(0) │ A(0) │ A(1) │ A(1) │
    ├──────┼──────┼──────┼──────┼──────┤
    │ B    │ B(0) │ B(1) │ B(0) │ B(1) │
    ├──────┼──────┼──────┼──────┼──────┤
    │ C(0) │ 0.0  │ 0.0  │ 1.0  │ 0.5  │
    ├──────┼──────┼──────┼──────┼──────┤
    │ C(1) │ 1.0  │ 1.0  │ 0.0  │ 0.5  │
    ╘══════╧══════╧══════╧══════╧══════╛
    """
    state_counts = self.state_counts(node, weighted=weighted)
    # if a column contains only `0`s (no states observed for some configuration
    # of parents' states) fill that column uniformly instead
    state_counts.iloc[:, (state_counts.values == 0).all(axis=0)] = 1.0
    parents = sorted(self.model.get_parents(node))
    parents_cardinalities = [len(self.state_names[parent]) for parent in parents]
    node_cardinality = len(self.state_names[node])
    # Get the state names for the CPD
    state_names = {node: list(state_counts.index)}
    if parents:
        state_names.update(
            {
                state_counts.columns.names[i]: list(state_counts.columns.levels[i])
                for i in range(len(parents))
            }
        )
    cpd = TabularCPD(
        node,
        node_cardinality,
        np.array(state_counts),
        evidence=parents,
        evidence_card=parents_cardinalities,
        state_names={var: self.state_names[var] for var in chain([node], parents)},
    )
    cpd.normalize()
    return cpd