본문 바로가기

Data/Data Analysis

(43)
[Pyspark ] pivot 함수 사용방법 다음과 같이 result란 pyspark dataframe이 있다고할때. 날짜별로, Reason column을 pivot시켜서 사람수를 보고싶을때 다음과같이 코드를 사용해서 pivot을 진행할수있다 result\ .groupBy('date')\ .pivot('Reason')\ .agg(F.sum('count_user'))\ .orderBy('date')\ .show(100,False) 출력은 다음과같다
[Pyspark] groupBy 개수 중복제거 countDistinct 데이터 분석을 할때 groupBy를 굉장히 많이 사용하는데. 이런 경험이 있었다. 예를들어서 df란 pyspark.DataFrame이 다음과 같이 있다면 date accountId timestamp another 2020-11-02 A 1 B 2020-11-02 A 2 C 2020-11-02 A 3 B 2020-11-02 A 4 D 2020-11-02 B 1 A 2020-11-02 B 2 C 여기서 날짜 그리고 accountId를 묶어서 another의 개수와 평균 timestamp를 계산하려고하면 이렇게 쓸수있을것이다 df.groupBy('date', 'accountId')\ .agg(F.count(F.col('another')).alias('count'), F.avg(F.col('timestamp')..
[Pandas] apply, map, groupby등 모르는거 정리 Apply pyspark 에서 udf성격을 띄는 pandas function 이다. # 한 컬럼만 적용할 경우 def stars(values): if values >= 95: return 3 elif values >= 85: return 2 else: return 1 df.values.apply(stars) # 여러 컬럼이 필요할 경우 def stars(df): if df.country == 'canada': return 3 elif df.score >= 95: return 3 elif df.score >= 85: return 2 else: return 1 df.apply(stars, axis='columns') Map 위처럼 함수를 사용하지않고 한줄의 코드로도 작성이 가능하다 # 만일 한 column에..
[SQL] RANK(), ROW_NUMBER(), DENSE_RANK() RANK() 함수는 중복 순위 다음은 해당 개수만큼 건너뛰고 반환 예를들어서 다음과 같은 A테이블이 있다하면 pay user 4.00$ A 3.00$ B 3.00$ C 2.00$ D select rank() over(order by pay desc) as rank, pay, user from A 다음과 같이 출력이된다 rank pay user 1 4.00$ A 2 3.00$ B 2 3.00$ C 4 2.00$ D ROW_NUMBER() 함수는 중복 순위 상관없이 순차적으로 반환 select row_number() over(order by pay desc) as rank, pay, user from A rank pay user 1 4.00$ A 2 3.00$ B 3 3.00$ C 4 2.00$ D DENS..
[SQL] ARRAY_CONTAINS 함수 SQL에서 array안에 특정 값이 들어있는지 판단여부를 위해 ARRAY_CONTAINS함수를 사용한다. 만일 어떤 테이블에서 다음과 같이 데이터가 있을 때 accountId word jaeyung hi jaeyung hello jaeyung what 우리는 jaeyung이라는 유저가 쓴 단어중에 hi라는 단어의 유무를 알고싶다. 사용방법은 다음과 같다 select accountId, collect_set(word) as array_list from A group by 1 having array_contains(array_list, 'hi') 이렇게 되면 array_list에 있는 단어중에 hi 유무를 판단 할 수가 있다
[Pyspark] UDF 함수에 parameter값 추가 데이터 전처리를 하는중, udf에 파라미터를 넘겨줘서 파라미터에 따라서 함수를 실행하는걸 원했다 다음과 같이 진행 파라미터값을 넘겨줄 땐, F.lit()함수를 이용해서 파라미터 값을 넘겨주면된다. 즉, F.lit('play')일 경우에는 reason 함수에서 logtype == 'play' 쪽 알고리즘이 실행되고 아니면 그 밑에 알고리즘이 실행이된다. import pyspark.sql.functions as F def reason(string, logtype): if logtype == 'play': try: return string.split(",")[0] + "," + string.split(",")[1] except: return string.split(",")[0] # unplay else: tr..
[SQL] ROW_NUMBER(), LEAD(), LAG() 설명전에 해당 sql은 pyspark.sql 이라는 점 확인! row_number() - 행 번호 매겨주는 sql함수 LEAD() - 다음 행 값을 가져오는 sql 함수 LAG() - 이전 행 값을 가져오는 sql 함수 아래와 같은 테이블이 있을때 (shot) user timestamp shot_id jaeyung 12:34:54 123 jaeyung 12:45:34 234 jaeyung 12:50:55 456 seung 12:55:23 334 seung 13:01:34 523 seung 13:12:43 646 1. row_number() spark.sql(""" select user, timestamp, shot_id, row_number() over(partition by user order by t..
[Pandas] Dataframe resample 함수 시계열 데이터를 처리할 때 일정시간 간격이 벌어져있을때 upsampling, downsampling 기법을 이용하여 데이터를 늘리거나 줄인다. 이러한 방법은 pandas.Dataframe에서 resample함수를 이용하여 작업한다. 일단 해당 작업은 index가 datetime형식이여야 지원이 가능하다. 두가지 방법이있는데 다 알아보자 1. 복잡하지만 자세하게 세팅이 가능한 방법 먼저 데이터를 불러읽은다음에 info함수를 사용하여 column들의 정보를 빼온다. 현재 timestamp column은 string 형식이고 index가 아니기때문에 resample 함수를 쓸수가없음 따라서 다음과 같이 datetime으로 변환을 하고, 다시 info함수를 쓰면, 기존의 timestamp column이 date..