从组矩阵求时间序列顺序的最佳方法

2024-09-28 12:17:20 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一个标准的方法可以做到这一点

我基本上有一些用户,他们一起执行操作,然后作为一个组分开。我们不知道事件的顺序,但可以推断:

                      A B C D E
 WentToMall           1 1 1 0 0
 DroveToTheMovies     1 0 0 0 0
 AteLunchTogether     1 1 0 0 0     
 BoughtClothes        1 1 0 0 1
 BoughtElectronics    1 1 0 0 0

规则是它们不能在之后聚合在一起。 所以时间序列看起来像:

时间0总是将它们全部放在一起,然后最大的“分组”将拆分为 “WentToMall”就是我们把A,B,C和D,E分开的地方

从那里,看起来AB从C中分离出来,AB继续“一起,布希衣服,布希电子”。在《布希特衣》中的某个时候,它看起来像是E从D中分离出来的。 最后,A和B在最后分手了,因为A“开车去看电影”

如果可能的话,我还想以可视化的方式展示这一点,也许节点会显示分隔拆分的事件数(如下所示):

ABCDE   ---> ABC --> AB  ->A
 |             |      |->B 
 |             |
 |             |--> C
 |
 |
 |---> DE --> D
       |-->E

出现的一个问题是,有时你会遇到“难以评估”或看似矛盾的时间点,并且不适合基于最小列数的时间点。我也不知道该怎么办。我得到了动作的“权重”,所以我可以根据这个来决定,或者我猜生成所有版本的图表

我想用递归来搜索,或者类似的方法


Tags: 方法用户标准ab顺序规则时间事件
1条回答
网友
1楼 · 发布于 2024-09-28 12:17:20

编辑:最新文件是here

这个过程是通过递归实现的。熊猫在您的场景中很有用,不过可能有更有效的方法来实现这一点

我们从其他节点进行搜索。在您的情况下,这些将是A和E节点。我们如何知道这些是最远的节点?只需计算所有行的0和1值。然后得到0和1值之和。另外,按0对值进行排序。对于第一种情况,应该是这样的:

                    0   1
DroveToTheMovies    4.0 1.0
AteLunchTogether    3.0 2.0
BoughtElectronics   3.0 2.0
WentToMall          2.0 3.0
BoughtClothes       2.0 3.0
FirstCase           0.0 5.0

这意味着有一个人开车去看电影。你看到了模式。后来有人加入了这个人。在第一种情况下,我们从5个人开始。但有一个问题。我们如何知道前一个人是否在小组中?假设X开车去看电影。现在我们检查是否吃过午饭。假设Y和Z加入了组,但不是X。对于这种情况,我们将检查最新组是否在新组中。因此,在我们到达第一个案例之前,我们将所有事件添加到一个数组中。现在我们有了一个分支

假设团体案例中没有人。在本例中,我们还存储了这种奇怪的行为。然后,我们从现在开始。在第一种情况下,我们的起始节点是一个节点;不是B使用相同的技术。因此,这个过程将再次重复

我的最终结果如下:

    0                   1
0   DroveToTheMovies    Index(['A'], dtype='object')
1   AteLunchTogether    Index(['A', 'B'], dtype='object')
2   BoughtElectronics   Index(['A', 'B'], dtype='object')
3   WentToMall          Index(['A', 'B', 'C'], dtype='object')
4   FirstCase           Index(['A', 'B', 'C', 'D', 'E'], dtype='object')
5   BoughtClothes       Index(['E'], dtype='object')
6   FirstCase           Index(['D', 'E'], dtype='object')

第一种情况有两种。但是你需要处理这两个FirstCase的值,并且知道,这个D-E组来自FirstCase组,然后E去买衣服。D是未知的,因此可以指定为其他的东西。就在这里

第一分支机构:

ABCDE    -> ABC  > AB  ->A
               |      |->B 
               |
               | > C

第二分支机构:

(first case) -> DE  > D
                  | >E

你现在要做的就是找到谁留下了树枝。对于第一个分支,它是B、C和D-E。从现在开始,这些很容易计算。希望对你有帮助。代码在这里,我建议调试代码,以便更清楚地了解整个想法:

import pandas as pd

df = pd.DataFrame(
   [[1, 1, 1, 0, 0],
    [1, 0, 0, 0, 0],
    [1, 1, 0, 0, 0],    
    [1, 1, 0, 0, 1],
    [1, 1, 0, 0, 0]], columns=list("ABCDE"))

df.index = ['WentToMall', 'DroveToTheMovies', 'AteLunchTogether', 'BoughtClothes', 'BoughtElectronics']

first_case = pd.DataFrame(
   [[1, 1, 1, 1, 1]], columns=list("ABCDE"), index=['FirstCase'])

all_case = pd.concat([first_case, df])

def case_finder(all_case):
    df_case = all_case.apply(lambda x: x.value_counts(), axis=1).fillna(0)
    df_case = df_case.loc[df_case[1] != 0]
    return df_case.sort_values(by=1)


def check_together(x):
    x = df.iloc[x]
    activity = all_case.loc[x.name]
    does_activity = activity.loc[activity == 1]
    return activity.name, does_activity.index


def check_in(pre, now):
    return pre.isin(now).all()

def check_odd(i):
    act = check_together(i)[0]
    who = check_together(i)[1][~check_together(i)[1].isin(check_together(i-1)[1])]
    return act, who

df = case_finder(all_case)
total = all_case.shape[0]


all_acts = []
last_stable = []
while True:
    for i in range(total):
        act, ind = check_together(i)
        if ind.size == 1:
            print("Initiliazed!")
            all_acts.append([act, ind])
            pass
        else:
            p_act, p_ind = check_together(i-1)
            if check_in(p_ind, ind) == True:
                print("So a new person joins us!")
                all_acts.append([act, ind])
            else:
                print("This is weird. We'll check later!")
                # act, who = check_odd(i)
                last_stable.append([i, p_ind])
                continue
        if act == 'FirstCase':
            break

    if len(last_stable) == 0:
        print("Process done!")
        break
    else:
        print("Update cases!")
        ls_ind = last_stable[0]
        all_case = all_case.drop(last_stable[0][1], axis=1)
        total = all_case.shape[0]
        df = case_finder(all_case)
        last_stable = last_stable[1:]

print(all_acts)

x = pd.DataFrame(all_acts)

相关问题 更多 >

    热门问题