首页 > 解决方案 > 使用熊猫数据的概率密度函数

问题描述

鉴于先前事件的存在,我想对事件发生的概率进行建模。

为了给你更多的上下文,我计划按anonymous_id 对我的数据进行分组,按时间戳(ts)对分组数据集的值进行排序,并计算该人经历的源序列(utm_source)的概率。该人由唯一的anonymous_id 表示。因此,期望的最终目标是来自 Facebook 来源的人然后来自 Google 来源等的概率

有人告诉我,像 sci.py gaussian_kde 这样的包将对此有用。然而,从玩它,这需要数字输入。

test_sample = test_sample.groupby('anonymous_id').apply(lambda x: x.sort_values(['ts'])).reset_index(drop=True)

并且不确定接下来要尝试什么。我也试过这个,但我认为它没有多大意义:

stats.gaussian_kde(test_two['utm_source'])

这是我的数据示例

    {'Unnamed: 0': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9},
 'anonymous_id': {0: '0000f8ea-3aa6-4423-9247-1d9580d378e1',
  1: '00015d49-2cd8-41b1-bbe7-6aedbefdb098',
  2: '0002226e-26a4-4f55-9578-2eff2999de7e',
  3: '00022b83-240e-4ef9-aaad-ac84064bb902',
  4: '00022b83-240e-4ef9-aaad-ac84064bb902',
  5: '00022b83-240e-4ef9-aaad-ac84064bb902',
  6: '00022b83-240e-4ef9-aaad-ac84064bb902',
  7: '00022b83-240e-4ef9-aaad-ac84064bb902',
  8: '00022b83-240e-4ef9-aaad-ac84064bb902',
  9: '0002ed69-4aff-434d-a626-fc9b20ef1b02'},
 'ts': {0: '2018-04-11 06:59:20.206000',
  1: '2019-05-18 05:59:11.874000',
  2: '2018-09-10 18:19:25.260000',
  3: '2017-10-11 08:20:18.092000',
  4: '2017-10-11 08:20:31.466000',
  5: '2017-10-11 08:20:37.345000',
  6: '2017-10-11 08:21:01.322000',
  7: '2017-10-11 08:21:14.145000',
  8: '2017-10-11 08:23:47.526000',
  9: '2019-06-12 10:42:50.401000'},
 'utm_source': {0: nan,
  1: 'facebook',
  2: 'facebook',
  3: 'google',
  4: nan,
  5: 'facebook',
  6: 'google',
  7: 'adwords',
  8: 'youtube',
  9: nan},
 'rank': {0: 1, 1: 1, 2: 1, 3: 1, 4: 2, 5: 3, 6: 4, 7: 5, 8: 6, 9: 1}}

注意:我将数据框转换为字典

标签: pythonpandasscipy

解决方案


这是您可以做到的一种方法(如果我理解正确的话):

from itertools import chain
from collections import Counter

groups = (df
  .sort_values(by='ts')
  .dropna()
  .groupby('anonymous_id').utm_source
  .agg(list)
  .reset_index()
)

groups['transitions'] = groups.utm_source.apply(lambda x: list(zip(x,x[1:])))
all_transitions = Counter(chain(*groups.transitions.tolist()))

这给了你(在你的示例数据上):

In [42]: all_transitions
Out[42]:
Counter({('google', 'facebook'): 1,
         ('facebook', 'google'): 1,
         ('google', 'adwords'): 1,
         ('adwords', 'youtube'): 1})

还是您在寻找不同的东西?


推荐阅读