docs: def lookup(self, form, df, only_built=True, pass_through=None):
          """
          This function does the developer model lookups for all the actual input data.
  
          Parameters
          ----------
          form : string
              One of the forms specified in the configuration file
          df: dataframe
              Pass in a single data frame which is indexed by parcel_id and has the
              following columns
          only_built : bool
              Whether to return only those buildings that are profitable and allowed
              by zoning, or whether to return as much information as possible, even if
              unlikely to be built (can be used when development might be subsidized
              or when debugging)
          pass_through : list of strings
              List of field names to take from the input parcel frame and pass
              to the output feasibility frame - is usually used for debugging
              purposes - these fields will be passed all the way through
              developer
  
          Input Dataframe Columns
          rent : dataframe
              A set of columns, one for each of the uses passed in the configuration.
              Values are yearly rents for that use.  Typical column names would be
              "residential", "retail", "industrial" and "office"
          land_cost : series
              A series representing the CURRENT yearly rent for each parcel.  Used to
              compute acquisition costs for the parcel.
          parcel_size : series
              A series representing the parcel size for each parcel.
          max_far : series
              A series representing the maximum far allowed by zoning.  Buildings
              will not be built above these fars.
          max_height : series
              A series representing the maxmium height allowed by zoning.  Buildings
              will not be built above these heights.  Will pick between the min of
              the far and height, will ignore on of them if one is nan, but will not
              build if both are nan.
          max_dua : series, optional
              A series representing the maximum dwelling units per acre allowed by
              zoning.  If max_dua is passed, the average unit size should be passed
              below to translate from dua to floor space.
          ave_unit_size : series, optional
              This is required if max_dua is passed above, otherwise it is optional.
              This is the same as the parameter to Developer.pick() (it should be the
              same series).
  
          Returns
          -------
          index : Series, int
              parcel identifiers
          building_sqft : Series, float
              The number of square feet for the building to build.  Keep in mind
              this includes parking and common space.  Will need a helpful function
              to convert from gross square feet to actual usable square feet in
              residential units.
          building_cost : Series, float
              The cost of constructing the building as given by the
              ave_cost_per_sqft from the cost model (for this FAR) and the number
              of square feet.
          total_cost : Series, float
              The cost of constructing the building plus the cost of acquisition of
              the current parcel/building.
          building_revenue : Series, float
              The NPV of the revenue for the building to be built, which is the
              number of square feet times the yearly rent divided by the cap
              rate (with a few adjustment factors including building efficiency).
          max_profit_far : Series, float
              The FAR of the maximum profit building (constrained by the max_far and
              max_height from the input dataframe).
          max_profit :
              The profit for the maximum profit building (constrained by the max_far
              and max_height from the input dataframe).
  
          """
          df = pd.concat(self._lookup_parking_cfg(form, parking_config, df, only_built,
                                                  pass_through)
                         for parking_config in self.config.parking_configs)
  
          if len(df) == 0:
              return pd.DataFrame()
  
          max_profit_ind = df.pivot(
              columns="parking_config",
              values="max_profit").idxmax(axis=1).to_frame("parking_config")
  
          df.set_index(["parking_config"], append=True, inplace=True)
          max_profit_ind.set_index(["parking_config"], append=True, inplace=True)
  
          # get the max_profit idx
          return df.loc[max_profit_ind.index].reset_index(1)