<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def from_zhang_huang_solar(cls, location, cloud_cover, relative_humidity, dry_bulb_temperature, wind_speed, atmospheric_pressure=None, timestep=1, is_leap_year=False, use_disc=False):
 """Create a wea object from climate data using the Zhang-Huang model. The Zhang-Huang solar model was developed to estimate solar irradiance for weather stations that lack such values, which are typically colleted with a pyranometer. Using total cloud cover, dry-bulb temperature, relative humidity, and wind speed as inputs the Zhang-Huang estimates global horizontal irradiance by means of a regression model across these variables. For more information on the Zhang-Huang model, see the EnergyPlus Engineering Reference: https://bigladdersoftware.com/epx/docs/8-7/engineering-reference/climate-calculations.html#zhang-huang-solar-model Args: location: Ladybug location object. cloud_cover: A list of annual float values between 0 and 1 that represent the fraction of the sky dome covered in clouds (0 = clear; 1 = completely overcast) relative_humidity: A list of annual float values between 0 and 100 that represent the relative humidity in percent. dry_bulb_temperature: A list of annual float values that represent the dry bulb temperature in degrees Celcius. wind_speed: A list of annual float values that represent the wind speed in meters per second. atmospheric_pressure: An optional list of float values that represent the atmospheric pressure in Pa. If None or left blank, pressure at sea level will be used (101325 Pa). timestep: An optional integer to set the number of time steps per hour. Default is 1 for one value per hour. is_leap_year: A boolean to indicate if values are representing a leap year. Default is False. use_disc: Set to True to use the original DISC model as opposed to the newer and more accurate DIRINT model. Default is False. """

        # check input data
        assert len(cloud_cover) == len(relative_humidity) == \
            len(dry_bulb_temperature) == len(wind_speed), \
            'lengths of input climate data must match.'
        assert len(cloud_cover) / timestep == cls.hour_count(is_leap_year), \
            'input climate data must be annual.'
        assert isinstance(timestep, int), 'timestep must be an' \
            ' integer. Got {}'.format(type(timestep))
        if atmospheric_pressure is not None:
            assert len(atmospheric_pressure) == len(cloud_cover), \
                'length pf atmospheric_pressure must match the other input lists.'
        else:
            atmospheric_pressure = [101325] * cls.hour_count(is_leap_year) * timestep

        # initiate sunpath based on location
        sp = Sunpath.from_location(location)
        sp.is_leap_year = is_leap_year

        # calculate parameters needed for zhang-huang irradiance
        date_times = []
        altitudes = []
        doys = []
        dry_bulb_t3_hrs = []
        for count, t_date in enumerate(cls._get_datetimes(timestep, is_leap_year)):
            date_times.append(t_date)
            sun = sp.calculate_sun_from_date_time(t_date)
            altitudes.append(sun.altitude)
            doys.append(sun.datetime.doy)
            dry_bulb_t3_hrs.append(dry_bulb_temperature[count - (3 * timestep)])

        # calculate zhang-huang irradiance
        dir_ir, diff_ir = zhang_huang_solar_split(altitudes, doys, cloud_cover,
                                                  relative_humidity,
                                                  dry_bulb_temperature,
                                                  dry_bulb_t3_hrs, wind_speed,
                                                  atmospheric_pressure, use_disc)

        # assemble the results into DataCollections
        metadata = {'source': location.source, 'country': location.country,
                    'city': location.city}
        direct_norm_rad, diffuse_horiz_rad = \
            cls._get_data_collections(dir_ir, diff_ir, metadata, timestep, is_leap_year)

        return cls(location, direct_norm_rad, diffuse_horiz_rad, timestep, is_leap_year)