code: def extra_rows(self):
          
          return {
              term: attrs['extra_rows']
              for term, attrs in iteritems(self.graph.node)
          }
docs: A dict mapping `term` -> `# of extra rows to load/compute of `term`.
  
          Notes
          ----
          This value depends on the other terms in the graph that require `term`
          **as an input**.  This is not to be confused with `term.dependencies`,
          which describes how many additional rows of `term`'s inputs we need to
          load, and which is determined entirely by `Term` itself.
  
          Examples
          --------
          Our graph contains the following terms:
  
              A = SimpleMovingAverage([USEquityPricing.high], window_length=5)
              B = SimpleMovingAverage([USEquityPricing.high], window_length=10)
              C = SimpleMovingAverage([USEquityPricing.low], window_length=8)
  
          To compute N rows of A, we need N + 4 extra rows of `high`.
          To compute N rows of B, we need N + 9 extra rows of `high`.
          To compute N rows of C, we need N + 7 extra rows of `low`.
  
          We store the following extra_row requirements:
  
          self.extra_rows[high] = 9  # Ensures that we can service B.
          self.extra_rows[low] = 7
  
          See Also
          --------
          :meth:`zipline.pipeline.graph.ExecutionPlan.offset`
          :meth:`zipline.pipeline.term.Term.dependencies`