我正在寻找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