def METHOD_NAME(df, column_name):
    """
    Check improvement in performance in a benchmark column and create a new column with the improvement status.
    Args:
        df (DataFrame): The input DataFrame.
        column_name (str): The name of the column to check for improvement.
    Returns:
        DataFrame: The updated DataFrame with the new column indicating the improvement status.
    """
    # Create a new column with the same values as the input column
    df[column_name + "_improved"] = "Not applicable"
    # Initialize previous value and days_since with the first row values
    # Check if 'training_data' column exists in the DataFrame
    if "training_data" in df.columns:
        first_non_nan_index = df[column_name].first_valid_index()
        previous_value = df[column_name].iloc[first_non_nan_index]
        previous_days_since = df["days_since"].iloc[first_non_nan_index]
        for i, value in enumerate(df[column_name].iloc[first_non_nan_index + 1 :], start=first_non_nan_index + 1):
            days_since = df["days_since"].iloc[i]
            with_without = df["training_data"].iloc[i]
            # Check if the value is NaN and assign the corresponding improvement status
            if pd.isnull(value):
                df.at[i, column_name + "_improved"] = "Not applicable"
            # Check if the value is greater than the previous value and meets the condition of days_since
            elif pd.notnull(previous_value) and value > previous_value and days_since >= previous_days_since:
                if with_without == "With extra data":
                    df.at[i, column_name + "_improved"] = "State of the art (with extra training data)"
                else:
                    df.at[i, column_name + "_improved"] = "State of the art (without extra training data)"
                # Update the previous value and days_since
                previous_value = value
                previous_days_since = days_since
            else:
                if with_without == "With extra data":
                    df.at[first_non_nan_index, column_name + "_improved"] = "Others (with extra data)"
                else:
                    df.at[first_non_nan_index, column_name + "_improved"] = "Others (without extra data)"
        if df["training_data"].iloc[0] == "Without extra data":
            df.at[0, column_name + "_improved"] = "State of the art (without extra training data)"
        else:
            df.at[0, column_name + "_improved"] = "State of the art (with extra training data)"
    else:
        first_non_nan_index = df[column_name].first_valid_index()
        previous_value = df[column_name].iloc[first_non_nan_index]
        previous_days_since = df["days_since"].iloc[first_non_nan_index]
        # Iterate over the remaining values in the column
        for i, value in enumerate(df[column_name].iloc[first_non_nan_index + 1 :], start=first_non_nan_index + 1):
            days_since = df["days_since"].iloc[i]
            # Check if the value is NaN and assign the corresponding improvement status
            if pd.isnull(value):
                df.at[i, column_name + "_improved"] = "Not applicable"
            elif pd.notnull(previous_value) and value > previous_value and days_since >= previous_days_since:
                df.at[i, column_name + "_improved"] = "State of the art"
                previous_value = value
                previous_days_since = days_since
            else:
                df.at[i, column_name + "_improved"] = "Others"
        # Handle the case of the first value being NaN or set it as the initial improvement status
        df.at[first_non_nan_index, column_name + "_improved"] = "State of the art"
        df[column_name + "_improved"] = df[column_name + "_improved"].astype(str)
    return df