python 9

크롤링 데이터 전처리(naver)

지난 포스팅에서 네이버 스포츠 -> 야구 -> 일정/결과 -> 일자별 경기결과 진입까지 완료했었다. 이번 포스팅은 일자별 경기결과 데이터를 크롤링하여 전처리 후 DB에 적재하는 과정을 다뤄보고자 한다. 크롤링을 하면서 가장 먼저 작업한 것은 크롤링 페이지에 내가 원하는 정보가 있는지와 어느 부분을 가져와야하는지 였다. 분석 화면에 나와있는 데이터는 위 사진과 같았고 데이터는 적당히 있는 것 같았으나 문제가 2개 있었다. 1. '타석' 컬럼이 없다. '타석'컬럼은 규정타석을 계산하기위해 필요한 지표이다. 만약 이 데이터가 없다면 A선수 : 10타석 9타수 5안타, B선수 : 1타석 1타수 1안타 두명의 선수 중 주간 타율 TOP 10을 계산할 때 B선수가 더 높은 순위에 랭크되게 된다. 물론 타율은 B선수..

Data 2023.07.11

Docker 환경에서 크롤링하기(동적 웹)

프로야구 데이터 시각화 프로젝트를 진행하면서, statiz.co.kr 웹 페이지의 박스스코어 데이터를 크롤링했었다. 그런데 데이터 무결성 검사를 해보니 대략 10%의 데이터가 비어있는것을 확인했다. 원인 분석을 위해 일단 크롤링 DAG부터 확인했는데 정상적으로 작동하고 있었고, 매일매일 데이터가 적재되고있었다. 비어있는 데이터를 추적해보니 경기 진행일 전체의 데이터가 아니라 경기하나의 데이터만 빠져있는 것을 확인했고, 실제 웹 페이지에서도 확인해보니 박스 스코어 데이터가 비어있었다.. 사실 저번달에도 이런 경우를 확인했는데 월 마감이 될때마다 데이터가 들어오는걸 확인하고 월 재적재 DAG를 만들어 놨었는데 아예 개막전 경기부터 비어있었다니 정말 충격적이었다.. 어쩔 수 없이 데이터 크롤링하는 웹을 바꾸기..

Docker 2023.06.30

왜 Python에서 일반 코드보다 함수로 동작하는 코드가 더 빠를까?

탐구 원인 코딩테스트 문제를 풀다보면 내가 작성한 코드의 시간복잡도를 고려하며 코드를 작성하게되는데 16234번: 인구 이동 N×N크기의 땅이 있고, 땅은 1×1개의 칸으로 나누어져 있다. 각각의 땅에는 나라가 하나씩 존재하며, r행 c열에 있는 나라에는 A[r][c]명이 살고 있다. 인접한 나라 사이에는 국경선이 존재한다. 모 www.acmicpc.net 이 문제를 풀던 중 같은 로직을 가졌지만 함수를 사용했느냐 사용하지 않았느냐로 통과 여부가 바뀌는 것을 확인했다. 정확한 이유를 몰랐던 것과 로직을 엄청 수정해가며 사용한 시간이 아까워 원리를 찾아보기로 했다. 차이점 Why does Python code run faster in a function? def main(): for i in xrange(..

Python 2023.05.23

일자별 데이터를 주별 데이터로 변환하기

이번 포스팅은 일자별로 적재된 타자, 투수 데이터를 주별 최우수 선수를 가려내기 위한 주별 데이터로 변환해보려고한다. 주별 집계를 하기전 필요한 지표부터 추려봤다. 타자의 경우는 타석, 타수, 득점, 안타, 홈런, 타점, 볼넷, 데드볼, 삼진, 땅볼아웃, 병살타, 타율 등등의 기록을 주차별로 집계할것이고 투수의 경우는 그날의 등판 기록 (ex. 승,패,홀,세) , 이닝, 상대한 타자 수 , 피안타, 실점, 자책점, 볼넷, 데드볼, 삼진 피홈런의 기록을 집계할것이다. 우선 타자, 투수 데이터를 불러와보자 conn = pymysql.connect(host = host, user = user, passwd=passwd, db = db, charset='utf8', port = port,cursorclass=p..

Data 2023.05.12

크롤링 데이터 전처리 (2)

지난 포스팅에서는 크롤링한 데이터를 전처리하여 타자, 투수테이블을 구성했다. 이번 포스팅은 적재된 데이터를 바탕으로 player 정보가 담긴 테이블을 만들어보려고한다. 방법은 sql자체에서 필요컬럼과 중복제거를 하는 방식과 전체 데이터를 가져온 후 데이터프레임에서 전처리하는 방식중 전체 데이터를 가져온 후 데이터 프레임으로 전처리하는 과정으로 진행하려고한다. player 테이블은 다음과 같이 구성했다. create table if not exists player_info( player_id INT auto_increment not null , player_name varchar(10) not null, player_birth DATE, primary Key (player_id) ) 선수 고유의 id값과 ..

Data 2023.05.03

크롤링 데이터 전처리 (1)

이번 포스팅은 statiz에서 크롤링해서 가져온 데이터를 전처리해보려고한다. 크롤링은 urllib.request 모듈을 사용해서 진행했다. selenium을 사용하지 않는 이유는 아래 포스팅에 있다! 2023.04.16 - [Docker] - Docker 환경에서 크롤링하기 Docker 환경에서 크롤링하기 야구 데이터를 지속적으로 얻기 위해서 http://www.statiz.co.kr/main.php 사이트에서 경기 정보를 크롤링하여 데이터를 적재하는 DAG를 작성하는과정중 예상치 못한 문제가 발생했다. 크롤링을 제대로 developer-trainee-j.tistory.com 크롤링을 하기 위해서는 내가 원하는 데이터가 있는 url주로를 알아야한다. 일자별 데이터가 필요했고, 일일 기록이 있는 페이지는 ..

Data 2023.04.25

Airflow와 DB 연결하기

이번 포스팅은 Airflow DAG에서 MariaDB를 연결하여 DB에 있는 데이터들을 출력해보려 한다. Airflow 자체 기능으로 Connection 메뉴가 있지만 그냥 파이썬 코드에서 DB를 연결시켜보려한다. 우선 DB를 설치해야했는데 Docker위에 MariaDB 컨테이너를 생성하기와 그냥 로컬환경에 DB 설치하기 두가지 방식이 있었다. 처음에는 Docker위에 컨테이너를 올리는 방식으로 하려고 했는데 외부접속 세팅이나 Docker 네트워크 세팅을 하는 것 보다 그냥 로컬에 설치하는게 더 빠를 것 같아서 로컬에 설치했다. 그 다음 연결에 필요한 모듈을 불러온다. import pymysql 이제 pymysql 커넥션을 만들면되는데 한가지 문제가 생겼다. conn = pymysql.connect(ho..

Airflow 2023.04.17

Docker 환경에서 크롤링하기

야구 데이터를 지속적으로 얻기 위해서 http://www.statiz.co.kr/main.php 사이트에서 경기 정보를 크롤링하여 데이터를 적재하는 DAG를 작성하는과정중 예상치 못한 문제가 발생했다. 크롤링을 제대로 해본적이 없어서 이것 저것 찾아가면서 찾은 방법중 하나는 selenium 모듈을 이용한 방식이었다. 모듈을 import 한 뒤 크롬 웹드라이버를 이용해서 크롤링 샘플 코드를 작성했고 정상적으로 작동했다. from bs4 import BeautifulSoup import pandas as pd from selenium import webdriver import re from selenium.webdriver.common.by import By from datetime import dateti..

Docker 2023.04.16

Airflow Sample DAG 생성하기

이번 포스팅은 지난 포스팅에서 띄운 Airflow에 Hello World를 출력하는 sample DAG를 생성해보려고 한다. Airflow DAG는 파이썬 기반으로 작성되기 때문에 기존에 파이썬을 사용하는 사람이라면 큰 어려움은 없을 것 같다. 일단 docker-compose.yaml로 Airflow를 띄우게 되면 자동적으로 dags, logs, plugins 폴더가 생성된다. dags 폴더 Airflow에서 실행될 파이썬 파일들이 담겨있어야하는 공간이다. Airflow는 주기적으로 dags를 폴더를 스캔하며 해당 폴더에 있는 DAG를 읽어 Web UI에 표시한다. dags폴더의 경로는 고정이 아닌 수정이 가능하며 수정은 docker-compose.yaml 상단에 있는 volumes에서 가능하다 . lo..

Airflow 2023.04.14