<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def download_data(url, signature, data_home=None, replace=False, extract=True):
 """ Downloads the zipped data set specified at the given URL, saving it to the data directory specified by ``get_data_home``. This function verifies the download with the given signature and extracts the archive. Parameters url : str The URL of the dataset on the Internet to GET signature : str The SHA 256 hash of the dataset archive being downloaded to verify that the dataset has been correctly downloaded data_home : str, optional The path on disk where data is stored. If not passed in, it is looked up from YELLOWBRICK_DATA or the default returned by ``get_data_home``. replace : bool, default: False If the data archive already exists, replace the dataset. If this is False and the dataset exists, an exception is raised. extract : bool, default: True Extract the archive file after downloading it """

    data_home = get_data_home(data_home)

    # Get the name of the file from the URL
    basename = os.path.basename(url)
    name, _ = os.path.splitext(basename)

    # Get the archive and data directory paths
    archive = os.path.join(data_home, basename)
    datadir = os.path.join(data_home, name)

    # If the archive exists cleanup or raise override exception
    if os.path.exists(archive):
        if not replace:
            raise DatasetsError((
                "dataset already exists at {}, set replace=False to overwrite"
            ).format(archive))

        cleanup_dataset(name, data_home=data_home)

    # Create the output directory if it does not exist
    if not os.path.exists(datadir):
        os.mkdir(datadir)

    # Fetch the response in a streaming fashion and write it to disk.
    response = urlopen(url)

    with open(archive, 'wb') as f:
        while True:
            chunk = response.read(CHUNK)
            if not chunk:
                break
            f.write(chunk)

    # Compare the signature of the archive to the expected one
    if sha256sum(archive) != signature:
        raise ValueError(
            "Download signature does not match hardcoded signature!"
        )

    # If extract, extract the zipfile.
    if extract:
        zf = zipfile.ZipFile(archive)
        zf.extractall(path=data_home)