<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _calculate_adjustment( lcm, choosers, alternatives, alt_segmenter, clip_change_low, clip_change_high, multiplier_func=None):
 """ Calculate adjustments to prices to compensate for supply and demand effects. Parameters lcm : LocationChoiceModel Used to calculate the probability of agents choosing among alternatives. Must be fully configured and fitted. choosers : pandas.DataFrame alternatives : pandas.DataFrame alt_segmenter : pandas.Series Will be used to segment alternatives and probabilities to do comparisons of supply and demand by submarket. clip_change_low : float The minimum amount by which to multiply prices each iteration. clip_change_high : float The maximum amount by which to multiply prices each iteration. multiplier_func : function (returns Series, boolean) A function which takes separate demand and supply Series and returns a tuple where the first item is a Series with the ratio of new price to old price (all indexes should be the same) - by default the ratio of demand to supply is the ratio of the new price to the old price. The second return value is a boolean which when True tells this module to stop looping (that convergence has been satisfied) Returns ------- alts_muliplier : pandas.Series Same index as `alternatives`, values clipped to `clip_change_low` and `clip_change_high`. submarkets_multiplier : pandas.Series Index is unique values from `alt_segmenter`, values are the ratio of demand / supply for each segment in `alt_segmenter`. finished : boolean boolean indicator that this adjustment should be considered the final adjustment (if True). If false, the iterative algorithm should continue. """

    logger.debug('start: calculate supply and demand price adjustment ratio')
    # probabilities of agents choosing * number of agents = demand
    demand = lcm.summed_probabilities(choosers, alternatives)
    # group by submarket
    demand = demand.groupby(alt_segmenter.loc[demand.index].values).sum()

    # number of alternatives
    supply = alt_segmenter.value_counts()

    if multiplier_func is not None:
        multiplier, finished = multiplier_func(demand, supply)
    else:
        multiplier, finished = (demand / supply), False
    multiplier = multiplier.clip(clip_change_low, clip_change_high)

    # broadcast multiplier back to alternatives index
    alts_muliplier = multiplier.loc[alt_segmenter]
    alts_muliplier.index = alt_segmenter.index

    logger.debug(
        ('finish: calculate supply and demand price adjustment multiplier '
         'with mean multiplier {}').format(multiplier.mean()))
    return alts_muliplier, multiplier, finished