Python 连接列表中的所有数据帧组合,以计算与另一个数据帧的相关性

Python 连接列表中的所有数据帧组合,以计算与另一个数据帧的相关性,python,pandas,machine-learning,data-science,itertools,Python,Pandas,Machine Learning,Data Science,Itertools,我花了好几个小时试图找到解决我问题的办法,但没有成功。 我希望我能尽可能清楚地描述我的问题: 一般情况: 我的目标是从不同的数据帧中找到用于机器学习的最佳特征组合。 因此,我想计算单个版本中每个特性与我的“目标列”的相关性,以及组合(例如df1+df2与目标列、df2+df3+df4与目标列……) 限制性问题: 数据帧非常大-->每个数据帧5'000'000个观测值 我的电脑有16 GB的内存(我在工作中有很多内存错误) 我的主要问题描述: 我有一个数据帧列表:list\u of_dfs=[df

我花了好几个小时试图找到解决我问题的办法,但没有成功。 我希望我能尽可能清楚地描述我的问题:

一般情况:

我的目标是从不同的数据帧中找到用于机器学习的最佳特征组合。 因此,我想计算单个版本中每个特性与我的“目标列”的相关性,以及组合(例如df1+df2与目标列、df2+df3+df4与目标列……)

限制性问题:

  • 数据帧非常大-->每个数据帧5'000'000个观测值
  • 我的电脑有16 GB的内存(我在工作中有很多内存错误)
  • 我的主要问题描述:

    我有一个数据帧列表:
    list\u of_dfs=[df1,df2,df3,df4,df5]

    每个数据帧都用pandas.get_dummies表示(因为有许多分类功能)。
    我可以对它们进行pd.concat,因为它们已经代表了相同观测的信息

    为了实现以下目标,我希望有所有的\u-of-dfs列表的组合:

  • 将它们连接到新的数据帧
  • 计算此数据帧与我的目标列的相关性(不包括在来自\u dfs的列表\u的dfs中)
  • 我目前的做法是:

    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,我得到了一个错误,我无法处理它们

    有人对我的问题或方法有想法或解决方案吗


    非常感谢!:)

    欢迎来到SO!您愿意将计算转移到云服务吗?在您的机器上,很长的一段路是将每个数据帧(df1.col1+df2.col1,df1.col1+df2.col2…)的列组合起来,并在运行时将相关性存储在矩阵中。或者,您可以在AWS上启动一个大型EC2实例,只需计算所有DFs并计算一个相关矩阵。@谢谢您的回答:)我不想在这一步中使用AWS或netcup实例,因为当我执行功能选择步骤时,我可以将压缩稀疏矩阵用于不需要太多计算能力或内存的回归/分类模型:)您有其他解决方案吗?我可以如何处理这种情况:)如果你必须生活在内存限制中,你可以做我上面提到的事情:获取所有列的完整组合的相关性,一次两列,并将它们存储在一个矩阵中。每次计算应该不难,但取决于列数,可能需要一段时间(将结果写入磁盘以保存进度)。或者,你可以研究一些事情,比如你是否可以一次计算所有的DF,然后只得到corr(DF)结果。我得到了一个有用的答案,解决了我的问题: