2017-10-03 1 views
0

나는 서비스에 대한 사용자 가입을 포함하는 테이블이 있습니다.파이썬 팬더 그룹에 의해 카운트의 시계열을 구축

사용자 상태가 변경되면 동일한 user_id, 새로운 업데이트 시간 및 새로운 상태로 테이블에 새로운 행이 삽입됩니다.

예 테이블 :

example = {'updated_at':['2017-01-01', '2017-01-01', '2017-01-02','2017-01-02', '2017-01-03','2017-01-03','2017-01-03','2017-01-04','2017-01-04'], 
      'user_id': [9, 10, 11, 12, 13, 12, 14, 11, 10], 
      'status': ['trial', 'cancelled', 'trial', 'trial', 'trial', 'active', 'active', 'active', 'active']} 

example_data = pd.DataFrame.from_dict(example) 

내가 구축을 위해 노력하고있어 매일의 상태로 그룹화 사용자의 수를 표시하는 테이블입니다. 하루가 지나도 바뀌지 않으면 테이블에 같은 날의 데이터가 표시됩니다.

사용자 중 한 명이 상태를 업데이트 한 다음 그 다음 날부터는 새로운 상태 분류가 반영되어야합니다.

예 원하는 결과는 :

print desired_results 
      date n  status 
0 2017-01-01 0  active 
1 2017-01-01 1 cancelled 
2 2017-01-01 1  trial 
3 2017-01-02 0  active 
4 2017-01-02 1 cancelled 
5 2017-01-02 3  trial 
6 2017-01-03 2  active 
7 2017-01-03 1 cancelled 
8 2017-01-03 4  trial 
9 2017-01-04 4  active 
10 2017-01-04 0 cancelled 
11 2017-01-04 2  trial 

지금까지 시도하는 것 :

(example_data. 
groupby(['updated_at','status']). #group by date and status 
count(). # count in each group 
unstack(fill_value = 0). # unstack 
cumsum(). # cumsum for each status 
stack(). # stack all together again 
reset_index().rename(columns={'user_id': 'n'})) # rename column and reindex 

그러나 이것은 내가 기대하고 있었는지 저를 포기하지 않습니다. 문제는 새 레코드로 업데이트를 계산하므로 사용자가 두 번 계산된다는 것입니다.

아무도 도와 드릴 수 있습니까?

답변

0

나는 실제로해야 할 일은 단순히 각 사용자에 대한 이전 관찰을 '계속 수행'한 다음 간단한 groupby와 카운트를 수행한다는 것임을 깨달았습니다.

나는 이것에 대해 answer을 찾았습니다. Groupby에서 어떻게 날짜를 다시 인덱싱 할 것인가에 대한 올바른 정보를 얻었습니다.

내 솔루션은 다음과 같습니다

def reindex_by_date(df): 
    dates = ['2017-01-01','2017-01-02','2017-01-03','2017-01-04'] 
    return df.reindex(dates, method = 'ffill') 

(example_data. 
groupby('user_id'). 
apply(reindex_by_date). 
reset_index(0, drop=True). 
reset_index(). 
groupby(['status', 'index']). 
count(). 
reset_index(). 
sort_values(['index','status']). 
rename(columns={'index':'date'}) 
) 

은 위의 약간의 여분의 것, 그것을 할 수있는 청소기 방법은 아마이있다.

+0

당신은 당신의 대답을 받아 들여야합니다;) – Dionys

+0

다른 사람들이 깨끗한 해결책으로 대답하지 않는 한, 나는 허락하자마자 내 대답을 받아 들일 것입니다. :) –

0

나는 정말로 당신이 원하는 것이 확실하지 않지만 이것이 효과가있는 것처럼 보입니까?

(example_data. 
    groupby(['updated_at','status']). #group by date and status 
    count(). # count in each group 
    unstack(fill_value = 0). # unstack 
    stack(). # stack all together again 
    reset_index().rename(columns={'user_id': 'n'})) # rename column and reindex 
+0

안녕 Dionys, 감사하지만 예상 된 결과를 제공하지 않습니다. 내가 원하는 것을 보여주기 위해 example_results를 출력했다. 어느 부분이 명확하지 않습니까? –