计算比例 Py(Spark) 的置信区间
Calculating Confidence Interval for a Proportion Py(Spark)
我正在使用以下函数计算 pyspark 中的性别比例。
除此之外,我还想计算 python 中的比例的置信区间,例如
所以我应该有 one/two 额外的列 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','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'))
)
我正在使用以下函数计算 pyspark 中的性别比例。
除此之外,我还想计算 python 中的比例的置信区间,例如
所以我应该有 one/two 额外的列 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','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'))
)