1. 결측값 처리
2. BeautifulSoup
3. Selenium
결측값 처리
1. 결측값 조회
isnull() | 결측값인 경우 True, 정상값은 False |
notnull() | 결측값인 경우 False |
isnull().sum(axis=0) | 컬럼별 결측값의 개수. 디폴트 |
isnull().sum(axis=1) | 행별 결측값의 개수 |
df.notnull().sum() | 컬럼별 결측값이 아닌 값의 수 |
notnull().sum(axis=1) | 행별 결측값이 아닌 값의 수 |
value_counts(dropna=False) | 결측값을 포함하여 값 별 수 |
2. 결측값 제거 (컬럼, 행)
- dropna( axis = 1, thresh=500)
- dropna( axis = 0, subset = 'age', how = 'any')
df.dropna(axis = 1,thresh=500)
# thresh=500 : 결측값의 개수가 500개 이상인 컬럼 제거
df.dropna(axis = 0, subset = 'age', how = 'any')
# subset = 'age' : 기준 컬럼. 여러 컬럼 가능[col1, col2,...]
# how = 'any' / 'all' : 한 개만 결측값 / 모든값이 결측값
3. 결측값 치환
- fillna()
- 이전/ 이후 행 값으로 치환 : method 옵션
df['embarked'].fillna(method = 'ffill', inplace=True)
# method = ffill 직전 행 값
# method = bfill 직후 행 값
4. 중복 데이터 처리
- duplicated()
- 중복데이터 True / False 리턴 (row 전체 기준)
- 중복된 두번째 부터 True 리턴 (첫번째는 무조건 False)
- drop_duplicates()
- 중복되는 row 제거
BeautifulSoup
: html, xml 태그 분석 모듈
url = 'https://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp'
res = req.urlopen(url)
soup = BeautifulSoup(res,'html.parser')
title = soup.find('title').string
wf = soup.find('wf').string
'''
CDATA Section : 순수 문자열 영역. xml로 파싱되지 않는 영역
<!C[DATA [ .... ]]>
'''
- 인터넷에서 수신된 내용을 forecast.xml 파일로 저장하기
import os.path # 파일 접근을 위한 패쓰
# os.path.exists(파일명) : 파일이 존재하니?
if not os.path.exists('data/forecast.xml') :
# urlretrieve :인터넷을 통해 전달 받은 데이터를 파일로 저장
req.urlretrieve(url,'data/forecast.xml')
- forecast.xml 파일을 읽어서 BeauticulSoup 으로 조회하
fp = open('data/forecast.xml')
soup = BeautifulSoup(fp, 'html.parser')
# select_one (=find) : 태그 한개만 선택
# rss pubDate : rss 태그의 하위 태그 중 pubDate 태그 선택
pubdata = soup.select_one('rss pubDate').string
pubdata
# location 태그들의 하위 태그 중 한개의 city, wf 태그의 내용 출력
# select (=findall) : 태그들. 배열로 리턴
for location in soup.select('location') : # location 태그 전부 목록
city = location.select_one('city').string # city태그 값
wf = location.select_one('wf').string
tmn = location.select_one('tmn').string
tmx = location.select_one('tmx').string
print(city,wf,tmn,tmx)
selenium
: 브라우저를 직접 제어, 데이터 수집
- 네이버 로그인하기
driver = webdriver.Edge("C:/Users/haeoreum/Documents/edgedriver/msedgedriver.exe")
driver.get('https://nid.naver.com') #로그인화면
id = input("네이버 아이디를 입력하세요:")
driver.execute_script("document.getElementsByName('id')[0].value='"+id+"'")
pw = input("네이버 비밀번호를 입력하세요 : ")
time.sleep(1)
driver.execute_script\
("document.getElementsByName('pw')[0].value='"+pw+"'")
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="log.login"]').click()
driver.close()
- 이미지 검색 후 다운받아 저장하기
driver = webdriver.Edge("C:/Users/haeoreum/Documents/edgedriver/msedgedriver.exe")
driver.get('https://search.daum.net/search?nil_suggest=btn&w=img&DA=SBC&q=%EB%A6%AC%EC%8B%9C%EC%95%88%EC%85%94%EC%8A%A4')
time.sleep(3)
images = driver.find_elements('css selector','div.image_main img')
img_url= []
for image in images :
url = image.get_attribute('src') #img 태그의 src 속성의 값 가져외기
# startswith('http') : url 문자열이 http문자로 시작해?
if url.startswith('http') : # url : 이미지가 저장된 url데이터
img_url.append(url)
driver.quit()
img_folder = './img'
if not os.path.isdir(img_folder) : # os.path.isdir(파일) : 파일이 폴더니?
os.mkdir(img_folder) # 폴더 생성
# enumerate(img_url) : 요소의 순번, img_url 요소
for index,link in enumerate(img_url) :
# index : 요소의 번호, 위치값
# link : 이미지가 저장된 url데이터
req.urlretrieve(link, f'./img/{index}.jpg') # 다운로드
'환경, 에너지' 카테고리의 다른 글
[EMS] 에너지 빅데이터 분석 (0) | 2024.07.15 |
---|---|
[EMS] 데이터 전처리 및 시각화 실습 (0) | 2024.07.11 |
[EMS] folium, numpy (0) | 2024.07.09 |
[EMS] matplotlib, folium (0) | 2024.07.08 |
[EMS] Pandas 기본 (0) | 2024.07.03 |