Stata:将按时间排序的数组划分为不相交的集合

时间:2017-02-27 18:54:17

标签: python stata disjoint-sets

我正在寻找Stata方法将按时间排序的数组划分为不包含重叠元素/观察值的子集。

示例:假设我每天对每个人都有一个变量meal,我想确定个人何时可能切换到不同的饮食:diet_type生成。id day_id meal diet_type 1 1 a 1 1 2 b 1 1 3 c 1 1 4 a 1 1 5 b 1 1 6 d 2 1 7 e 2 1 8 d 2 。我假设一旦个人改变饮食 - 她永远不会回去,所以吃饭" c"在这个例子中应该分配给第一个饮食,因为还有更多" a"和" b"来之后。

import pandas as pd
import numpy as np


# create example data
df1 = pd.DataFrame({'id': np.full(10, 0), 'day_id': range(10),
                   'meal': ['a','b','c','a','b','d','e','e','f','d']},
                    index=range(10))
df2 = pd.DataFrame({'id': np.full(10, 1), 'day_id': range(10),
                   'meal': ['k','l','m','m','l','m','m','n','m','m']},
                    index=range(10,20))
mealsDf = df1.append(df2)



# create a list of individuals to loop over
list = mealsDf.id.unique()

result_df = pd.DataFrame()
for id in list:
    # select entries in dataframe for this id
    df = mealsDf.loc[mealsDf.id == id]

    # starting with the fist day check for disjoint sets of meals
    df = df.sort('day_id')
    diet_type = []
    m = 0
    d = 0
    for j in range(len(df)):
        a = df.meal[m:j+1]
        b = df.meal[j+1:len(df)]
        if set(a).isdisjoint(b):
            diet_type[m:j+1] = np.full(j+1-m, d)
            m = j + 1
            d = d + 1
    df['diet_type'] = diet_type
    if len(result_df) == 0:
        result_df = df
    else:
        result_df = result_df.append(df)


print(result_df)

在我的实际问题中,我有大约100K个人,每个人每天观察约1000次。

我已经在Python中实现了这一点,现在我想知道这样的问题是否可以使用Stata解决。

更新:我不关心个人是否有相同的饮食,我只需要确定每个人的变化日。

这是我在python中的代码的想法:

    day_id  id meal  diet_type
0        0   0    a          0
1        1   0    b          0
2        2   0    c          0
3        3   0    a          0
4        4   0    b          0
5        5   0    d          1
6        6   0    e          1
7        7   0    e          1
8        8   0    f          1
9        9   0    d          1
10       0   1    k          0
11       1   1    l          1
12       2   1    m          1
13       3   1    m          1
14       4   1    l          1
15       5   1    m          1
16       6   1    m          1
17       7   1    n          1
18       8   1    m          1
19       9   1    m          1

给出了

Twilio.Device.activeConnection().mediaStream

0 个答案:

没有答案