code: def construct_backdoor_estimand(
      treatment_name: List[str],
      outcome_name: List[str],
      common_causes: List[str],
  ):
      # TODO: outputs string for now, but ideally should do symbolic
      # expressions Mon 19 Feb 2018 04:54:17 PM DST
      # TODO Better support for multivariate treatments
  
      expr = None
      outcome_name = outcome_name[0]
      num_expr_str = outcome_name
      if len(common_causes) > 0:
          num_expr_str += "|" + ",".join(common_causes)
      expr = "d(" + num_expr_str + ")/d" + ",".join(treatment_name)
      sym_mu = sp.Symbol("mu")
      sym_sigma = sp.Symbol("sigma", positive=True)
      sym_outcome = spstats.Normal(num_expr_str, sym_mu, sym_sigma)
      sym_treatment_symbols = [sp.Symbol(t) for t in treatment_name]
      sym_treatment = sp.Array(sym_treatment_symbols)
      sym_conditional_outcome = spstats.Expectation(sym_outcome)
      sym_effect = sp.Derivative(sym_conditional_outcome, sym_treatment)
  
      sym_assumptions = {
          "Unconfoundedness": (
              "If U\N{RIGHTWARDS ARROW}{{{0}}} and U\N{RIGHTWARDS ARROW}{1}"
              " then P({1}|{0},{2},U) = P({1}|{0},{2})"
          ).format(
              ",".join(treatment_name),
              outcome_name,
              ",".join(common_causes),
          )
      }
  
      estimand = {
          "estimand": sym_effect,
          "assumptions": sym_assumptions,
      }
      return estimand
  
imports: import itertools
  import logging
  from enum import Enum
  from typing import Dict, List, Optional, Union
  import networkx
  import sympy
  import sympy.stats
  from dowhy.causal_identifier.efficient_backdoor import EfficientBackdoor
  from dowhy.causal_identifier.identified_estimand import IdentifiedEstimand
  from dowhy.graph import check_dseparation, check_valid_backdoor_set, check_valid_frontdoor_set, check_valid_mediation_set, do_surgery, get_all_directed_paths, get_backdoor_paths, get_descendants, get_instruments, has_directed_path
  from dowhy.utils.api import parse_state
label_desc: Use image node_id 15 for calling a global function with example usage: construct_backdoor_estimand(treatment_name, outcome_name, common_causes) and returns: estimand