DB 공부하기
230213_DB공부내용
보랏
2023. 2. 13. 22:58
안녕하세요.
저는 오늘부터 120일 동안 국비교육으로 진행하는 DevOps교육을 받기 시작했습니다.
앞으로 평일에는 수업에서 배운 내용을 정리하고자 블로그에 배운 내용을 올리려고 합니다.
평일에는 공부한 내용 정리를 주말에는 배운 내용을 바탕으로 더욱 양질의 던파DB 자료를 올리도록 하겠습니다.
1. 크롤링
- 1번째 수업으로는 Python을 배웠는데요. 처음으로 강사님께서 파이썬 크롤링을 통해 네이버 주식현황을 보여주셨습니다. requests와 pandas를 활용해 5줄로 간략하게 만드셨습니다.
- 제가 던담에서 크롤링을 했을 때는 Selenium, Beautifulsoup을 활용하여 여러번 코딩을 걸쳤지만 이렇게 간단하게도 표현할 수 있음에 놀라웠습니다.
- pd.concat(데이터 프레임 1, 데이터 프레임 2) : 데이터 프레임을 세로로 합치기 (맨 뒤에 axis = 1 을 추가해주면 가로로 결합)
- url = https://~~~ page={} : df구문에 반복문을 사용하여 format(x)으로 1~5범위안에 정보를 크롤링하였습니다.
import requests
import pandas as pd
url = "https://finance.naver.com/item/sise_day.naver?code=005930&page={}"
head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"}
df=pd.concat([pd.read_html(requests.get(url.format(x), headers=head).text)[0].dropna() for x in range(1,5)])
df
2. 자료형
- int : 정수
- float : 실수
- str : 문자열
- append : 리스트 맨 뒤에 자료 추가
3. 문자열 인덱싱
c = "동해물과 백두산이"
c[::2] # "동물 두이"
c[::-1] # "이산두백 과물해동" #역순
4. 반복문&format
- 앞선 조건문에서 조건 충족 시 다음 조건은 성립이 안됩니다.
for name in class_a :
if name == "보랏" :
print("{}님입니다".format(name)) # "보랏님입니다"
elif name == "보랏" :
print("{}인가요?".format(name)) # 출력 x
# 앞서 조건문에서 충족 시 뒤 조건은 성립이 안됨
5. 스타벅스 크롤링
- 스타벅스 서울 내 지점 개수, 지점명에 R & DT가 붙은 지점, 오픈날짜에 따른 지점 개수를 구하는 코딩을 하였습니다. 서울 내 지점개수, R&DT가 붙은 지점은 쉽게 코딩하였지만 오픈날짜에 따른 지점 개수는 딕셔너리 형태로 구현해야 하여 어렵고 잘 이해가 안가는 부분이 있어 옆자리 잘하시는 분께 도움을 구했었습니다.
- 강사님께서 스타벅스 홈페이지 내 자료를 Json파일로 가져오셔서 크롤링을 하셔서 Json파일 소스(payload)를 어떻게 가져왔는지 여쭈어봤는데 다음 시간에 알려주신다 하여 해당 부분은 다음 블로그에서 같이 작성하도록 하겠습니다.
import requests
url = "https://www.starbucks.co.kr/store/getStore.do?r=GKYHQKU7D3"
payload = {"in_biz_cds" : "0",
"in_scodes" : "0",
"ins_lat" : "37.566535",
"ins_lng" : "126.9779692",
"search_text" : "",
"p_sido_cd" : "01",
"p_gugun_cd" : "",
"in_distance" : "0",
"in_biz_cd" : "",
"isError" : "true",
"searchType" : "C",
"set_date" : "",
"all_store" : "0",
"T03" : "0",
"T01" : "0",
"T27" : "0",
"T12" : "0",
"T09" : "0",
"T30" : "0",
"T05" : "0",
"T22" : "0",
"T21" : "0",
"T10" : "0",
"T36" : "0",
"T43" : "0",
"T48" : "0",
"P10" : "0",
"P50" : "0",
"P20" : "0",
"P60" : "0",
"P30" : "0",
"P70" : "0",
"P40" : "0",
"P80" : "0",
"whcroad_yn" : "0",
"P90" : "0",
"new_bool" : "0",
"iend" : "1000",
"rndCod" : "IZVHHSIFWC",}
r = requests.post(url, data=payload)
star = r.json()['list']
5-1. 스타벅스 서울지점 개수
- 스타벅스 서울지점개수는 star변수를 len으로 숫자변환하여 for 반복문을 하고서 value_list에 추가하는 방법을 사용하였습니다.
- print 혹은 다른 방안으로 바로 출력하는 방법도 있지만 저는 계속 list를 활용하여 자료를 봐왔어가지고, 이 방법이 더 편하더라고요.
value_list = []
for i in range(0, len(star)) :
value_list.append(star[i]['s_name'])
len(value_list)
5-2. 스타벅스 R로 끝나는 지점 개수
- 해당 방법도 똑같은 방법으로 문자열이 들어간 리스트인 value_list에서 맨뒤가 "R"인 자료를 찾는 것이기 때문에 인덱스[-1]을 주고 R_list에 추가하는 방법을 사용하였습니다.
R_list = []
for i in value_list :
if i[-1] == "R" :
R_list.append(i)
len(R_list)
5-3. 스타벅스 DT로 끝나는 지점 개수
- 이 부분은 강사님과 같이 진행한 방법으로 cnt_2 = 0 이라는 변수를 맨 앞에 코딩 후 cnt_2 += 1 을 사용하여 바로 print하는 방법을 사용하셨습니다.
- 이 방법이 개수를 세기에 더 정확한 방법인 거 같아 다음에도 이러한 비슷한 문제가 나오면 해당 방법을 먼저 써보려고 합니다.
cnt_2 = 0
for store in star:
if store['s_name'][-2:] == "DT":
cnt_2 += 1
print(store['s_name'])
5-4. 서울자치구별 스타벅스 개수
- 이 방법은 딕셔너리를 활용한 방법으로 dict_b = {} 라는 빈 딕셔너리를 제시 후 for 변수를 조건문에 변수로 변환하여 if 조건문을 활용하였습니다.
- 1. star 내 Json파일로 되있는 Key값이 'gugun_name'을 for 문 변수로 선택
- 2. 다음 조건문에서 dict_b인 빈 딕셔너리 내 파일이 있으면 1개 추가, 없으면 1로 지정
- 3. Key값 'gugun_name'의 개수를 1개씩 추가
- 4. items()로 Key와 Value의 쌍을 튜플로 묶은 값을 lambda를 통해 정렬하였습니다.
dict_b = {}
for store in star :
gu = store['gugun_name'] #반복문 변수를 조건문 변수로 대입
if gu in dict_b :
dict_b[gu] += 1
else :
dict_b[gu] = 1
sorted(dict_b.items(), key = lambda x : x[:-1])
5.5 오픈일자 요일별 스타벅스 지점 개수
- 이 문제가 오늘 제일 어려웠었는데요. 지금도 보면서 이해중이려고 합니다.
- 1. master는 범위가 key값의 범위가 0~6, Value의 값이 0이 7개인 딕셔너리 (zip : 자료형의 개수가 같은 리스트를 묶어주는 함수)
- 2. date_ : datetime.datetime.strptime을 통해 star 내 'open_dt'를 '%Y%m%d'형태 날짜열 자료로 변환
- 3. str_date : 날짜열 자료로 변환한 date_를 요일별로 나타내도록 함(이 때 요일은 0~6으로 변환)
- 4. 조건문을 통해 요일별로 master내 'key'값에 str_date가 있으면 1을 추가 (다시보니까 else : 문은 필요가 없네요)
import datetime
master = dict(zip(range(0,7), [0,0,0,0,0,0,0]))
for store in star :
date_ = datetime.datetime.strptime(store['open_dt'], '%Y%m%d')
str_date = date_.weekday()
if str_date in master :
master[str_date] += 1
else :
master[str_date] = 1
master #{0: 47, 1: 126, 2: 118, 3: 163, 4: 137, 5: 6, 6: 2}
이상 1일차 배운 내용이었습니다.
8시간동안 배운내용이라 짧으면서 많은거 같네요.
내일도 배운 내용을 복습하러 오겠습니다.
감사합니다.