<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _check_curtailment_target(curtailment, curtailment_target, curtailment_key):
 """ Raises an error if curtailment target was not met in any time step. Parameters curtailment : :pandas:`pandas:DataFrame<dataframe>` Dataframe containing the curtailment in kW per generator and time step. Index is a :pandas:`pandas.DatetimeIndex<datetimeindex>`, columns are the generator representatives. curtailment_target : :pandas:`pandas.Series<series>` The curtailment in kW that was to be distributed amongst the generators. Index of the series is a :pandas:`pandas.DatetimeIndex<datetimeindex>`. curtailment_key : :obj:`str` or :obj:`tuple` with :obj:`str` The technology and weather cell ID if :obj:`tuple` or only the technology if :obj:`str` the curtailment was specified for. """

    if not (abs(curtailment.sum(axis=1) - curtailment_target) < 1e-1).all():
        message = 'Curtailment target not met for {}.'.format(curtailment_key)
        logging.error(message)
        raise TypeError(message)