Python 基于阈值的累计月YTD
我正在尝试创建一个累积的月度ytd计算,其中基于阈值,“玩家”只对分子和分母计算一次(只要他们有记录的分数),并且可以进入“符合阈值”组,然后即使他们后来的分数不符合阈值,他们仍然留在组中 我不知道该称这个模型为什么,但我想知道关于实现的任何想法,或者关于这种类型的逻辑的想法,这样我就可以自己研究了 以下是输入数据帧的示例:Python 基于阈值的累计月YTD,python,pandas,python-3.5,threshold,Python,Pandas,Python 3.5,Threshold,我正在尝试创建一个累积的月度ytd计算,其中基于阈值,“玩家”只对分子和分母计算一次(只要他们有记录的分数),并且可以进入“符合阈值”组,然后即使他们后来的分数不符合阈值,他们仍然留在组中 我不知道该称这个模型为什么,但我想知道关于实现的任何想法,或者关于这种类型的逻辑的想法,这样我就可以自己研究了 以下是输入数据帧的示例: Player Month Score Qualified? A January 3 N A Febru
Player Month Score Qualified?
A January 3 N
A February 4 Y
A March 5 Y
A April 5 Y
B January 4 Y
B February 3 N
C March 5 Y
D February 3 N
D March 4 Y
D April 3 N
E April 1 N
输出:(播放器名称仅用于帮助跟踪逻辑)
更新:
以上是最简单的模型。在更深层次上,我希望有多个阈值组,类似地,玩家可以向上移动阈值组,但永远不能向下移动。例如:
阈值组=低(1-2)、中(3-4)、高(5)
输入df(同上):
输出df:
Month Threshold Group Player Count
1 Low 0
1 Medium 2 (A, B)
1 High 0
2 Low 0
2 Medium 3 (A, B, D)
2 High 0
3 Low 0
3 Medium 2 (B, D)
3 High 2 (A, C)
4 Low 1 (E)
4 Medium 2 (B, D)
4 High 2 (A, C)
那么:
>>> df = pd.DataFrame(data={'player':list('AAAABBCDDDE'), 'month':[1,2,3,4,1,2,3,2,3,4,4], 'score':[3,4,5,5,4,3,5,3,4,3,1]})
>>> df
month player score
0 1 A 3
1 2 A 4
2 3 A 5
3 4 A 5
4 1 B 4
5 2 B 3
6 3 C 5
7 2 D 3
8 3 D 4
9 4 D 3
10 4 E 1
>>> res = df.groupby('month')
.apply(func=lambda x: ''.join(x.player.values))
.rename('active')
.to_frame()
>>> res['qualified'] = df.groupby('month')
.apply(func=lambda x: ''.join(x[x.score>=4].player.values))
>>> res
active qualified
month
1 AB B
2 ABD A
3 ACD ACD
4 ADE A
>>> res.cumsum().applymap(lambda x: np.unique(list(x)))
active qualified
month
1 [A, B] [B]
2 [A, B, D] [A, B]
3 [A, B, C, D] [A, B, C, D]
4 [A, B, C, D, E] [A, B, C, D]
老实说,我不喜欢这个解决方案,但到目前为止还没有找到更好的解决方案:(谢谢@kekert!我将对此进行研究。一旦存在数千个数据点,使用玩家姓名作为列表肯定会带来潜在的处理速度问题。如果存在多个阈值组而不是一个阈值组,则会增加另一个复杂性。如何将一个人从一个阈值组转移到另一个阈值组?我将更新我的问题n.@AVD列表之所以存在,是因为扩展函数(如cumsum)不能处理对象。
Month Threshold Group Player Count
1 Low 0
1 Medium 2 (A, B)
1 High 0
2 Low 0
2 Medium 3 (A, B, D)
2 High 0
3 Low 0
3 Medium 2 (B, D)
3 High 2 (A, C)
4 Low 1 (E)
4 Medium 2 (B, D)
4 High 2 (A, C)
>>> df = pd.DataFrame(data={'player':list('AAAABBCDDDE'), 'month':[1,2,3,4,1,2,3,2,3,4,4], 'score':[3,4,5,5,4,3,5,3,4,3,1]})
>>> df
month player score
0 1 A 3
1 2 A 4
2 3 A 5
3 4 A 5
4 1 B 4
5 2 B 3
6 3 C 5
7 2 D 3
8 3 D 4
9 4 D 3
10 4 E 1
>>> res = df.groupby('month')
.apply(func=lambda x: ''.join(x.player.values))
.rename('active')
.to_frame()
>>> res['qualified'] = df.groupby('month')
.apply(func=lambda x: ''.join(x[x.score>=4].player.values))
>>> res
active qualified
month
1 AB B
2 ABD A
3 ACD ACD
4 ADE A
>>> res.cumsum().applymap(lambda x: np.unique(list(x)))
active qualified
month
1 [A, B] [B]
2 [A, B, D] [A, B]
3 [A, B, C, D] [A, B, C, D]
4 [A, B, C, D, E] [A, B, C, D]