def METHOD_NAME(input_stream):
    """
    Accepts a stream of CSV and yields practice stastics as tuples of the form:
        statistic_name, practice_code, date, statistic_value
    """
    reader = csv.reader(input_stream)
    headers = next(reader)
    try:
        date_col = headers.index("month")
        practice_col = headers.index("practice")
        star_pu_col = headers.index("star_pu")
    except ValueError as e:
        raise MissingHeaderError(str(e))
    other_headers = [
        (i, header)
        for (i, header) in enumerate(headers)
        if i not in (date_col, practice_col, star_pu_col) and header != "pct_id"
    ]
    for row in reader:
        # We only need the YYYY-MM-DD part of the date
        date = row[date_col][:10]
        # These sometimes have trailing spaces in the CSV
        practice = row[practice_col].strip()
        for i, statistic_name in other_headers:
            value_str = row[i]
            value = float(value_str) if "." in value_str else int(value_str)
            yield statistic_name, practice, date, value
        star_pu = json.loads(row[star_pu_col])
        for star_pu_name, value in star_pu.items():
            yield "star_pu." + star_pu_name, practice, date, value