Объединить все комбинации DataFrames из списка, чтобы вычислить корреляцию с другим DataFrame - PullRequest
0 голосов
/ 06 февраля 2020

Я пытался и искал много часов, чтобы найти решение для моей проблемы без успеха. Я надеюсь, что смогу описать свою проблему как можно более четко:

Общая ситуация:

Моя цель - найти наилучшие комбинации функций из разных фреймов данных для машинного обучения. Поэтому я хочу рассчитать корреляцию каждой функции в одной версии с моим «target_column», а также с их комбинациями (например, df1 + df2 против target_column, df2 + df3 + df4 против target_column, ...).

Ограничительные проблемы:

  1. Фреймы данных очень велики -> 5 000 000 наблюдений на фрейм данных
  2. Мой компьютер имеет 16 ГБ памяти (у меня много ошибки памяти во время моей работы)

Описание моей основной проблемы:

У меня есть список Dataframes: list_of_dfs = [df1, df2, df3, df4, df5]
Каждый DataFrame представлен в pandas .get_dummies представлении (потому что много категорических признаков).
Я могу pd.concat их, потому что они уже представляют информацию для тех же самых наблюдений.

Я хочу иметь все комбинации list_of_dfs для следующая цель:

  1. pd.concat их в новый DataFrame
  2. Рассчитать корреляцию этого DataFrame с моим target_column (не включается в dfs из list_of_dfs)
* 1 033 * Мой текущий подход:
def get_df_name(df):
    name =[x for x in globals() if globals()[x] is df][0]
    return name


def corr(df1, df2):
    n = len(df1)
    v1, v2 = df1.values, df2.values
    sums = np.multiply.outer(v2.sum(0), v1.sum(0))
    stds = np.multiply.outer(v2.std(0), v1.std(0))
    print(get_df_name(df1))
    return pd.DataFrame((v2.T.dot(v1) - sums / n) / stds / n, df2.columns, df1.columns)


from itertools import combinations 
for i in range(6):
  list_of_dummies_comb = combinations(list_of_dfs, i)
  # test = pd.concat(list_of_dummies_comb, axis=1)
  # print(corr(test, target_column).median())

В последних двух строках кода у меня возникла проблема, связанная с обработкой class.tuple, и я получил ошибку, что не могу их объединить.

У кого-нибудь есть идея или решение для моей проблемы или мой подход?

Спасибо большое! :)

...