class_docstr: Graph represention of Pipeline Term dependencies that includes metadata
  about extra rows required to perform computations.
  
  Each node in the graph has an `extra_rows` attribute, indicating how many,
  if any, extra rows we should compute for the node.  Extra rows are most
  often needed when a term is an input to a rolling window computation.  For
  example, if we compute a 30 day moving average of price from day X to day
  Y, we need to load price data for the range from day (X - 29) to day Y.
  
  Parameters
  ----------
  terms : dict
      A dict mapping names to final output terms.
  all_dates : pd.DatetimeIndex
      An index of all known trading days for which ``terms`` will be
      computed.
  start_date : pd.Timestamp
      The first date for which output is requested for ``terms``.
  end_date : pd.Timestamp
      The last date for which output is requested for ``terms``.
  
  Attributes
  ----------
  outputs
  offset
  extra_rows
  
  Methods
  -------
  ordered()
      Return a topologically-sorted iterator over the terms in self.
class_docstr_tok: ["Graph","represention","of","Pipeline","Term","dependencies","that","includes","metadata","about","extra","rows","required","to","perform","computations",".","Each","node","in","the","graph","has","an","`","extra_rows","`","attribute",",","indicating","how","many",",","if","any",",","extra","rows","we","should","compute","for","the","node",".","Extra","rows","are","most","often","needed","when","a","term","is","an","input","to","a","rolling","window","computation",".","For","example",",","if","we","compute","a","30","day","moving","average","of","price","from","day","X","to","day","Y",",","we","need","to","load","price","data","for","the","range","from","day","(","X","-","29",")","to","day","Y.","Parameters","--","--","--","--","--","terms",":","dict","A","dict","mapping","names","to","final","output","terms",".","all_dates",":","pd.DatetimeIndex","An","index","of","all","known","trading","days","for","which","``","terms","``","will","be","computed",".","start_date",":","pd.Timestamp","The","first","date","for","which","output","is","requested","for","``","terms","``",".","end_date",":","pd.Timestamp","The","last","date","for","which","output","is","requested","for","``","terms","``",".","Attributes","--","--","--","--","--","outputs","offset","extra_rows","Methods","--","--","--","-","ordered","(",")","Return","a","topologically-sorted","iterator","over","the","terms","in","self","."]
code: def __init__(
      self, terms, all_dates, start_date, end_date, min_extra_rows=0
  ):
      super(ExecutionPlan, self).__init__(terms)
  
      for term in list(terms.values()):
          self.set_extra_rows(
              term,
              all_dates,
              start_date,
              end_date,
              min_extra_rows=min_extra_rows,
          )
  
imports: from networkx import DiGraph, topological_sort
  from six import iteritems, itervalues
  from catalyst.utils.memoize import lazyval
  from catalyst.pipeline.visualize import display_graph
  from .term import LoadableTerm
label_desc: Use image node_id 1 to create a new ExecutionPlan object from inherited base classes: TermGraph with example: obj = ExecutionPlan(terms, all_dates, start_date, end_date, min_extra_rows)