【问题标题】:get the average time that an object stayed in a certain state in Pandas获取对象在 Pandas 中处于某个状态的平均时间
【发布时间】:2021-12-29 16:33:36
【问题描述】:

我有一个包含一些销售机会的大型 DF。此 opps 在其生命周期中多次更改阶段,我们可以看到这些更改是什么以及它们是何时进行的。 可能的阶段是:

Closed Won        
Closed No Deal    
Propose           
Negotiate          
Qualify            
Closed Lost        
Invalid            
Identify           
Implemented        
Close Lost            
Close Won                         
Close No Deal

我也知道 opp 更改之前的 OldValue。我需要做的是有一个单独的 DF,我可以在其中获得机会在每个阶段停留多长时间的中值。 我研究了网络和 SO,但找不到符合我标准的解决方案。

这是一些示例数据:

reatedDate                    OpportunityId     OldValue    NewValue
2020-05-05T12:04:32.000Z    0060N00000TbLneQAF  Propose     Qualify
2020-07-06T08:44:08.000Z    0060N00000TbLneQAF  Qualify     Identify
2020-08-05T08:59:45.000Z    0060N00000TbLneQAF  Identify    Qualify
2020-08-05T12:02:59.000Z    0060N00000TbLneQAF  Qualify     Propose
2020-09-22T06:47:16.000Z    0060N00000TbLneQAF  Propose     Qualify
2020-10-08T15:33:29.000Z    0060N00000TbLneQAF  Qualify     Identify
2020-10-08T15:40:21.000Z    0060N00000TbLneQAF  Identify    Closed No Deal
2021-07-29T07:57:28.000Z    0060N00000TbLohQAF  Identify    Closed No Deal
2021-10-17T03:07:24.000Z    0060N00000TbLtwQAF  Qualify     Closed No Deal
2021-07-27T13:57:34.000Z    0060N00000TbMhkQAF  Identify    Closed No Deal
2020-04-22T13:35:30.000Z    0060N00000TbMkjQAF  Negotiate   Closed Lost
2020-09-25T09:37:32.000Z    0060N00000TbN8qQAF  Qualify     Propose
2020-09-25T09:37:41.000Z    0060N00000TbN8qQAF  Propose     Negotiate
2021-09-06T14:31:05.000Z    0060N00000TbN8qQAF  Negotiate   Propose
2021-11-03T11:09:56.000Z    0060N00000TbNF8QAN  Identify    Qualify
2020-04-29T15:43:58.000Z    0060N00000TbNFSQA3  Identify    Invalid
2021-01-07T09:35:56.000Z    0060N00000TbNUDQA3  Identify    Closed No Deal
2020-12-03T08:53:12.000Z    0060N00000TbNUSQA3  Qualify     Identify
2021-09-08T09:41:54.000Z    0060N00000TbNUSQA3  Identify    Closed Lost
2021-04-14T07:31:49.000Z    0060N00000TbNg4QAF  Identify    Closed No Deal
2020-04-27T12:19:51.000Z    0060N00000TbNwCQAV  Qualify     Identify
2020-05-04T11:15:00.000Z    0060N00000TbNxPQAV  Identify    Closed No Deal
2021-05-24T03:13:10.000Z    0060N00000TbNywQAF  Qualify     Closed No Deal
2021-05-28T14:51:32.000Z    0060N00000TbO3SQAV  Identify    Invalid
2021-07-27T13:25:50.000Z    0060N00000TbOBlQAN  Identify    Closed No Deal
2021-07-27T13:25:50.000Z    0060N00000TbOCeQAN  Identify    Closed No Deal
2021-07-27T13:25:50.000Z    0060N00000TbOELQA3  Identify    Closed No Deal
2020-04-28T15:12:53.000Z    0060N00000TbOIrQAN  Qualify     Negotiate
2020-05-18T14:11:18.000Z    0060N00000TbOIrQAN  Negotiate   Closed Won
2021-07-27T13:22:09.000Z    0060N00000TbOJzQAN  Identify    Closed No Deal
2021-07-27T13:22:09.000Z    0060N00000TbOLbQAN  Identify    Closed No Deal
2020-08-13T05:04:36.000Z    0060N00000TbOOzQAN  Propose     Identify
2020-09-06T15:36:36.000Z    0060N00000TbOOzQAN  Identify    Invalid
2021-05-27T14:22:10.000Z    0060N00000TbOWKQA3  Qualify     Identify
2021-05-27T14:22:27.000Z    0060N00000TbOWKQA3  Identify    Closed Lost
2020-04-27T12:25:52.000Z    0060N00000TbOX3QAN  Qualify     Identify
2021-01-08T15:27:33.000Z    0060N00000TbOX3QAN  Identify    Qualify
2020-04-13T10:53:57.000Z    0060N00000TbOY6QAN  Qualify     Identify
2020-12-03T10:38:35.000Z    0060N00000TbOY6QAN  Identify    Closed Lost
2020-04-13T10:54:57.000Z    0060N00000TbOYaQAN  Qualify     Identify
2020-12-01T10:50:41.000Z    0060N00000TbOYaQAN  Identify    Closed No Deal
2021-07-27T13:57:34.000Z    0060N00000TbOb5QAF  Identify    Closed No Deal
2021-07-27T13:57:34.000Z    0060N00000TbOeYQAV  Identify    Closed No Deal
2020-05-29T12:28:44.000Z    0060N00000TbOgyQAF  Identify    Qualify
2020-12-18T07:34:18.000Z    0060N00000TbOgyQAF  Qualify     Identify
2020-12-18T07:34:43.000Z    0060N00000TbOgyQAF  Identify    Invalid
2021-07-27T13:22:09.000Z    0060N00000TbOhSQAV  Identify    Closed No Deal
2020-04-15T11:30:09.000Z    0060N00000TbOk7QAF  Identify    Invalid
2020-08-26T03:16:46.000Z    0060N00000TbOnVQAV  Qualify     Closed No Deal
2020-04-03T13:08:23.000Z    0060N00000TbOy4QAF  Identify    Closed Lost      

到目前为止,我所做的是尝试使用 group_by 函数,然后尝试获取中位数,但我被卡住了,因为我需要查看 opp 更改的日期并将其与所花费的时间进行比较获得新的价值。 我将查看以下结果:

Stage            Average Time
Closed Won        x days
Closed No Deal    x days
Propose           x days
Negotiate         x days 
Qualify           x days 
Closed Lost       x days 
Invalid           x days 
Identify          x days 
Implemented       x days 
Close Lost        x days 
Close Won         x days                
Close No Deal     x days

希望这是有道理的。顺便说一句,我是个菜鸟,所以谢谢你的帮助!

【问题讨论】:

  • 在您的数据框中,您只能对以下状态有答案:“提议”、“资格”、“识别”和“协商”,因为从这个状态到另一个状态的转换(新值)。例如,为“Closed Lost”设置一个值是否有意义?
  • 嗨@Corralien,是的,这是有道理的,因为 opp 可以从一个状态转到另一个状态,然后返回原始状态,然后转换到另一个状态。欢迎来到销售数据!......是精神! :)
  • 好的。我明白 :) 你可以手动计算 OppId '0060N00000TbLneQAF' 的输出(前 7 行)。这里只有 3 个状态:“Propose”、“Qualify”和“Identify”。我是对的?

标签: python python-3.x pandas dataframe


【解决方案1】:

我认为一个可能的解决方案是首先按OpportunityIdreatedDate 对数据帧进行排序:

sorted_df = df.sort_values(by=['OpportunityId','reatedDate']) 

然后你可以得到逐行的差异:

sorted_df['time_diff'] = sorted_df.reatedDate.diff()

您还需要确定 ID 中存在转换的情况。由于这些需要从统计中排除:

sorted_df['id_diff'] = sorted_df.OpportunityId.diff()
filtered_df=sorted_df[sorted_df.id_diff==0]

那么你应该能够做你的统计:

filtered_df.groupby(['OldValue'])[['time_diff']].median()

如果您只需要日期,您可以添加.dt.days

【讨论】:

    【解决方案2】:

    这对我有用,但你忘了提到“OldValue”代表 OPP 的创建。

    df['difference'] = df.groupby('OpportunityId').reatedDate.diff()
    df['aux'] = df['OldValue'] + ' - ' + df['NewValue']
    df['days_diff'] = df['difference'].dt.days
    df.groupby('aux')['days_diff'].mean()
    

    输出:

    aux                     days_difference
    Identify - Closed Lost       170.666667
    Identify - Closed No Deal    115.500000
    Identify - Invalid            12.000000
    Identify - Qualify           143.000000
    Negotiate - Closed Lost             NaN
    Negotiate - Closed Won        19.000000
    Negotiate - Propose          346.000000
    Propose - Identify                  NaN
    Propose - Negotiate            0.000000
    Propose - Qualify             47.000000
    Qualify - Closed No Deal            NaN
    Qualify - Identify            93.000000
    Qualify - Negotiate                 NaN
    Qualify - Propose              0.000000
    

    【讨论】:

      猜你喜欢
      • 2019-12-22
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 2021-07-13
      • 2021-04-22
      • 2020-05-16
      相关资源
      最近更新 更多