inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

172만명의 커뮤니티!! 함께 토론해봐요.

서브쿼리를 JOIN으로 바꾸기

미해결

[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]

안녕하세요! SUBQUERY 이해 (업데이트) 강의에서 예2의 비교 부분의 쿼리문을 JOIN으로 바꿔서 표현해보려고 하는데 실행 결과 category_id가 1부터 전부 나옵니다. 어떻게 해야 5('Comedy')보다 큰 것만 추출할 수 있을까요? pdf파일 7page JOIN으로 바꿔서 표현해본 쿼리문 실행 결과

  • python
  • sql
  • mysql
  • dbms/rdbms
김양희 댓글 1 좋아요 0 조회수 180

pyside6 설치 강의에 나오는 Qt for Python 확장 설치를 더이상 지원하지 않는답니다.

미해결

[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)

먼저 친절하고 자세한 강의 감사합니다. 덕분에 셀레니움을 이용해서 간단하지만 1차로 원하는 부분까지 개발해 봤습니다. 캠핑장 예약을 위해 아직 더 가야 하지만 버튼 하나로 조회 결과 화면까지 이동하는 건 확인했습니다. ㅎㅎ 질문입니다. pyside6 설치 강의에 나오는 Qt for Python 확장 설치를 더이상 지원하지 않는답니다. 섹션13 의 PySide6 설치 및 사용법 강의에 나오는 Qt for Python 을 검색하니 이 확장은 더 이상 사용되지 않습니다. 대신 Qt All Extensions Pack 확장자를 사용하세요. 라는 멧세지가 나옵니다. Qt All Extensions Pack 이걸 설치해도 강의 따라가는 데 문제가 없을까요? 설치 잘 못 되었다가는 꼬일 거 같아 대기중입니다. ㅠㅠ 감사합니다.

  • python
  • 웹-크롤링
dgroups72 댓글 2 좋아요 1 조회수 279

5-6 JOIN 연습 문제 4번 질문입니다.

해결됨

초보자를 위한 BigQuery(SQL) 입문

안녕하세요 카일님, JOIN 연습문제 4번에서 작성 순서 및 효율성 관련해서 질문드리고 싶습니다. 카일님의 풀이에서는 Active, Training 의 Status 를 필터링 후 pokemon, trainer 테이블을 LEFT JOIN 하시고 마지막에 'Master' 를 필터링하셨는데, 저 같은 경우에는 각각의 테이블마다 필요한 부분을 먼저 필터링 후에 마지막에는 COUNT 만 할 수 있게 진행하였습니다. Trainer 테이블에서는 'Master' 필터 Trainer_pokemon 테이블에서는 'Active', 'Training' 필터 결과적으로 결과값은 올바르게 나오는데 카일님께서 앞선 강의에서 필터링을 먼저 하는 것이 효율적이라 하셨던 것 같아서 질문드리게 되었습니다. 감사합니다. SELECT p.type1, COUNT(tp.id) AS pokemon_cnt -- t.*, -- tp.pokemon_id, -- tp.status, -- p.type1 FROM( SELECT id, achievement_level FROM `basic.trainer` WHERE achievement_level = 'Master' ) AS t LEFT JOIN( SELECT * FROM `basic.trainer_pokemon` WHERE status IN ('Active', 'Training') ) AS tp ON t.id = tp.trainer_id LEFT JOIN `basic.pokemon` AS p ON tp.pokemon_id = p.id WHERE tp.pokemon_id IS NOT NULL GROUP BY p.type1 ORDER BY 2 DESC LIMIT 1;

  • sql
  • bigquery
  • 데이터-리터러시
hoony19980 댓글 2 좋아요 0 조회수 125

INFO sqlalchemy.engine.Engine ROLLBACK

해결됨

실전! FastAPI 입문

swagger 로 opt 생성, 검증 api 실행을 했더니 sqlalchemy.engine.Engine ROLLBACK 로그가 출력이 됩니다. 원인을 모르겠습니다... 로그 INFO: Application startup complete. INFO: 127.0.0.1:63654 - "GET /docs HTTP/1.1" 200 OK email-validator not installed, email fields will be treated as str. To install, run: pip install email-validator INFO: 127.0.0.1:63654 - "GET /openapi.json HTTP/1.1" 200 OK 2024-10-31 14:25:27,367 INFO sqlalchemy.engine.Engine SELECT DATABASE() 2024-10-31 14:25:27,367 INFO sqlalchemy.engine.Engine [raw sql] {} 2024-10-31 14:25:27,369 INFO sqlalchemy.engine.Engine SELECT @@sql_mode 2024-10-31 14:25:27,369 INFO sqlalchemy.engine.Engine [raw sql] {} 2024-10-31 14:25:27,369 INFO sqlalchemy.engine.Engine SELECT @@lower_case_table_names 2024-10-31 14:25:27,370 INFO sqlalchemy.engine.Engine [raw sql] {} 2024-10-31 14:25:27,372 INFO sqlalchemy.engine.Engine BEGIN (implicit) 2024-10-31 14:25:27,377 INFO sqlalchemy.engine.Engine SELECT user.id, user.username, user.password, todo_1.id AS id_1, todo_1.contents, todo_1.is_done, todo_1.user_id FROM user LEFT OUTER JOIN todo AS todo_1 ON user.id = todo_1.user_id WHERE user.username = %(username_1)s 2024-10-31 14:25:27,377 INFO sqlalchemy.engine.Engine [generated in 0.00018s] {'username_1': 'admin'} INFO: 127.0.0.1:63658 - "POST /users/log-in HTTP/1.1" 200 OK 2024-10-31 14:25:27,603 INFO sqlalchemy.engine.Engine ROLLBACK INFO: 127.0.0.1:63664 - "POST /users/email/otp HTTP/1.1" 200 OK 2024-10-31 14:26:02,514 INFO sqlalchemy.engine.Engine BEGIN (implicit) 2024-10-31 14:26:02,514 INFO sqlalchemy.engine.Engine SELECT user.id, user.username, user.password, todo_1.id AS id_1, todo_1.contents, todo_1.is_done, todo_1.user_id FROM user LEFT OUTER JOIN todo AS todo_1 ON user.id = todo_1.user_id WHERE user.username = %(username_1)s 2024-10-31 14:26:02,514 INFO sqlalchemy.engine.Engine [cached since 35.14s ago] {'username_1': 'admin'} INFO: 127.0.0.1:63671 - "POST /users/email/verify HTTP/1.1" 200 OK Sending email to admin@fastapi.com! 2024-10-31 14:26:12,519 INFO sqlalchemy.engine.Engine ROLLBACK src/database/ repository.py from typing import List, Optional from fastapi import Depends from sqlalchemy import select, delete from sqlalchemy.orm import Session from database.connection import get_db from database.orm import ToDo, User class ToDoRepository: def __init__(self, session: Session = Depends(get_db)): self.session = session def get_todos(self) -> List[ToDo]: return list(self.session.scalars(select(ToDo))) def get_todo_by_todo_id(self, todo_id: int) -> ToDo | None: return self.session.scalar(select(ToDo).where(ToDo.id == todo_id)) def create_todo(self, todo: ToDo) -> ToDo: self.session.add(instance=todo) self.session.commit() self.session.refresh(instance=todo) return todo def update_todo(self, todo: ToDo) -> ToDo: self.session.add(instance=todo) self.session.commit() self.session.refresh(instance=todo) return todo def delete_todo(self, todo_id: int) -> None: self.session.execute(delete(ToDo).where(ToDo.id == todo_id)) self.session.commit() class UserRepository: def __init__(self, session: Session = Depends(get_db)): self.session = session def get_user_by_username(self, username: str) -> User | None: return self.session.scalar(select(User).where(User.username == username)) def save_user(self, user: User) -> User: self.session.add(instance=user) self.session.commit() self.session.refresh(instance=user) return user src/service/ user.py import random import time import bcrypt from datetime import datetime, timedelta from jose import jwt class UserService: encoding: str = "UTF-8" JWT_SECRET_KEY: str = "f002393019e8776398370aa671767b860b702854724591cd0da5fc97bda3daf1" JWT_ALGORITHM: str = "HS256" def hash_password(self, plain_password: str) -> str: hashed_password: bytes = bcrypt.hashpw( plain_password.encode(self.encoding), salt=bcrypt.gensalt() ) return hashed_password.decode(self.encoding) def verify_password( self, plain_password: str, hashed_password: str ) -> bool: return bcrypt.checkpw( plain_password.encode(self.encoding), hashed_password.encode(self.encoding) ) def creat_jwt(self, username: str) -> str: return jwt.encode( { "sub": username, "exp": datetime.now() + timedelta(days=1), }, self.JWT_SECRET_KEY, algorithm=self.JWT_ALGORITHM ) def decode_jwt(self, access_token: str) -> str: payload: dict = jwt.decode( access_token, self.JWT_SECRET_KEY, algorithms=[self.JWT_ALGORITHM] ) return payload["sub"] @staticmethod def create_otp() -> int: return random.randint(1000, 9999) @staticmethod def send_email_to_user(email: str) -> None: time.sleep(10) print(f"Sending email to {email}!") src/api/ user.py from fastapi import APIRouter, Depends, HTTPException, BackgroundTasks from cache import redis_client from database.orm import User from database.repository import UserRepository from schema.request import SignUpRequest, LoginRequest, CreateOTPRequest, VerifyOTPRequest from schema.response import UserSchema, JWTResponse from security import get_access_token from service.user import UserService router = APIRouter(prefix="/users", tags=["USER"]) @router.post("/sign-up", status_code=201) def user_sign_up_handler( request: SignUpRequest, user_service: UserService = Depends(), user_repository: UserRepository = Depends(), ): hashed_password: str = user_service.hash_password( plain_password=request.password ) user: User = User.create( username=request.username, hashed_password=hashed_password ) user: User = user_repository.save_user(user) return UserSchema.from_orm(user) @router.post("/log-in", status_code=200) def user_log_in_handler( request: LoginRequest, user_service: UserService = Depends(), user_repository: UserRepository = Depends(), ): user: User | None = user_repository.get_user_by_username( username=request.username ) if not user: raise HTTPException(status_code=404, detail="User Not Found") verified: bool = user_service.verify_password( plain_password=request.password, hashed_password=user.password ) if not verified: raise HTTPException(status_code=401, detail="Not Authorized") access_token: str = user_service.creat_jwt(username=user.username) return JWTResponse(access_token=access_token) @router.post("/email/otp") def create_otp_handler( request: CreateOTPRequest, _: str = Depends(get_access_token), user_service: UserService = Depends() ): otp: int = user_service.create_otp() redis_client.set(request.email, otp) redis_client.expire(request.email, 3 * 60) return {"otp": otp} @router.post("/email/verify") def verify_otp_handler( request: VerifyOTPRequest, background_tasks: BackgroundTasks, access_token: str = Depends(get_access_token), user_service: UserService = Depends(), user_repo: UserRepository = Depends(), ): otp: str | None = redis_client.get(request.email) if not otp: raise HTTPException(status_code=400, detail="Bad Request") if request.otp != int(otp): raise HTTPException(status_code=400, detail="Bad Request") username: str = user_service.decode_jwt(access_token=access_token) user: User | None = user_repo.get_user_by_username(username) if not user: raise HTTPException(status_code=404, detail="User Not Found") background_tasks.add_task( user_service.send_email_to_user, email="admin@fastapi.com" ) return UserSchema.from_orm(user)

  • python
  • 리팩토링
  • orm
  • FastAPI
  • pytest
포팃 댓글 1 좋아요 0 조회수 244

[인프런 빅쿼리 빠짝스터디 2주차] 윈도우 함수, FRAME설정, QUALITY

미해결

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)

윈도우 탐색 함수 연습문제 (1) 연습문제 1 -- 문제 1) USER의 다음 접속월, 다다음 접속 월 SELECT user_id, visit_month, LEAD(visit_month,1) OVER(PARTITION BY user_id ORDER BY visit_month) AS next_month, LEAD(visit_month,2) OVER(PARTITION BY user_id ORDER BY visit_month) AS the_month_after_next FROM `avdanced.analytics_function_01` (2) 연습문제 2 -- 문제 2) USER의 다음 접속월, 다다음 접속 월, 이전 접속 월 SELECT user_id, visit_month, LEAD(visit_month,1) OVER(PARTITION BY user_id ORDER BY visit_month) AS next_month, LEAD(visit_month,2) OVER(PARTITION BY user_id ORDER BY visit_month) AS the_month_after_next, LAG(visit_month,1) OVER(PARTITION BY user_id ORDER BY visit_month) AS last_month FROM `avdanced.analytics_function_01` 윈도우 함수 FRAME 연습문제 연습문제 (1~4) SELECT -- 1)모든 주문량 SUM(amount) OVER() AS amount_total, -- 2)특정주문시점에서 누적주문량 #SUM(amount) OVER(partition by order_date) AS cumulative_sum, SUM(amount) OVER (ORDER BY order_date) AS cumulative_sum, -- 3)고객별 주문 시점에서 누적 주문량 #SUM(amount) OVER(partition by user_id) AS cumulative_sum_by_user, SUM(amount) OVER(partition by user_id ORDER BY order_id) AS cumulative_sum_by_user, -- 4) 최근 직전 5개 평균 주문량 AVG(amount) OVER(ROWS BETWEEN 5 PRECEDING AND 1 PRECEDING) AS last_5_orders_avg_amount, AVG(amount) OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS last_5_unbounded_orders_avg_amount, AVG(amount) OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS all_orders_avg_amount FROM `avdanced.orders` 윈도우 함수 (1) 연습문제 1 -- 연습문제1) 사용자별 쿼리 실행 횟수 WITH base AS( SELECT user, team, query_date, COUNT(*) OVER(PARTITION BY user) AS total_query_cnt, FROM `avdanced.query_logs` ) SELECT * FROM base (2) 연습문제 2 -- 연습문제2) 주차별 팀내 쿼리 실행한 수 (RANK 1만 보이도록) WITH base2 AS( SELECT EXTRACT(WEEK FROM query_date) AS week_number, team, user, COUNT(*) OVER(PARTITION BY EXTRACT(WEEK FROM query_date) ,user ORDER BY EXTRACT(WEEK FROM query_date) ) AS query_cnt, FROM `avdanced.query_logs` ORDER BY EXTRACT(WEEK FROM query_date) ) SELECT DISTINCT *, RANK() OVER(PARTITION BY team,week_number ORDER BY total_query_cnt DESC) AS team_rank FROM base2 QUALIFY team_rank = 1 ORDER BY week_number, team 강의자료의 코드 -- 2) 주차별로 팀 내에서 쿼리를 많이 실행한 수를 구한 후, 실행한 수를 활용해 랭킹을 구해주세요. 단, 랭킹이 1등인 사람만 결과가 보이도록 해주세요 -- 주차별로 개인당 실행한 쿼리 횟수 -- 위 쿼리 횟수를 기반으로 랭킹 -- 랭킹을 기반으로 필터링(랭킹=1) -- 문제의 의도 : 원본 데이터 => 1 row마다 데이터가 있고, 그걸 집계해서 사용. GROUP BY => 윈도우 함수 WITH query_cnt_by_team AS ( SELECT EXTRACT(WEEK FROM query_date) AS week_number, team, user, COUNT(user) AS query_cnt FROM advanced.query_logs GROUP BY ALL ) SELECT *, RANK() OVER(PARTITION BY week_number, team ORDER BY query_cnt DESC) AS rk FROM query_cnt_by_team -- QUALIFY : 윈도우 함수의 조건을 설정할 때 사용 QUALIFY rk = 1 ORDER BY week_number, team, query_cnt DESC COUNT의 윈도우 함수 대신에 GROUP BY를 사용하는 풀이도 있다는 것을 알게 되었다! 너무 어렵게 생각하지 말기! (3) 연습문제 3 WITH base2 AS( SELECT EXTRACT(WEEK FROM query_date) AS week_number, team, user, COUNT(*) OVER(PARTITION BY EXTRACT(WEEK FROM query_date) ,user ORDER BY EXTRACT(WEEK FROM query_date) ) AS query_cnt, FROM `avdanced.query_logs` #QUALIFY team_rank = 1 ORDER BY EXTRACT(WEEK FROM query_date) ), base3 AS( SELECT DISTINCT *, RANK() OVER(PARTITION BY team,week_number ORDER BY query_cnt DESC) AS team_rank FROM base2 QUALIFY team_rank = 1 ORDER BY week_number, team ) -- 연습문제3) 쿼리 실행 시점 1주전 쿼리 실행 SELECT DISTINCT *, LAG(query_cnt,1) OVER(PARTITION BY user ORDER BY week_number) AS prev_week_query_count FROM base2 GROUP BY ALL ORDER BY user, week_number (4) 연습문제 4 --연습문제4) SELECT *, SUM(query_count) OVER(PARTITION BY user ORDER BY query_date) AS culmulative_query_count, SUM(query_cnt) OVER(PARTITION BY user ORDER BY query_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_sum2 FROM( SELECT DISTINCT *, COUNT(user) OVER(PARTITION BY query_date, user) AS query_count, FROM `avdanced.query_logs` ) ORDER BY user,query_date QUALIFY 로 조건설정을 하여 두 값이 같은 지 비교하는 법이 인상깊었던 문제 (QUALIFY cumulative_sum != cumulative_sum2) (5) 연습문제 5 나의 풀이 WITH raw_data AS ( SELECT DATE '2024-05-01' AS date, 15 AS number_of_orders UNION ALL SELECT DATE '2024-05-02', 13 UNION ALL SELECT DATE '2024-05-03', NULL UNION ALL SELECT DATE '2024-05-04', 16 UNION ALL SELECT DATE '2024-05-05', NULL UNION ALL SELECT DATE '2024-05-06', 18 UNION ALL SELECT DATE '2024-05-07', 20 UNION ALL SELECT DATE '2024-05-08', NULL UNION ALL SELECT DATE '2024-05-09', 13 UNION ALL SELECT DATE '2024-05-10', 14 UNION ALL SELECT DATE '2024-05-11', NULL UNION ALL SELECT DATE '2024-05-12', NULL ) --연습문제 5) null에 이전 값 삽입 SELECT raw_data.date, IF(raw_data.number_of_orders IS NULL, LAG(raw_data.number_of_orders,1) OVER(ORDER BY date), raw_data.number_of_orders) FROM raw_data 강의풀이 WITH raw_data AS ( SELECT DATE '2024-05-01' AS date, 15 AS number_of_orders UNION ALL SELECT DATE '2024-05-02', 13 UNION ALL SELECT DATE '2024-05-03', NULL UNION ALL SELECT DATE '2024-05-04', 16 UNION ALL SELECT DATE '2024-05-05', NULL UNION ALL SELECT DATE '2024-05-06', 18 UNION ALL SELECT DATE '2024-05-07', 20 UNION ALL SELECT DATE '2024-05-08', NULL UNION ALL SELECT DATE '2024-05-09', 13 UNION ALL SELECT DATE '2024-05-10', 14 UNION ALL SELECT DATE '2024-05-11', NULL UNION ALL SELECT DATE '2024-05-12', NULL ), -- LAG로 직전 값 가져오면 되지 않을까? -- number_of_orders가 null이면, before_number_of_orders를 가져와라! -- 아래 쿼리는 어려운 방법 -- 그 다음 방법 : LAST VALUE를 쓰자! => 값이 없으면 NULL이 뜬다! -- FIRST_VALUE, LAST_VALUE => NULL을 포함해서 연산 -- 출제 의도 : NULL을 제외해서 연산하고 싶으면 IGNORE NULLS을 쓰면 된다! -- SELECT -- *, -- IF(number_of_orders IS NULL, before_number_of_orders, number_of_orders) AS filled_orders -- -- Number of arguments does not match for function IF. Supported signature: IF(BOOL, ANY, ANY) at [89:3] -- -- False일 때 인자를 추가하지 않아서 생긴 오류 -- FROM ( -- SELECT -- *, -- LAG(number_of_orders) OVER(ORDER BY date) AS before_number_of_orders -- FROM raw_data -- ) filled_data AS ( SELECT * EXCEPT(number_of_orders), LAST_VALUE(number_of_orders IGNORE NULLS) OVER(ORDER BY date) AS number_of_orders FROM raw_data -- Syntax error: Expected keyword DEPTH but got identifier "filled_data" at [104:6] : WITH문을 두개 작성했는데 WITH 쉼표 쓰고 구분! ) LAST_VALUE, FIRST_VALUE를 사용하는 풀이 법에 대하여 알게 됨 (6) 연습문제 6 WITH raw_data AS ( SELECT DATE '2024-05-01' AS date, 15 AS number_of_orders UNION ALL SELECT DATE '2024-05-02', 13 UNION ALL SELECT DATE '2024-05-03', NULL UNION ALL SELECT DATE '2024-05-04', 16 UNION ALL SELECT DATE '2024-05-05', NULL UNION ALL SELECT DATE '2024-05-06', 18 UNION ALL SELECT DATE '2024-05-07', 20 UNION ALL SELECT DATE '2024-05-08', NULL UNION ALL SELECT DATE '2024-05-09', 13 UNION ALL SELECT DATE '2024-05-10', 14 UNION ALL SELECT DATE '2024-05-11', NULL UNION ALL SELECT DATE '2024-05-12', NULL ), null_is_lag AS( --연습문제 5) null에 이전 값 삽입 SELECT raw_data.date, IF(raw_data.number_of_orders IS NULL, LAG(raw_data.number_of_orders,1) OVER(ORDER BY date), raw_data.number_of_orders) AS number_of_orders FROM raw_data ) -- 연습문제 6) 이동평균 SELECT *, AVG(nl.number_of_orders) OVER(ORDER BY nl.date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg FROM null_is_lag AS nl FRAME절을 사용할 때, AND를 기준으로 앞에는 뒤의 값보다 반드시 이전 행을 가리키는 구문이 와야 함! (7) 연습문제 7 -- 1. TIMESTAMP → DATETIME -- 2. SECOND_DIFF 생성 : uSER로 묶어서 - -- 3. SESSION_START생성 : USER로 묶어서 LAG(DATA,1)이 NULL이면 1, SECOND_DIFF가 20이상이면 +1 -- 4. SESSION_ID생성: SESSION_START가 1일 경우 SESSION_ID +1, NULL일 경우 LAG(DATA,1) WITH add_date AS ( -- 1. TIMESTAMP → DATETIME SELECT event_date, event_timestamp, DATETIME(TIMESTAMP_MICROS(event_timestamp)) AS event_datetime, event_name, user_id, user_pseudo_id, LAG(DATETIME(TIMESTAMP_MICROS(event_timestamp))) OVER(PARTITION BY user_pseudo_id ORDER BY event_timestamp) AS before_event_datetime FROM `avdanced.app_logs_temp` --,UNNEST(event_params) AS param -- FROM 절 안에서 UNNEST를 사용 WHERE event_date ="2022-08-18" AND user_pseudo_id = "1997494153.8491999091" ), add_diff AS ( -- 2. SECOND_DIFF 생성 : uSER로 묶어서 - SELECT *, DATE_DIFF(event_datetime, before_event_datetime,SECOND) AS second_diff, FROM add_date ), add_session AS( -- 3. SESSION_START생성 : USER로 묶어서 LAG(DATA,1)이 NULL이면 1, SECOND_DIFF가 20이상이면 +1 SELECT *, IF(second_diff IS NULL OR second_diff >=20, 1, NULL) AS session_start FROM add_diff ) -- 4. SESSION_ID생성 *, SUM(session_start) OVER(PARTITION BY user_pseudo_id ORDER BY event_datetime) AS session_num FROM add_session ORDER BY event_datetime user_id와 user_pseudo_id는 다르다. (계정이 존재하면 USER_ID, 없어도 USER_PSEUDO_ID를 통해 활동기록이 남는다.) IF문은 행 단위로 작동, SUM은 특정 파티션에 대한 누적합을 계산함으로 아래 코드가 작동하지 않음 SUM(session_start) OVER(PARTITION BY user_pseudo_id ORDER BY event_datetime) AS session_num CTE를 사용하는 것과 서브쿼리를 사용하는 방법 중 상황에 맞게 적절히 혼용할 수 있다는 것을 알게 됨!

  • sql
  • Google-Analytics
  • firebase
  • google-sheets
  • bigquery
망고맛있어 댓글 1 좋아요 0 조회수 208

3분쯤 sqld가 안뜹니다.

미해결

실습으로 손에 잡히는 SQLD(2과목)

master 옆에 NAN라고 되어있고 누르면 master하나만 있고 sqld가 없으면 제가 db를 만들어서 입력해야하는건가요?..

  • sql
  • oracle
  • mssql
  • SQLD
Tae Young 댓글 3 좋아요 0 조회수 161

==

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

~와 같다라는 식을 쓸때 =가 아닌 == 로 표기하는 이유가 있을까요?

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
shs4166 댓글 2 좋아요 0 조회수 87

판다스 다들으면 작업형 들으면 되나요?

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

판다스 강의 다듣고 작업형 들으려는데 작업형1모의문제1 부터 들으면 될까요? 강의안에서 지난시간에 작업형 첫번째 예시문제랑 기출문제를 풀어봤다고 말씀하시는데 풀어본 기억이 없어서요… 혹시 이전에 들어야하는 강의가 있을까요?

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
권종오 댓글 2 좋아요 0 조회수 150

datetime

미해결

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

/ 사용할 때와 : 사용할 때 어떻게 구분하나요?

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
shs4166 댓글 2 좋아요 0 조회수 92

groupby / 데이터프레임형태

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

pd.DataFrame 을 하기도 전인데 이렇게 표 형태로 나오는 건 왜일까요?

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
shs4166 댓글 1 좋아요 0 조회수 83

데이터확인

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

어떨 때는 그냥 df로 데이터를 확인하고 어떨 때는 df.head()로 확인을 하는데 무슨 차이인가요?

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
shs4166 댓글 2 좋아요 0 조회수 90

3-2 작업 2유형 EDA 자료를 어디서 불러오나요?

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

제가 인강은 처음이라 어디서 자료를 불러와야 하는지 모르겠습니다..

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
김치현 댓글 2 좋아요 0 조회수 123

테슬라_KR.txt / 리비안_KR.txt 파일이 첨부파일에 없습니다.

미해결

RAG 마스터: 기초부터 고급기법까지 (feat. LangChain)

테슬라_KR.txt / 리비안_KR.txt 파일이 첨부파일에 없어요.. 첨부파일 중 pdf 폴더도 비어있습니다..

  • python
  • 챗봇
  • llm
  • langchain
  • rag
정성범 댓글 2 좋아요 1 조회수 248

[인프런 빅쿼리 빠짝스터디 2주차] 윈도우함수 활용 방법과 null을 다루는 법

미해결

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)

[1~2번]윈도우 함수(탐색 함수) 연습 문제 1번 select *, lead(visit_month, 1) over(partition by user_id order by visit_month) as next_visit_month, lead(visit_month, 2) over(partition by user_id order by visit_month) as two_next_visit_month from `advanced.analytics_function_01 2번 select *, lead(visit_month, 1) over(partition by user_id order by visit_month) as next_visit_month, lead(visit_month, 2) over(partition by user_id order by visit_month) as two_next_visit_month, lag(visit_month, 1) over(partition by user_id order by visit_month) as before_visit_month from `advanced.analytics_function_01` [1~4번] 윈도우 함수 Frame 연습 문제 1번 /* 전체 계산 할 때 왜 over()를 써야 하는지 몰랐습니다. 그러나 일반 집계 함수의 방식과 비교해보니, 사용 이유를 알게 됐습니다. 집계함수를 사용할 때 over()를 사용했다는 건 '윈도우 함수가 적용된 결과값(각 행마다 결과 값이 반환 되는 것)으로 보겠다'는 의미인 걸 알게 됐습니다. 같은 집계함수를 사용하더라도 '어떤 방식(결과를 1개 행으로만 받아볼지, 여러개 값으로 받아볼지)으로 결과 값을 받아 볼 지' 생각해 봐야 한다는 걸 알았습니다. */ select *, sum(amount) over() as amount_total from `advanced.orders` 2번 /* 처음에는 누적합을 구하는 건데 왜 over() 안에 order by를 써야하는지 이해하지 못했습니다. 그러나 누적합도 "어떤 방식으로 계산할지 '계산 방식'"을 지정해 줘야 한다는 걸 알게 됐습니다. /* select *, sum(amount) over(order by order_id) as cumulative_sum from `advanced.orders` 3번 select *, sum(amount) over(partition by user_id order by order_id) as cumulative_sum_by_user from `advanced.orders` 4번 /* over() 안에 사용하는 order by와 over() 밖에서 사용하는 order by를 명확히 이해했습니다. 윈도우 함수에서 사용하는 order by는 '계산 순서'를 정하는 것이고, 윈도우 함수 밖에서 사용한 order by는 '눈에 보이는 정렬'을 컨트롤 한다는 걸 이해했습니다. 이해할 때 '쿼리 작동 순서'를 생각했더니, 큰 도움이 됐습니다. */ select *, avg(amount) over(order by order_id rows between 5 preceding and 1 preceding) as last_5_orders_avg_amount from `advanced.orders` order by order_id [1~7번] 윈도우 함수 연습 문제 1번 select *, count(user) over(partition by user) as total_query_cnt from `advanced.query_logs` order by query_date 2번 /* - date 형식 데이터를 extract()로 주 형식으로 바꾸는 걸 알게 됐습니다 - partition by 내에 2개 이상 컬럼을 넣어도 된다는 걸 알게 됐습니다. */ with user_query_cnt as ( select extract(week from query_date) as week_number, team, user, count(user) as query_cnt from `advanced.query_logs` group by all ) select *, rank() over(partition by week_number, team order by query_cnt desc) as team_rank from user_query_cnt qualify team_rank = 1 order by 1,2 3번 /* - lag()와 함께 쓰는 over() 사용법이 헷갈렸는데, 실행 후 수정하는 방향으로 쿼리를 작성해 보라고 하신 점이 인상 깊게 와닿았습니다. */ with base as ( select user, team, extract(week FROM query_date) as week_number, count(user) as query_count from advanced.query_logs group by all ) select *, lag(query_count, 1) over(partition by user order by week_number) as pre_query_cnt from base 4번 /* qualify cumulative_query_cnt != cumulative_query_cnt2 위 쿼리로 정합성을 체크하는 방식을 배우게 됐습니다. */ ## 4번 with query_cnt as ( select *, count(user) as query_count from advanced.query_logs group by all ) select *, sum(query_count) over(partition by user order by query_date) as cumulative_query_cnt, sum(query_count) over(partition by user order by query_date rows between unbounded preceding and current row) as cumulative_query_cnt2 from query_cnt -- qualify cumulative_query_cnt != cumulative_query_cnt2 5번 /* - 4번에서 배운 정합성 체크하는 쿼리를 이용해서 컬럼 내 값이 있는지 테스트 해봤습니다. */ ## 정합성 테스트 -- select -- * -- from ( -- select -- *, -- last_value(number_of_orders) over(order by date) as last_values_order -- from raw_data -- ) as test1 -- where -- number_of_orders != last_values_order select *, last_value(number_of_orders ignore nulls) over(order by date) as last_values_order from raw_data 6번 /* 처음에는 1. 평균을 구하고 2. 해당 테이블을 서브쿼리로 두고, lag(컬럼, 2)를 해야 하는줄 알았습니다. 그러나 Frame 사용 방법이 생각났고, 조건에 맞게 범위를 설정해서 문제를 해결했습니다. */ ## 6번 , base2 as ( select *, last_value(number_of_orders ignore nulls) over(order by date) as last_values_order, from raw_data ) select *, avg(last_values_order) over(order by date rows between 2 preceding and current row) as moving_avg from base2 7번 /* - 타임스탬프 데이터를 다루는 다양한 방법을 알게 됐습니다. - 실무에서는 세션 기준과 보고 싶은 유저 혹은 이벤트를 지정해서 사용해도 된다는 걸 알게 됐습니다. */ with base as ( select event_date, event_timestamp, datetime(timestamp_micros(event_timestamp), 'Asia/Seoul') as event_datetime, event_name, user_id, user_pseudo_id from `advanced.app_logs` where event_date = '2022-08-18' and user_pseudo_id = '1997494153.8491999091' ) select *, sum(session_start) over(order by event_datetime) as session_id from ( select *, case when second_diff >= 20 then 1 when second_diff is null then 1 else 0 end session_start from ( select *, timestamp_diff(event_datetime, before_event_datetime, second) as second_diff from ( select *, lag(event_datetime, 1) over(partition by user_pseudo_id order by event_datetime) as before_event_datetime from base ) as base2 ) as base3 ) as base4

  • sql
  • bigquery
  • 인프런
  • 빠짝스터디
  • 빅쿼리
레스 댓글 1 좋아요 0 조회수 163

[빠짝스터디 2주차 과제] 윈도우 함수 연습 문제

미해결

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)

윈도우 함수 (탐색 함수) 연습 문제 1번 SELECT user_id, visit_month, lead(visit_month, 1) OVER(PARTITION BY user_id ORDER BY visit_month) AS next_1month, lead(visit_month, 2) OVER(PARTITION BY user_id ORDER BY visit_month) AS next_2month, FROM advanced.analytics_function_01 ORDER BY 1,2; 2번 SELECT user_id, visit_month, lead(visit_month, 1) OVER(PARTITION BY user_id ORDER BY visit_month) AS next_1month, lead(visit_month, 2) OVER(PARTITION BY user_id ORDER BY visit_month) AS next_2month, lag(visit_month, 1) OVER(PARTITION BY user_id ORDER BY visit_month) AS pre_1month FROM advanced.analytics_function_01 ORDER BY 1,2; 윈도우 함수 연습 문제 1번 SELECT user, team, query_date, count(user) over(PARTITION BY user) AS total_query_cnt FROM advanced.query_logs ORDER BY query_date, user 2번 WITH base AS ( SELECT EXTRACT(week FROM query_date) AS week_number, team, user, count(user) AS query_cnt FROM advanced.query_logs GROUP BY 1,2,3 ) SELECT *, rank() OVER(PARTITION BY week_number, team ORDER BY query_cnt desc) AS team_rank FROM base QUALIFY team_rank = 1 ORDER BY week_number, query_cnt desc; 3번 WITH base AS ( SELECT EXTRACT(week FROM query_date) AS week_number, team, user, count(user) AS query_cnt FROM advanced.query_logs GROUP BY 1,2,3 ) SELECT *, lag(query_cnt) OVER(PARTITION BY team, user ORDER BY week_number asc) AS prev_week_query_cnt FROM base ORDER BY team, user, week_number; 4번 WITH base AS ( SELECT user, team, query_date, COUNT(user) as query_count FROM advanced.query_logs GROUP BY 1,2,3 ) SELECT user, team, query_date, query_count, SUM(query_count) OVER(PARTITION BY team, user ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_query_count FROM base ORDER BY team, user, query_date; 5번 WITH raw_data AS( SELECT DATE'2024-05-01'AS date,15 AS number_of_orders UNION ALL SELECT DATE'2024-05-02',13 UNION ALL SELECT DATE'2024-05-03',NULL UNION ALL SELECT DATE'2024-05-04',16 UNION ALL SELECT DATE'2024-05-05',NULL UNION ALL SELECT DATE'2024-05-06',18 UNION ALL SELECT DATE'2024-05-07',20 UNION ALL SELECT DATE'2024-05-08',NULL UNION ALL SELECT DATE'2024-05-09',13 UNION ALL SELECT DATE'2024-05-10',14 UNION ALL SELECT DATE'2024-05-11',NULL UNION ALL SELECT DATE'2024-05-12',NULL ) SELECT date, IF(number_of_orders is null , last_value(number_of_orders IGNORE NULLS) OVER(ORDER BY date asc), number_of_orders) AS number_of_orders_not_null FROM raw_data; 6번 WITH raw_data AS( SELECT DATE'2024-05-01'AS date,15 AS number_of_orders UNION ALL SELECT DATE'2024-05-02',13 UNION ALL SELECT DATE'2024-05-03',NULL UNION ALL SELECT DATE'2024-05-04',16 UNION ALL SELECT DATE'2024-05-05',NULL UNION ALL SELECT DATE'2024-05-06',18 UNION ALL SELECT DATE'2024-05-07',20 UNION ALL SELECT DATE'2024-05-08',NULL UNION ALL SELECT DATE'2024-05-09',13 UNION ALL SELECT DATE'2024-05-10',14 UNION ALL SELECT DATE'2024-05-11',NULL UNION ALL SELECT DATE'2024-05-12',NULL ), fill_null AS ( SELECT date, IF(number_of_orders is null , last_value(number_of_orders IGNORE NULLS) OVER(ORDER BY date asc), number_of_orders) AS number_of_orders_not_null FROM raw_data ) SELECT date, number_of_orders_not_null, avg(number_of_orders_not_null) OVER(ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg FROM fill_null; 7번 WITH base AS ( SELECT event_date, event_timestamp, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime, event_name, user_id, user_pseudo_id FROM advanced.app_logs WHERE event_date = '2022-08-18' ), diff_date AS ( SELECT *, DATETIME_DIFF(event_datetime, pre_event_time, second) AS date_diff_sec FROM ( SELECT *, LAG(event_datetime, 1) OVER(PARTITION BY user_pseudo_id ORDER BY event_datetime asc) AS pre_event_time FROM base ) ), session_start AS ( SELECT *, CASE WHEN pre_event_time IS NULL THEN 1 WHEN date_diff_sec >= 20 THEN 1 END AS start_session FROM diff_date ) SELECT event_date, event_datetime, event_name, user_id, user_pseudo_id, date_diff_sec, SUM(start_session) OVER(PARTITION BY user_pseudo_id ORDER BY event_datetime) AS session_id FROM session_start ORDER BY user_pseudo_id, event_datetime;

  • sql
  • Google-Analytics
  • firebase
  • google-sheets
  • bigquery
이재헌 댓글 1 좋아요 0 조회수 129

주석처리 질문

미해결

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

원래 주석처리 된거 드래그 후 ctrl + / 를 해도 주석변경이 안되고 계속 / 기호가 나와요. 항상 그러는게 아니라 어떨때는 되고 어떨때는 안되는데 혹시 이유가 있을까요?

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
박건우 댓글 3 좋아요 0 조회수 322

[성공 경험] hwp 문서 내에 파일명 타이핑하고 저장하기

해결됨

직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피

이건 질문 아닙니다. ^^ 구현하고 싶은 간단한 내용이 있었는데, 강의에서 배운 내용을 기반으로 하고, A.I.에 질문하여 코드를 작성한 후 정상 작동에 성공했습니다. 저 같은 왕초보도 작동하는 뭔가를 만들어 내게 하는 이 강의는 정말 훌륭합니다~! 아주 기초적이고 작은 성공이라도 동기부여를 위해 소중합니다. ^^ # ■ 아래 코드의 용도 --- 작동 성공했음 _24-10-30 11:26 # "C:\\Users\\user\\Desktop\\제목 추가\\"에 여러 개의 hwp 파일들이 있을 때 # 파일을 하나씩 열고, 문서의 맨 처음으로 이동하여 파일명(~~~.hwp)을 타이핑하고 엔터를 3번 친 후 저장하고 닫기 import win32com.client as win32 hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject") hwp.XHwpWindows.Item(0).Visible = True hwp.RegisterModule("FilePathCheckDLL","FilePathCheckerModule") import os from time import sleep os.chdir("C:\\Users\\user\\Desktop\\제목 추가\\") # r"C:\Users\user\Desktop\\제목 추가\\"로도 작동 성공함 for i in os.listdir(): hwp.Open(os.path.join(os.getcwd(), i)) sleep(0.2) # 문서 객체 가져오기 --- 일코 doc = hwp.XHwpDocuments.Item(0) # 전체 경로에서 파일명 추출 --- 일코, GPT full_path = doc.FullName file_name = os.path.basename(full_path) # 커서를 원하는 위치로 이동 (예: 문서 맨 처음) --- GPT hwp.HAction.Run("MoveTopLevelBegin") # 파일명 입력 (타이핑) --- GPT hwp.HAction.GetDefault("InsertText", hwp.HParameterSet.HInsertText.HSet) hwp.HParameterSet.HInsertText.Text = file_name hwp.HAction.Execute("InsertText", hwp.HParameterSet.HInsertText.HSet) # 엔터를 3번 치기 --- GPT for _ in range(3): hwp.HAction.Run("BreakPara") hwp.Save() hwp.Clear(1)

  • python
  • 한컴오피스
  • 레벨업
learner 댓글 0 좋아요 2 조회수 228

[18]에서 level을 5에서 6으로 변경한 것 아닌가요?

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! 질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요 먼저 유사한 질문이 있었는지 검색해보세요. [18]에서 level을 5에서 6으로 변경한 것 아닌가요? 결과가 5가 나오는 이유를 모르겠습니다.

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
강민균 댓글 1 좋아요 0 조회수 87

[17] 질문입니다.

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! 질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요 먼저 유사한 질문이 있었는지 검색해보세요. [17]에서 1) dict변수와 di가 같은 변수인가요? 갑자기 변한 설명이 없어서요. 2) di['name']을 실행하면 왜sam이 나오는지. sam은 무슨 의미인지 모르겠습니다.

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
강민균 댓글 2 좋아요 0 조회수 72

df.loc "" or ''

미해결

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

df.loc[:"가격"] df.loc[2, '메뉴':'가격'] 큰따옴표, 작은 따옴표 사용 기준이 헷갈립니다

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
shs4166 댓글 1 좋아요 0 조회수 70

인기 태그

인프런 TOP Writers

주간 인기글