首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫:基于群比函数的月平均数据差异t检验及p值分析

熊猫:基于群比函数的月平均数据差异t检验及p值分析
EN

Stack Overflow用户
提问于 2016-04-14 21:28:03
回答 2查看 1.4K关注 0票数 1

这是我第一个发帖的问题,所以如果看起来不太好,请原谅。

我有一个源数据文件,我使用熊猫群聚合将其转换成以下数据

代码语言:javascript
复制
pd.read_csv('R:/Python ETL/AGG7.csv', sep=',')

      Treatment     Month   stdev    n    avg
0      AAAA       1/1/2016   1.92   309   7.57
1      AAAA       2/1/2016   1.89    79   7.46
2      AAAA       3/1/2016   2.25   158   7.20
3      AAAA       4/1/2016   2.23    22   7.68
4      BBBB       1/1/2016   2.04   175   7.10
5      BBBB       2/1/2016   1.96    33   7.09
6      BBBB       3/1/2016   2.02   110   7.32
7      BBBB       4/1/2016   1.73    25   7.92
8      CCCC       1/1/2016   2.42   111   7.40
9      CCCC       2/1/2016   1.45    22   7.73
10     CCCC       3/1/2016   2.44    21   6.95
11     CCCC       4/1/2016   2.84    92   6.92

我需要的是两个额外的列与月之间的差异(MoM差异)和p值的T-检验这些差异。

代码语言:javascript
复制
MoM diff    pValue
-0.11   0.35
-0.26   0.62
 0.48   0.65

-0.01   0.02
 0.23   0.44
 0.6    0.83

 0.33   0.46
-0.78   0.79
-0.03   0.04

问题是,我不能通过使用原始数据集中的scipy.stats ttest_ind函数和显示的聚集数据集中的ttest_ind_from_stats函数来动态地获取它们。我尝试了许多不同的方法,但都没有成功。有人能帮忙吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-15 00:31:35

可以将df.shift与groupby一起使用,以获得移位的值:

代码语言:javascript
复制
df[["avg_2", "n_2", "stdev_2"]] = df.groupby("Treatment")["avg", "n", "stdev"].shift()

df
Out[7]: 
   Treatment      Month  stdev    n   avg  avg_2    n_2  stdev_2
0       AAAA 2016-01-01   1.92  309  7.57    NaN    NaN      NaN
1       AAAA 2016-01-02   1.89   79  7.46   7.57  309.0     1.92
2       AAAA 2016-01-03   2.25  158  7.20   7.46   79.0     1.89
3       AAAA 2016-01-04   2.23   22  7.68   7.20  158.0     2.25
4       BBBB 2016-01-01   2.04  175  7.10    NaN    NaN      NaN
5       BBBB 2016-01-02   1.96   33  7.09   7.10  175.0     2.04
6       BBBB 2016-01-03   2.02  110  7.32   7.09   33.0     1.96
7       BBBB 2016-01-04   1.73   25  7.92   7.32  110.0     2.02
8       CCCC 2016-01-01   2.42  111  7.40    NaN    NaN      NaN
9       CCCC 2016-01-02   1.45   22  7.73   7.40  111.0     2.42
10      CCCC 2016-01-03   2.44   21  6.95   7.73   22.0     1.45
11      CCCC 2016-01-04   2.84   92  6.92   6.95   21.0     2.44

您可以使用NaN筛选出pd.notnull值:

代码语言:javascript
复制
df2 = df[pd.notnull(df.avg_2)].copy()

你可以通过以下方法得到测试结果:

代码语言:javascript
复制
import scipy.stats as ss
res = ss.ttest_ind_from_stats(df2.avg, df2.stdev, df2.n, df2.avg_2, df2.stdev_2, df2.n_2, equal_var=False)

如果您想要这个数据中的平均值和p值:

代码语言:javascript
复制
df2["dif_avg"] = df2.avg - df2.avg_2
df2["p_value"] = res.pvalue


Out[22]: 
        Month  stdev    n   avg  avg_2    n_2  stdev_2  dif_avg   p_value
1  2016-01-02   1.89   79  7.46   7.57  309.0     1.92    -0.11  0.646226
2  2016-01-03   2.25  158  7.20   7.46   79.0     1.89    -0.26  0.350814
3  2016-01-04   2.23   22  7.68   7.20  158.0     2.25     0.48  0.353023
5  2016-01-02   1.96   33  7.09   7.10  175.0     2.04    -0.01  0.978808
6  2016-01-03   2.02  110  7.32   7.09   33.0     1.96     0.23  0.559625
7  2016-01-04   1.73   25  7.92   7.32  110.0     2.02     0.60  0.137527
9  2016-01-02   1.45   22  7.73   7.40  111.0     2.42     0.33  0.395806
10 2016-01-03   2.44   21  6.95   7.73   22.0     1.45    -0.78  0.214270
11 2016-01-04   2.84   92  6.92   6.95   21.0     2.44    -0.03  0.961019

逐行:

代码语言:javascript
复制
import csv
import scipy.stats as ss
results = []
treatment1 = ""
with open('R:/Python ETL/AGG7.csv') as f:
    reader = csv.reader(f)
    next(reader, None)
    for line in reader:
        treatment2, stdev2, n2, avg2 = line[0], float(line[2]), int(line[3]), float(line[4])
        if treatment2 == treatment1:
            ttest_res = ss.ttest_ind_from_stats(avg1, stdev1, n1, avg2, stdev2, n2, equal_var=False)
            results.append((avg2-avg1, ttest_res.pvalue))
        treatment1, stdev1, n1, avg1 = treatment2, stdev2, n2, avg2
票数 0
EN

Stack Overflow用户

发布于 2016-04-14 23:32:16

这就是你需要的吗?

代码语言:javascript
复制
In [154]: df
Out[154]:
   Treatment     Month  stdev    n   avg
0       AAAA  1/1/2016   1.92  309  7.57
1       AAAA  2/1/2016   1.89   79  7.46
2       AAAA  3/1/2016   2.25  158  7.20
3       AAAA  4/1/2016   2.23   22  7.68
4       BBBB  1/1/2016   2.04  175  7.10
5       BBBB  2/1/2016   1.96   33  7.09
6       BBBB  3/1/2016   2.02  110  7.32
7       BBBB  4/1/2016   1.73   25  7.92
8       CCCC  1/1/2016   2.42  111  7.40
9       CCCC  2/1/2016   1.45   22  7.73
10      CCCC  3/1/2016   2.44   21  6.95
11      CCCC  4/1/2016   2.84   92  6.92

In [155]: df.stdev.diff()
Out[155]:
0      NaN
1    -0.03
2     0.36
3    -0.02
4    -0.19
5    -0.08
6     0.06
7    -0.29
8     0.69
9    -0.97
10    0.99
11    0.40
Name: stdev, dtype: float64

让我们把它移到第一排:

代码语言:javascript
复制
In [156]: df.stdev.diff().shift(-1)
Out[156]:
0    -0.03
1     0.36
2    -0.02
3    -0.19
4    -0.08
5     0.06
6    -0.29
7     0.69
8    -0.97
9     0.99
10    0.40
11     NaN
Name: stdev, dtype: float64
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36634330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档