Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于阈值的累计月YTD_Python_Pandas_Python 3.5_Threshold - Fatal编程技术网

Python 基于阈值的累计月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

我正在尝试创建一个累积的月度ytd计算,其中基于阈值,“玩家”只对分子和分母计算一次(只要他们有记录的分数),并且可以进入“符合阈值”组,然后即使他们后来的分数不符合阈值,他们仍然留在组中

我不知道该称这个模型为什么,但我想知道关于实现的任何想法,或者关于这种类型的逻辑的想法,这样我就可以自己研究了

以下是输入数据帧的示例:

 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]