基于PySpark按多条件计算学生培训期间平均评分
计算培训周期内学生平均评分的解决方案
首先我把你提供的原始数据整理成结构化表格,方便后续分析处理:
| ID | Year | rate | start-date | end-date |
|---|---|---|---|---|
| 1 | 2015 | 2 | 2015 | 2017 |
| 8 | 2012 | 3 | 2010 | 2012 |
| 7 | 2007 | 12 | Null | 2008 |
| 1 | 2016 | 4 | 2015 | 2017 |
| 8 | 2010 | 7 | 2010 | 2012 |
| 9 | 2002 | 10 | 2002 | null |
| 1 | 2015 | 2 | 2015 | 2017 |
| 1 | 2017 | 8 | 2015 | 2017 |
核心规则回顾
我们只处理start-date和end-date均不为空的记录,平均评分的计算逻辑是:average-rate = 平均值(起始日期对应年份的评分 + 起止日期之间所有年份的评分)
方法1:用SQL实现计算
如果数据存储在数据库中,用以下SQL语句就能快速计算每个符合条件的学生ID的平均评分:
SELECT ID, `start-date`, `end-date`, AVG(rate) AS `average-rate` FROM your_table_name WHERE `start-date` IS NOT NULL AND `end-date` IS NOT NULL AND Year BETWEEN `start-date` AND `end-date` GROUP BY ID, `start-date`, `end-date`;
结果说明
- 对于ID=1:起止周期是2015-2017,符合条件的评分是2、2、4、8,平均值为
(2+2+4+8)/4=4 - 对于ID=8:起止周期是2010-2012,符合条件的评分是7、3,平均值为
(7+3)/2=5
方法2:用Excel实现计算
如果数据在Excel里,可以按以下步骤操作:
筛选有效数据:
- 选中数据区域,点击「数据」→「筛选」
- 在
start-date和end-date列的筛选器中,取消勾选「空值」/「Null」
计算平均评分:
- 添加辅助列
是否在周期内,输入公式:=AND(B2>=D2, B2<=E2)(假设Year在B列,start-date在D列,end-date在E列) - 筛选出
是否在周期内为TRUE的记录 - 用
AVERAGEIFS函数计算单个ID的平均评分,比如计算ID=1的平均值:=AVERAGEIFS(C:C, A:A, 1, D:D, "<>", E:E, "<>", B:B, ">="&D2, B:B, "<="&E2)
- 添加辅助列
内容的提问来源于stack exchange,提问作者Lizou
相关产品推荐
相关产品推荐

