<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 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)