【问题标题】:Cumulative Monthly YTD Based on Threshold基于阈值的累计每月 YTD
【发布时间】:2017-03-15 09:25:36
【问题描述】:

我正在尝试创建一个累计每月 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

还有输出:(玩家名字只是用来帮助追踪逻辑)

 Month      Qualified Players         Players
 January    1 (B)                      2 (A, B)
 February   2 (A, B)                   3 (A, B, D)
 March      4 (A, B, C, D)             4 (A, B, C, D)
 April      4 (A, B, C, D)             5 (A, B, C, D, E)

更新: 以上是最简单的模型。在更深层次上,我希望有多个阈值组,类似地,玩家可以向上移动一个阈值组,但永远不能向下移动。示例:

阈值组 = 低 (1-2)、中 (3-4)、高 (5)

输入df(同上):

 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

输出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)

【问题讨论】:

    标签: python pandas python-3.5 threshold


    【解决方案1】:

    怎么样:

    >>> 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!我要调查一下。一旦有数千个数据点,使用球员姓名作为列表肯定会带来潜在的处理速度问题。
    • 如果有多个阈值组而不是一个阈值组,则会增加另一个复杂性。如何将一个人从一个人转移到另一个人?我将用它来更新我的问题。
    • @AVD 列表在那里是因为扩展函数(如 cumsum)不适用于对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多