运行高效的pandas列多子集的回归分析

2024-09-28 03:14:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我本可以选择一个简短的问题,只关注于这里的核心问题,即列表排列。但是,我之所以把statsmodels和pandas带到这个问题中,是因为可能存在用于逐步回归的特定工具,同时具有存储所需回归输出的灵活性,就像下面我将向您展示的那样,但这样做的效率要高得多。至少我希望如此。在


给定如下数据帧:

代码段1:

# Imports
import pandas as pd
import numpy as np
import itertools
import statsmodels.api as sm

# A datafrane with random numbers
np.random.seed(123)
rows = 12
listVars= ['y','x1', 'x2', 'x3']
rng = pd.date_range('1/1/2017', periods=rows, freq='D')
df_1 = pd.DataFrame(np.random.randint(100,150,size=(rows, len(listVars))), columns=listVars) 
df_1 = df_1.set_index(rng)

print(df_1)

截图1:

enter image description here

我想用自变量x1,x2和x3的多种组合对因变量y进行几次回归分析。换言之,这是一个逐步回归分析,其中y是针对x1进行测试的,然后是x2和x3。然后用x1和x2对y进行测试,依此类推:

  1. ['y',['x1']]
  2. ['y',['x2']]
  3. ['y',['x3']]
  4. ['y',['x1','x2']]
  5. ['y',['x1','x2','x3']]

我的低效方法:

在下面的两个第一个片段中,我能够通过使用列表列表硬编码执行序列来做到这一点。在

以下是ListVar的子集:

代码段2:

^{pr2}$

截图2:

enter image description here

使用listExec,我可以建立一个回归分析的过程,并存储一堆结果(rsquared或整个模型输出模式汇总())在这样的列表中:

代码段3:

allResults = []
for l in listExec:
    x = listVars[1]
    x = sm.add_constant(df_1[l[1]])
    model = sm.OLS(df_1[l[0]], x).fit()    
       result = model.rsquared
    allResults.append(result)

打印(所有结果)

截图3:

enter image description here

这是相当可怕的,但是对于较长的变量列表来说效率非常低。在

我的列表组合尝试:

遵循How to generate all permutations of a list in PythonConvert a list of tuples to a list of lists的建议 我可以设置所有变量的组合,如下所示:

代码段4:

allTuples = list(itertools.permutations(listVars))
allCombos = [list(elem) for elem in allTuples]

截图4:

enter image description here

这很有趣,但并没有给我一个循序渐进的方法。不管怎样,我希望你们中的一些人觉得这很有趣。在

谢谢你的建议!在


Tags: importdf列表as代码段nprandomlist
1条回答
网友
1楼 · 发布于 2024-09-28 03:14:34

基于我得到的帮助here,我已经能够组合一个函数,该函数接受pandas数据帧中的所有列,定义一个因变量,并返回其余变量的所有唯一组合。结果与上面定义的期望结果有点不同,但我认为对于实际应用来说更有意义。我仍然希望其他人能够发布更好的解决方案。在

这里是:

# Imports
import pandas as pd
import numpy as np
import itertools

# A datafrane with random numbers
np.random.seed(123)
rows = 12
listVars= ['y','x1', 'x2', 'x3']
rng = pd.date_range('1/1/2017', periods=rows, freq='D')
df_1 = pd.DataFrame(np.random.randint(100,150,size=(rows, len(listVars))), columns=listVars) 
df_1 = df_1.set_index(rng)

# The function
def StepWise(columns, dependent):
    """ Takes the columns of a pandas dataframe, defines a dependent variable
        and returns all unique combinations of the remaining (independent) variables.

    """

    independent = columns.copy()
    independent.remove(dependent)

    lst1 = []
    lst2 = []
    for i in np.arange(1, len(independent)+1):
        #print(list(itertools.combinations(independent, i)))
        elem = list(itertools.combinations(independent, i))
        lst1.append(elem)
        lst2.extend(elem)

    combosIndependent = [list(elem) for elem in lst2]
    combosAll =  [[dependent, other] for other in combosIndependent]
    return(combosAll)

lExec = StepWise(columns = list(df_1), dependent = 'y')
print(lExec)

enter image description here

如果您将其与上面的snippet 3结合使用,您可以轻松地将多元回归分析的结果存储在pandas数据框中的指定因变量上。在

相关问题 更多 >

    热门问题