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)
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).