我的工作流程中的一个主要工具是from statsmodels.stats.weightstats import ttest_ind
import numpy as np
import pandas as pd
df1 = pd.DataFrame({'x1' : np.random.randn(10), 'x2' : np.random.randn(10), 'x3' : np.random.randn(10)})
df2 = pd.DataFrame({'x1' : np.random.randn(10)+5, 'x2' : np.random.randn(10)+5, 'x3' : np.random.randn(10)+5})
def getp(var):
print(ttest_ind(df1[var], df2[var])[1])
vars = ['x1', 'x2', 'x3']
,例如R:
for i in vars:
getp(i)
9.67944232638e-08
1.82163637251e-08
2.00410346438e-10
这会创建一个很好的p值列。在现实世界中,我会提取一行data.frame,每列都有有用的模型统计数据。目标是迭代具有相同模型类型的许多列,并查看拟合/效果。
在python中,我可以创建一个类似的函数:
def getMoreThanP(var):
out = pd.DataFrame({'mean1' : [np.mean(df1[var])], 'mean2' : [np.mean(df2[var])], 'pvalue' : [ttest_ind(df1[var], df2[var])[1]]})
print(out)
for i in vars:
getMoreThanP(i)
... getMoreThanP(i)
mean1 mean2 pvalue
0 0.24452 4.824327 2.438985e-11
mean1 mean2 pvalue
0 0.187176 4.969862 1.115546e-11
mean1 mean2 pvalue
0 0.035759 5.249378 1.525264e-08
我可以通过以下方式将所有pvalue打印到控制台:
public class SomethingParameters
{
public string A { get; set; }
public int X { get; set; }
public double D { get; set; }
public bool DoIt { get; set; }
}
但是我想把它作为一个对象保存为一个列,其中三行类似于R.这可能吗?
谢谢!
实际功能可能如下所示:
public void DoSmtg(SomethingParameters parameters) { // method logic }
答案 0 :(得分:6)
不是逐个传递变量,而是可以传递所有三个:
ttest_ind(df1[vars], df2[vars])[1]
Out[85]: array([ 4.97835813e-11, 8.30544748e-08, 9.24917262e-07])
返回的对象是一维数组。如果你想要一个数据帧
pd.DataFrame(ttest_ind(df1[vars], df2[vars])[1])
这主要是因为ttest_ind接受类似对象的数组。对于getMoreThanP,您可以使用pd.concat和map:
的组合def getMoreThanP(var):
out = pd.DataFrame({'mean1' : [np.mean(df1[var])], 'mean2' : [np.mean(df2[var])], 'pvalue' : [ttest_ind(df1[var], df2[var])[1]]})
return out
pd.concat(map(getMoreThanP, vars))
# pd.concat(map(getMoreThanP, vars), ignore_index=True) if you want to reset index
Out[134]:
mean1 mean2 pvalue
0 -0.021791 4.964985 4.978358e-11
0 0.087019 4.610332 8.305447e-08
0 -0.084168 4.680124 9.249173e-07
请注意,我更改了getMoreThanP的定义以返回数据帧而不是打印它。