Я хочу посмотреть, зависим ли каждый участник от того или иного вида наркотиков, 1 для зависимого, еще 0.
данные ниже являются записями рецепта для каждого участника. У каждого участника была запись рецепта для этого препарата в день 0. запас - это количество дней, предоставленное подсчетом этого препарата.
id supply days
1 30 -200
1 30 0
1 100 183
1 80 250
2 5 0
2 5 10
3 5 0
3 30 100
3 30 150
3 30 200
3 30 280
3 50 310
Для логики назначения 1 или 0:
Если участник, не имеющий лекарств в наличии в течение предшествующего 90-дневного периода, исчислялся запасами и днями, он становится «наивным»Этот участник может вернуться к наивному статусу, если не будет принимать наркотики в течение 90 дней.
И если у участника есть более 162 дней лекарств, поставленных под рукой, в течение 3 месяцев после «наивного статуса», он будет находиться на очень высоком уровне. риск привыкания. поэтому для этого члена мы присваиваем значение 1.
Желаемый результат должен быть
id y
1 1
2 0
3 0
Я пытался сделать следующее:
#Create Z,Z is the number of each naive status.
z=[]
y=0
z.append(y)
for i in range(len(abc)-1):
if ((df.days[i+1]-df.days[i])>90)&((df.id[i+1]-df.id[i])==0):
y=y+1
z.append(y)
else:
if (df.id[i+1]-df.id[i])!=0:
y=0
z.append(y)
else:
if (df.id[i+1]-df.id[i])==0:
y=y
z.append(y)
df['z']=z
#groupby id and z . sum.
df2=df.groupby(['id','z']).sum()
#create y to assign value.
df2['y'] = np.where((df2.supply>=162) , 1, 0)
Мой результат
id supply days z
1 30 -200 0
1 30 0 1
1 100 183 2
1 80 250 2
2 5 0 0
2 5 10 0
3 30 0 0
3 30 100 1
3 30 150 1
3 30 200 1
3 30 280 1
3 30 310 1
supply_sum
id z
-------------
1 0 30
1 30
2 180
-----------
2 0 10
-----------
3 0 30
1 170
id z y
-------------------
1 0
1
2 1
-----------------
2 0 0
------------------
3 0
1 1
Не работает, потому что я складываю все количество поставок для каждого z. Он должен составлять только 3-месячный запас (180 дней) в зависимости от каждого наивного статуса (z). Например, у id 3 должно быть 0, потому что через 3 месяца после наивного статуса 2 (z = 1) он принял только 120 таблеток <162. Но мой код дал мне 170 в этом случае. </p>