Привет, я делаю ML для своей бакалаврской диссертации с твитами. Чтобы нормализовать данные в моем df, я реализовал функцию

def avg_value_over_time(df, day_column: str, target_columns: List[Tuple[str, str]], day_span: int = 90):
    """
    Averages a certain value over time
    :param df: The dataframe
    :param day_column: The column with the day (datetime)
    :param target_columns: The columns that should be averaged over time (list of tuples of shape (column_name, new_avg_column_name))
    :param day_span: The number of days over which should be averaged
    :return: A new created column with the averaged values
    """

    def apply_func(x):
        day = x[day_column]
        fr, to = day - timedelta(days=day_span), day - timedelta(days=1)
        d = select_by_days(df, day_column, fr, to)

        dct = {n2: d[n1].mean() for n1, n2 in target_columns}

        return pd.Series(dct)

    return df.apply(apply_func, axis=1)

Функция неплохо работает со следующим кодом

numMSA_agg = avg_value_over_time(gt_df, 'Date',[('NumMentionsAvg','NumMentionsAvgNorm'), ('NumSourcesAvg', 'NumSourcesAvgNorm'),('NumArticlesAvg', 'NumArticlesAvg')])

Но теперь я ищу способ перебрать свои столбцы и ввести их в свою функцию. Из-за подсчета слов в библиотеке scikit у меня более 3000 столбцов, и я не хочу вручную добавлять их все в свою функцию и нормализовать их. Поэтому я ищу способ получить все столбцы в функции, а не просто создать новый столбец для каждого повторяемого столбца со старым именем столбца + строкой «Норма». Спасибо заранее

1
Paul Bruder 11 Фев 2021 в 18:36

1 ответ

Лучший ответ

Вот минималистичный пример, демонстрирующий решение вашего вопроса.

Если ваш фрейм данных имеет четыре столбца, из которых вы хотите нормализовать три столбца с помощью вашей функции, то следующий фрагмент кода поможет без необходимости вручную указывать аргумент target_columns:

cols = df.columns # Which is suppose ['Date','NumMentionsAvg', 'NumSourcesAvg', 'NumArticlesAvg']

cols = cols[1:] # Which in this case selects the columns ['NumMentionsAvg', 'NumSourcesAvg', 'NumArticlesAvg']

target_columns_argument = []

for i in cols:
    target_columns_argument.append((i,i+'Norm'))

В этом примере target_cols_argument будет выглядеть так:

[('NumMentionsAvg', 'NumMentionsAvgNorm'),
 ('NumSourcesAvg', 'NumSourcesAvgNorm'),
 ('NumArticlesAvg', 'NumArticlesAvgNorm')]

Итак, вы можете вызвать свою функцию следующим образом:

numMSA_agg = avg_value_over_time(gt_df, 'Date', target_columns = target_columns_argument)

Итак, если у вас 3000 столбцов, он все равно будет работать, если вы выберете соответствующие индексы столбцов, которые хотите нормализовать, во второй строке кода.

2
Ishwar Venugopal 11 Фев 2021 в 15:58