2017-09-23 4 views
2

의 dataframe 제작 : 그룹에 URL 및 타임 스탬프, 총 열 값의 데이터를 내가 원하는는 DASK의 dataframe를 집계하고 나는이처럼 보이는 DASK의 dataframe가 집계

url  referrer session_id ts     customer 
url1 ref1  xxx  2017-09-15 00:00:00 a.com 
url2 ref2  yyy  2017-09-15 00:00:00 a.com 
url2 ref3  yyy  2017-09-15 00:00:00 a.com 
url1 ref1  xxx  2017-09-15 01:00:00 a.com 
url2 ref2  yyy  2017-09-15 01:00:00 a.com 

을하고하고자했다 dataframe을 생산 이 대신에 같이 다음과 같이

스파크 SQL에서
customer url ts     page_views visitors referrers 
a.com url1 2017-09-15 00:00:00 1   1  [ref1] 
a.com url2 2017-09-15 00:00:00 2   2  [ref2, ref3] 

, 나는이 작업을 수행 할 수 있습니다

select 
    customer, 
    url, 
    ts, 
    count(*) as page_views, 
    count(distinct(session_id)) as visitors, 
    collect_list(referrer) as referrers 
from df 
group by customer, url, ts 

Dask 데이터 프레임으로 수행 할 수있는 방법이 있습니까? 나는했지만, 다음과 같이 나는 단지, 별도로 집계 열을 계산할 수 있습니다

# group on timestamp (rounded) and url 
grouped = df.groupby(['ts', 'url']) 

# calculate page views (count rows in each group) 
page_views = grouped.size() 

# collect a list of referrer strings per group 
referrers = grouped['referrer'].apply(list, meta=('referrers', 'f8')) 

# count unique visitors (session ids) 
visitors = grouped['session_id'].count() 

을하지만 내가 필요로 결합 dataframe을 생산하는 좋은 방법을 찾을 수 없습니다.

gb = df.groupby(['customer', 'url', 'ts']) 
gb.apply(lambda d: pd.DataFrame({'views': len(d), 
    'visitiors': d.session_id.count(), 
    'referrers': [d.referer.tolist()]})).reset_index() 

(가정 방문자가 위의 SQL에 따라 고유해야합니다) 당신은 출력의 meta을 정의 할 수 있습니다 :

+0

팬더에서이 작업을 수행 할 수있는 좋은 방법이 있습니까? 그런 식으로 dask.dataframe을 사용할 수 있습니까? – MRocklin

답변

1

다음은 실제로 작업을 수행합니다.

+0

니스! 내 데이터에서'pd.DataFrame'을 구성하면 모든 데이터가 한 컴퓨터의 메모리에 강제로 저장됩니까? 지금은 장난감의 예이지만 실제 작업은 기가 바이트의 분산 데이터로 작동합니다. –

+0

당신의 데이터와 똑같은 데이터로 작동하는 것 같았습니다; http://dask.pydata.org/en/latest/dataframe-api.html#dask.dataframe.groupby.DataFrameGroupBy.apply – mdurant

+0

메타 매개 변수를 입력해야합니다. 맞습니다. 지정한 데이터와 정확히 일치했습니다. 이 예에서. 분할 된 쪽모 세공에서 읽은 약간 큰 데이터 예제에서는 작동하지 않았습니다. 그 문제가 정확히 무엇인지 파악하고 싶습니다. 데이터 샘플을 사용하여 문제를 제기합니다. Stackoverflow는 그렇게 좋은 곳이 아닙니다. 고맙습니다! –