목록전체 글 (79)
tak's data blog
보통 고객이 이탈할 때, 재구매를 할 때 등 기간을 구하기 위해 고유한 인덱스를 기준으로 정렬해 위아래의 차이로 계산한다. 여태까지 아래와 같이 비효율적이게 for문으로 조건을 주어 해결했었다. 새로운 데이터프레임, 고유한 유저별 데이터프레임을 생성해 계산한 후 concat하는 방식으로 진행했었다... from tqdm import tqdm reorder_day = pd.DataFrame() de_lp['reorder_day'] = 0 u_list = de_lp[de_lp['reorder'] == 'O']['cust'].unique() for i in tqdm(u_list): reorder_df = de_lp[de_lp['cust'] == i] reorder_df[['reorder_day']] = reo..
배경 선정 이탈 분석이라는 주제를 잡고 진성, 이탈 유저들의 플레이 특징을 위주로 파악해보려고 하였다. 우선 피파온라인4는 특성상 nextfield라는 체감 개선 업데이트가 거의 반기별로 이루어진다. 침투 플레이, 중거리 슛, 헤딩, 패스 등의 개선이 이루어지는 것이다. 피파4를 이탈했다가 돌아올 때가 되면 nextfield 업데이트가 이루어져 있고, 이로 인해 나의 플레이타입도 변화를 주어야 이길 가능성이 높아져 또 적응의 시간이 필요하다. 그래서 적응을 하지 못해 다시 이탈한 경험이 있기 때문에 이탈 유저는 nextfield에 적응을 잘 할 것인가?를 가설로 세우게 되었다. 실제로 아래는 7차 nextfield가 이루어졌을 때 유저들의 반응이다. 다수의 유저들도 비슷한 생각을 가지고 있었음을 확인하였..
#1795 select * from (select product_id, 'store1' as store, store1 as price from Products union select product_id, 'store2' as store, store2 as price from Products union select product_id, 'store3' as store, store3 as price from Products) t where price is not null store1, store2, store3 각각의 칼럼을 전체적인 store과 price로 피벗테이블로 만드는 것과 동일한 문제이다. 각각의 store칼럼별로 새롭게 테이블을 만든 후 union으로 결합해 해결할 수 있다. 여기까지 무료로 제..
#1393 SELECT stock_name, SUM( CASE WHEN operation = 'Buy' THEN -price ELSE price END) AS 'capital_gain_loss' FROM Stocks GROUP BY stock_name 물품별 총 판매 + 구매 가격을 구하는 문제이다. case when으로 조건을 주어 총합을 구할 수 있었다. 아래는 일부러 꼬아서 with문을 통해 판매한 물품 테이블, 구매한 물품 테이블을 따로 구해서 합을 구한 방법이다. 아래의 방법은 추후에 어려운 문제들이 나오고 테이블 생성이 필요할 때 언젠가 쓰이지 않을까 생각해보았다. # Write your MySQL query statement below WITH MINUS AS (SELECT stock_nam..
#626 연속된 id 2개를 바꾸는 문제이다. 특이 조건으로 홀수행으로 끝나면 마지막 행은 그대로 둔다는 점이다. SELECT (CASE WHEN id % 2 != 0 and counts != id THEN id + 1 WHEN id % 2 != 0 and counts = id THEN id ELSE id -1 END )AS id, student FROM Seat, (SELECT count(*) as 'counts' FROM Seat ) as s_count order by id asc 처음 마지막 행 조건을 안두고 풀었을 땐 잘 풀렸는데 마지막 조건을 생각하느라 시간이 걸렸다. 서브쿼리로 따로 count 테이블을 만들어주고 id 갯수와 원래 테이블과의 마지막 id숫자가 같은지 다른지 조건을 주어 해결하였..
이번 문제를 풀면서 테스트케이스는 다맞췄는데 실제로 제출해보니 정답이 아니였다. #262 # Write your MySQL query statement below WITH A as ( SELECT t.request_at as 'Arequest', count(t.request_at) as 'Acount' FROM Trips t join Users u on t.client_id = u.users_id WHERE u.banned != "Yes" GROUP BY t.request_at ) ,B as ( SELECT t.request_at as 'Brequest', count(t.status) as 'Bcount' FROM Trips t join Users u on t.client_id = u.users_id W..
# 184 SELECT d.name as 'Department', e.name as 'Employee', e.salary as 'Salary' FROM Employee e inner join Department d on e.departmentId = d.id WHERE (e.departmentId, e.salary) in ( SELECT departmentId, MAX(salary) FROM Employee GROUP BY departmentId ) # 서브쿼리없이 바로 groupby를 해버리면 안됨. 처음 바로 groupby를 해서 id별 max(salary)를 구하지 못함 where절에 서브쿼리없이 바로 groupby를 해버려서 id별 max(salary)를 구하지못했다. 솔루션의 도움을 받아 해결완..
피파4 api를 통해서 데이터를 불러오고 활용할만한 데이터를 수집하는 법을 작성하도록 하겠다. 아래는 실제 나의 닉네임이다. 닉네임을 입력하면 아래와 같이 json형태로 데이터가 구성되어 있음을 확인할 수 있다. 유저 고유의 accessid랑 level등이 존재한다. 피파온라인4와 같은 게임은 rpg게임과 다르게 부캐를 육성하는 사람들이 대다수이므로 레벨은 추후 분석에서 제외하고 진행할 예정이다. 우선 위의 accessId를 기준으로 유저의 매치정보, 상세정보, 게임 내 슛, 수비, 패스 등의 정보도 추가로 가져올 수 있다. accessId를 통해 데이터를 불러오는 과정을 아래와 같이 함수로 정의하였다. import json import requests import pandas as pd import n..