微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

计算比例 Py(Spark) 的置信区间

如何解决计算比例 Py(Spark) 的置信区间

我正在使用以下函数计算 pyspark 中的性别比例。

除此之外,我还想在 python 中计算一个比例的置信区间,例如 Calculating Confidence Interval for a Proportion in One Sample

所以我应该有一个/两个额外的列,带有lower_ci和upper_ci

import pyspark.sql.functions as F
def gender_prop(df,grp):
    test_df = df.filter( 
        F.col('GENDER').isin(['0','F'])
        ).groupBy(grp).agg(
            F.mean(
                F.when(F.col('GENDER') == F.lit('M'),1.0).otherwise(0.0)
            ).alias('gender_score'),F.count(F.lit(1)).alias('total')
        ).filter('no_of_streams > 100')
    return test_df

 df = gender_prop(df,'title')
 display(df)
 title   gender_prop            total
1 ABC    0.2749954192878519     491190
2 CART   0.5417543859649123     320625
3 NUMB   0.3385603833169988     275490
4 PRO    0.24459397661200757    229605
5 SHOW   0.2673127254721652     212055

抱歉我含糊其辞,所以基本上我想在 pyspark 中做一些事情作为这个例子

import pandas as pd
import numpy as np
import math

df=pd.DataFrame({'Class': ['A1','A1','A2','A3','A3'],'Force': [50,150,100,120,140,160] },columns=['Class','Force'])
print(df)
print('-'*30)

stats = df.groupby(['Class'])['Force'].agg(['mean','count','std'])
print(stats)
print('-'*30)

ci95_hi = []
ci95_lo = []

for i in stats.index:
    m,c,s = stats.loc[i]
    ci95_hi.append(m + 1.96*s/math.sqrt(c))
    ci95_lo.append(m - 1.96*s/math.sqrt(c))

stats['ci95_hi'] = ci95_hi
stats['ci95_lo'] = ci95_lo
print(stats)

非常感谢您的帮助 提前致谢

解决方法

你的第一个代码片段有很多不清楚的过滤器,但这里的想法是:

import pyspark.sql.functions as F
def gender_prop(df,grp):
    col = F.when(F.col('GENDER') == F.lit('M'),1.0).otherwise(0.0)

    return df.groupBy(grp).agg(
        F.mean(col).alias('avg'),F.count(F.lit(1)).alias('total'),F.stddev(col).alias('std')
    ).withColumn(
        'ci95_hi',F.col('avg') + 1.96 * F.col('std') / F.sqrt(F.col('total'))
    ).withColumn(
        'ci95_lo',F.col('avg') - 1.96 * F.col('std') / F.sqrt(F.col('total'))
    )

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。