강의 내용과 무관한 질문인데요. C언어 문제들을 여러 개 풀다보니까 직관적으로 눈에 보이는 게 많아지긴 했습니다. 예를들어 반복문 안에서 배수를 구한다던지, null을 만나면 빠져나간다던지.. 배열 공부 중에 래그드 배열이라는 걸 알게됐는데 계단식으로 쪼개지는(?) 규칙성이 있더라고요. 그래서 말인데 혹시 래그드배열 관련 강의나 자료 올려주실 계획이 따로 있으실까요..? ㅎㅎ
if 문에 i%2 !=0 (i를 2로 나눴을때 0이 아니면 참) i가 0 일때 i++ 하면 1%2 !=0(참 이므로 continue) 그다음 21:05 i가 1일때 i++돼서 i가 2가 된 후 if문을 실행하잖아요 그러면 나머지가 0이므로 거짓이니까 printf문에서 2가 출력돼야 하는거 아닌가요?
안녕하세요. 연습문제 2번을 다음과 같이 풀어보았습니다. Q: 리텐션 연습문제: Retain User를 New, Current, Resurrected, Dormant User로 나누는 쿼리를 작성하여라. 주어진 데이터에서 어떤 사람들이 리텐션이 그나마 높은지, 찾아보아라. 주차별, 전체 유저에 대한 코호트 분석 그래프를 보면, 다음과 같습니다. 문제 정의 2022년 12월 19일 이후로 리텐션이 떨어지고 있는 문제점이 발생했다. 해당 원인이 무엇일까? 가설 설정 1) 고객의 유입량이 감소하고 있다. -> 2022년 12월 19일 이전과 이후의 주차별 신규 가입자 수를 비교한다. 2) 리텐션의 변화가 특정 유저 그룹에 의해 영향을 받는가? -> 신규유저는 어떤 시점을 기준으로 분류할 것인가? 주차별 신규 가입자 수 시각화 2022년 12월 19일을 월요일로 하는 주차부터 신규 가입자 수가 감소하는 추세이다. 전반적으로 신규가입자 수는 증가하는 추세였으나, 12월 19일을 기점으로 꺾이는 현상을 보인다. 따라서, 신규 가입자 수가 리텐션에 영향을 준다는 것을 확인할 수 있다. 기존의 추세와 반하게, 떨어지는 추세를 보이기 때문에 다음과 같이 기존 유저와 신규 유저를 정의하겠다. 1) 기존 유저 => 2022년 10월 03일 ~ 2022년 12월 19일 이전 2) 신규 유저 => 2022년 12월 19일 이후 복귀유저와 이탈 유저를 판단하는 기준이 필요하다. 이를 위해, 첫 로그인 이후, 두번째로 로그인을 하기까지의 걸리는 시간을 4분위 수로 검증해서, 중위값을 기준으로 기존유저와 복귀유저를 구분해보기로 했다. 로그인 판단 기준 = click_login 이라는 이벤트가 발생했을 경우 1. 자동 로그인 여부 판단 SELECT COUNT(*) FROM advanced.app_logs CROSS JOIN UNNEST(event_params) AS ep WHERE ep.key = "firebase_screen" AND ep.value.string_value = 'welcome' AND user_id IS NOT NULL 자동 로그인이 된다면, click_login 이벤트가 발생하지 않을 것이다. 하지만, COUNT(*)가 0이기 때문에, 해당 앱은 자동 로그인이 되지 않음을 알 수 있다. 즉, 사용자가 앱에 접속하면, 가입을 했더라도, 무조건 로그인을 해야한다. 따라서, 사용자가 앱에 접속 시, 로그인 이벤트가 무조건 발생한다. 2.첫번째 로그인 후, 다음 로그인하기까지 걸린 시간을 4분위 수로 계산 WITH base AS (SELECT event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_timestamp, user_pseudo_id, event_name, ROW_NUMBER() OVER (PARTITION BY user_pseudo_id ORDER BY event_date) AS login_rn FROM advanced.app_logs WHERE event_name = 'click_login' AND event_date >= '2022-10-03' QUALIFY login_rn < 3) , second_event_data AS (SELECT event_date, event_timestamp, user_pseudo_id, event_name, login_rn, IF(second_event_date IS NULL, '2023-01-20', second_event_date) AS second_event_date FROM (SELECT *, LEAD(event_date) OVER (PARTITION BY user_pseudo_id ORDER BY event_date) AS second_event_date FROM base)) SELECT APPROX_QUANTILES(date_diff_day, 100)[OFFSET(25)] AS percentile_25, APPROX_QUANTILES(date_diff_day, 100)[OFFSET(50)] AS percentile_50, APPROX_QUANTILES(date_diff_day, 100)[OFFSET(75)] AS percentile_75, MAX(date_diff_day) AS percentile_100, AVG(date_diff_day) AS average FROM (SELECT DATE_DIFF(second_event_date, event_date, DAY) AS date_diff_day FROM second_event_data) 유저별로 로그인을 한 시점을 ROW_NUMBER()로 카운트했다. 또한, second_event_date(다음 로그인 시점)이 NULL인 경우는 이탈 유저이다. 그런데, 4분위 수를 계산하려면, 해당 값을 채워야했다. 2099-12-31로 하려고 했으나, 너무 큰 값을 채워버리면, 4분위 수 검증이 정확하지 않게 되기 때문에 (mid와 avg값이 오른쪽으로 치우쳐버리는 현상이 발생할 수 있다.) second_event_date의 max값을 구해서, 2023-01-20을 채워주었다. Approx_quantiles 함수는 백분위로 나눌 경우, 각 근사치의 최대값을 나타내는 함수이다. 중위값에 해당하는 값들 중 가장 큰 값은 39일이다. 이번에는, 해당 범위에 속하는 값들이 몇개가 있는지 확인해보겠다. SELECT COUNTIF(date_diff_day <= 19) AS count_up_to_25, COUNTIF(date_diff_day > 19 AND date_diff_day <= 39) AS count_25_to_50, COUNTIF(date_diff_day > 39 AND date_diff_day <= 66) AS count_50_to_75, COUNTIF(date_diff_day > 66 AND date_diff_day <= 109) AS count_75_to_100 FROM temp 데이터가 1분위, 2분위에 몰려있다. 따라서, 40일 을 기준점으로 삼아야겠다. 2022년 12월 19일 이후 ~ (신규유저) 2022년 10월 3일 이후 ~ 2022년 12월 19일 이전, 10월 3일 이후부터 다음 접속 시간이 40일 이전인 경우 (기존유저) 2022년 10월 3일 이후로부터 40일 이후로 접속한 유저(복귀유저) 2022년 10월 3일 이후로부터 40일 이후로도 접속 이력이 없는 경우 (이탈 유저) 3. 다음 접속일까지의 걸린 일 수 기반, 유저 분류 -- 유저별, 첫번째 로그인 후, 다음 로그인하기 걸린 시간을 4분위 수로 계산 -- 25% | 50% | 75% | 100% -- 로그인_이벤트: click_login -- event_date, event_timestamp, event_name, -- 중간테이블 -- 유저별 로그인을 한 시점을 ROW_NUMBER()로 카운트하기 -- 유저별 첫번째 로그인을 한 시점 구하기 MIN(event_date) OVER() -- second_event_date가 NULL인 경우는 이탈 유저임. -- 그런데, 4분위 수를 계산하려면, MAX(second_event_date) 값을 구하고, NULL을 잠시 해당 값으로 채워놔야함. -- 그 이유는 너무 큰 값으로 채워버리면, 4분위 수 검증이 정확하지 않기 때문임 (mid값과 avg값이 오른쪽으로 치워쳐버리는 현상이 발생할 수 있음) max_event_date: 2023-01-20 WITH base AS (SELECT event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_timestamp, user_pseudo_id, event_name, ROW_NUMBER() OVER (PARTITION BY user_pseudo_id ORDER BY event_date) AS login_rn FROM advanced.app_logs WHERE event_name = 'click_login' AND event_date > '2022-10-03' QUALIFY login_rn < 3) , second_event_data AS (SELECT DISTINCT event_date, event_timestamp, user_pseudo_id, event_name, login_rn, IF(second_event_date IS NULL, '2099-01-20', second_event_date) AS second_event_date FROM (SELECT *, LEAD(event_date) OVER (PARTITION BY user_pseudo_id ORDER BY event_date) AS second_event_date FROM base)) -- 접속 데이터 기반, 신규, 기존, 복귀, 이탈 구분 , user_type_data AS (SELECT event_date, second_event_date, user_pseudo_id, DATE_DIFF(second_event_date, event_date, DAY) AS comeback_day, CASE WHEN event_date >= DATE('2022-12-19') THEN '신규 유저' WHEN event_date >= DATE('2022-10-03') AND second_event_date <= DATE_ADD(event_date, INTERVAL 40 DAY) THEN '기존 유저' WHEN event_date >= DATE('2022-10-03') AND second_event_date > DATE_ADD(event_date, INTERVAL 40 DAY) AND second_event_date != DATE('2099-01-20') THEN '복귀 유저' WHEN event_date >= DATE('2022-10-03') AND second_event_date = DATE('2099-01-20') THEN '이탈 유저' ELSE NULL -- 예외 처리 END AS user_type FROM second_event_data) 4. 각 유저 타입별 리텐션 계산 기존 유저 -- 일자별 리텐션 계산 (기존 유저) , analysis_current AS (SELECT diff_of_day, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM (SELECT user_pseudo_id, MIN(event_date) OVER (PARTITION BY user_pseudo_id) AS first_day, event_date, comeback_day as diff_of_day FROM user_type_data WHERE user_type = '기존 유저' ORDER BY event_date, second_event_date) GROUP BY 1) SELECT diff_of_day, user_cnt, first_user_cnt, ROUND(SAFE_DIVIDE(user_cnt, first_user_cnt), 3) AS retention_day_rate FROM (SELECT diff_of_day, user_cnt, FIRST_VALUE(user_cnt) OVER (ORDER BY diff_of_day) AS first_user_cnt FROM analysis_current) 복귀 유저 신규 유저 이탈 유저 리텐션이 평평하게 안나오네요... 뭔가 단단히 잘못된것 같습니다..
안녕하세요. 8장에서 postgres 에 insert하는 dag를 실행하면 아래와 같은 오류로 대기하다가 실패로 끝납니다. 구글에 찾아보면 'secret_key'를 모두 동일하게 적용해주라고 하는데, 어떻게 적용해야 되는지 찾지는 못해서 이렇게 문의하게 되었습니다. 아래 소스도 git에 올라와 있는 소스 그대로 올려서 수행했기 때문에 따로 올리지는 않았습니다. docker-compose.yaml dags_python_with_postgres 위에 상태에서 최종 오류로 떨어지면 오류 메세지를 확인할 수 있었습니다 .ㅜ 사실 원인은 위에 메세지가 아닌것 같아요. ERROR - Failed to execute job 1119 for task insrt_postgres (connection to server at "172" (0.0.0.172), port 5432 failed: Connection timed out Is the server running on that host and accepting TCP/IP connections? connection to server at "28.0.3" (28.0.0.3), port 5432 failed: Connection timed out Is the server running on that host and accepting TCP/IP connections? 그리고, 저의 docker-compose.yaml 에서 postgres_custom, postgres의 설정부분입니다. 그리고, airflow의 connection 연결할 때도 포트는 5432로 했습니다. 사실 질문답변을 검색해보면 저와 비슷한 오류가 1개 있어서 확인을 해봤는데요 그 오류는 5429에서 5432로 변경해서 해결됐다고 나온 것 같고 저는 5432인데 해결이 안돼서 제가 실수한게 있는지 확인부탁드립니다. ㅜ
리텐션 SQL 쿼리 작성하기, Weekly와 Monthly 쿼리를 작성한 부분을 게시판에 올립니다. -- Weekly 리텐션 작성하기. 마지막 부분 , analysis AS (SELECT diff_of_week, user_cnt, FIRST_VALUE(user_cnt) OVER (ORDER BY diff_of_week) AS first_user_cnt FROM (SELECT diff_of_week, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM first_date_and_diff GROUP BY 1)) SELECT diff_of_week, user_cnt, ROUND(SAFE_DIVIDE(user_cnt, first_user_cnt), 3) AS retention_week_rate FROM analysis ORDER BY 1; -- 월별 리텐션 계산 WITH base AS ( SELECT DISTINCT user_pseudo_id, event_name, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime, FROM advanced.app_logs WHERE event_date BETWEEN '2022-08-01' AND '2022-11-03' ), first_date_and_diff AS ( SELECT *, DATE_DIFf(event_month, first_month, MONTH) AS diff_of_month FROM ( SELECT DISTINCT user_pseudo_id, DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id), MONTH) AS first_month, DATE_TRUNC(event_date, MONTH) AS event_month FROM base ) ), analysis AS ( SELECT diff_of_month, user_cnt, FIRST_VALUE(user_cnt) OVER(ORDER BY diff_of_month) AS first_user_cnt FROM ( SELECT diff_of_month, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM first_date_and_diff GROUP BY 1 ) ) SELECT diff_of_month, user_cnt, ROUND(SAFE_DIVIDE(user_cnt, first_user_cnt), 3) AS retention_month_rate FROM analysis
24년 1회 c언어 20:37 I 가 N t가 d i가 s s가 c 8 이 1 으로 바뀌는데 공백은 어찌하여 생기는건가요 24:58 부분에 BankAcc myAcc 가 있고 initAcc에 있는 MyAcc 가 왜 위에 myAcc 이며 9981, 2200.0 은 왜 void initAcc 에 acc에 x 값에 넣고 y 값에 넣는지 모르겠습니다 why? 일까요 2023 3회 부분 complete(i) 1~100 까지인건 알겠는데 왜 위로 올라가서 complete(int n) 은 0 부터 시작되나요? 2023 2회 20:34 정적 동적 부분 자세한 설명이 필요합니다 강의에서 제가 놓친걸까요 해당 부분 알려주시면 학습하겠습니다.
선생님과 다른느낌으로 코드를 작성한것 같은데, 검사기는 오류없이 잘 돌아갔어요 이렇게 작성하면 틀린걸까요?? import sys sys.stdin=open("input.txt","rt") input=sys.stdin.readline n,m=map(int,input().split()) a=[[0]*(n+1) for _ in range(n+1)] for i in range(m): x,y=map(int,input().split()) a[x][y]=1 s=0 b=[0]*(n+1) b[1]=1 def DFS(L): global s if L==n: s=s+1 return for j in range(1,n+1): if a[L][j]==1 and b[j]==0: b[j]=1 DFS(j) b[j]=0 DFS(1) print(s)
업캐스팅 문제 예시 8. 자식 클래스에만 있는메서드를 호출하면? 관련입니다. A b = new B(1); b.paint(); b.draw(); b.specialDraw(); ← 여기가 오류가 난다는 건 이해했습니다. 또한, 이 문제 정답 관련해서 정답:에러 error: cannot find symbol 라고 적혀있는 것은 확인했습니다. 그런데, b.specialDraw(); 부분 이전까지는 정상적으로 작동을 하니까 생성자 of AA10 생성자 BB1 CD 까지는 출력이 되어야 하는게 아닌가 궁금합니다. 아니면 b.specialDraw(); 부분 오류 때문에 error: cannot find symbol로만 출력되는건지 궁금합니다.
1 객체지향 설계원칙 이 6페이지, 7페이지에 들어있는데(내용은 조금 상이) 각각의 목차에서 필요해서 넣으신것인지 중복되어 들어간 것인지 문의드립니다 2 그리고 소프트웨어 아키텍처의 설계과정 두 번 들어갔어요 이것도 이유가 있으신가요? 3 목차 4번 서버 프로그램 구현에 결합도와 응집도 따로 들어가있던데요 이건 소제목이 없어서요 앞 내용이랑 이어지지 않는데.. 이건 여기 있는 게 맞는건지.. 소제목이 따로 없는 지 문의 드려요