파이썬 머신러닝 판다스 데이터분석

2주차- 데이터 입출력

humpark 2024. 8. 14. 16:26

1. 외부 파일 가져오기

판다스는 다양한 형태의 파일을 가져와 데이터프레임으로 변환하고, 또한 다양한 파일형식으로 변환이 가능하다.

한번 데이터프레임으로 변환하고 나면 판다스의 모든 함수를 사용할 수 있다.

 

 

1-1 csv 파일

.csv 형식의 파일.

#csv파일의 데이터프레임 변환
pandas.read_csv("파일경로")

#header 옵션: 데이터프레임의 열 이름으로 사용할 행을 지정하기
pandas.read_csv("파일경로", header=0) #0행을 지정 
pandas.read_csv("파일경로", header=1) #1행을 지정 
pandas.read_csv("파일경로", header=none) #행 지정 안함

#index 옵션: 데이터프레임의 행 이름으로 사용할 열 지정하기
pandas.read_csv("파일경로", index_col=c0) #c0 열을 인덱스 지정(행 이름)
pandas.read_csv("파일경로", index_col=False) #지정안함
#예제 2-1 CSV 파일 불러오기
import pandas as pd

file_path = "C:\Download\read_csv_sample.csv"	#위의 예제처럼 바로 해도되지만 여러번 사용할 경우 따로 함수지정해서 하는게 간편한듯

df1= pd.read_csv(file_path, header= none)
print(df1)

'

 

 

read_csv() 함수의 다양한 옵션을 통해서 다양한 csv 파일의 형식에 대응해야 한다. csv 파일에 따라서는 쉼표나 탭 또는 공백으로 텍스트를 구분하기 때문이다

 

1-2 엑셀 파일

엑셀파일은 에초에 행과 열의 형태가 데이터프레임과 일치하기 때문에 위의 csv파일과 같이 읽고 때에 따라서는 옵션만 간단하게 추가해주면 된다

.xlsx-> DataFrame: pandas.read_excel("파일경로", 옵션)
#예제 2-2 엑셀 파일 읽기
import pandas as pd
path= "C:/Download/남북한발전전력량.xlsx"	#마찬가지로 경로는 다시쓰기 귀찮으니까 path라는 함수로 지정

df1 = pd.read_excel(paht, engine = 'openpyxl')
df2 = pd.read_excel(path, engine = 'openpyxl', header=None)
print(df1)
print('\n')
print(df2)

engine을 왜쓰는가: 실행 환경에 따라서는 excel 파일 데이터 추출을 지원하는 xlrd 라이브러리와 openpyxl 라이브러리 설치가 필요할 수도 있다. xlsx 확장자를 갖는 경우, engine 옵션에 'openpyxl'을 지정한다. 확장자가 xls인 경우에는 engine 옵현으로 xlrd을 지정한다.

 

1-3 JSON 파일

.json 은 데이터 공유를 목적으로 개발된 특수 파일형식이다.

JSON -> DataFrame: pandas.read_json("파일경로")
#예제 2-3 JSON 파일 읽기

import pandas as pd

#read_json() 데이터프레임 변환
df= pd.read_json("C:/download/read_json_sample.json")
print(df)
print("\n")
print(df.index)

 

 

2. 웹(web)에서 가져오기

2-1 HTML 웹 페이지에서 표 속성 가져오기

read_html() 함수를 이용해서 웹 페이지에 있는 <table> 태그에서 표 형식을 모두 찾아와 데이터프레임으로 변환한다.

이때, 표 데이터들은 각각 다른 테이블이기 때문에 여러개의 표를 원소로 같는 리스트가 반환된다.

HTML 표 가져오기: pandas.read_html("웹주소" 또는 "HTML" 파일 경로)
#예제 2-4 웹에서 표 정보 읽기

import pandas as pd

#HTML 파일 경로 or 웹페이지 주소를 변수에 저장	#이 역시 만찬가지로 여러번 쓰기 번거로워서
url= "C:/download/sample.html"

#html 웹페이지의 테이블을 가져와서 데이터프레임으로 변환
tables= pd.read_html(url)

#테이블의 개수 확인
print(len(tables))
print("\n")

#테이블 리스트의 원소를 iteration하면서 각각 화면 출력
for i in range(len(tables)):
	print("tables[%s]" % i
    print(tables[i]
    print("\n")
    
#파이썬 패키지 정보가 들어있는 두번째 데이터프레임선택df 변수 저장
df= tables[1]

#'name' 열을 인덱스로 지정
df.set_index(['name'], inplace=True)
print(df)

 

 

2-2 웹 스크래핑

BeautifulSoup 등 웹 스크래핑의 도구로 수집한 데이터를 판다스 데이터프레임으로 정리하는 방법을 설명하자면,

1. 데이터 스크래핑하기

2. 파이썬 리스트, 딕셔너리 등으로 정리

3. DataFrame() 함수에 리스트나 딕셔너리 형태로 전달하여 데이터프레임으로 변환

 

이 정도가 되겠다.

#예제 2-5  웹에서 데이터 가져와 데이터 프레임으로 변환하기
import pandas as pd
import requests
from bs4 import BeautifulSoup

# 빈 데이터프레임 생성
df_list = []

# 페이지 순회
for i in range(152200, 155001):  # 페이지 번호 범위 설정
    url = f'https://www.geumcheon.go.kr/reserve/edcLctreView.do?key=112&searchLctreKey={i}'
    response = requests.get(url)
    
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'html.parser')
        program_name_elem = soup.find('span', class_='p-table__subject_text')
        
        if program_name_elem:
            # span 태그의 내부 텍스트 전체를 추출
            text_content = program_name_elem.text.strip()
            
            # 프로그램명 추출
            program_name = text_content.split('\n')[0]
            
            # 신청자 및 대기자 정보 추출
            applicant_info = text_content.split('신청자:')[-1].split(',')[0].strip()
            waiting_info = text_content.split('대기자:')[-1].strip()

            # 추출한 정보를 딕셔너리로 추가
            data = {'프로그램명': program_name, '신청자': applicant_info, '대기자': waiting_info}
            df_list.append(pd.DataFrame(data, index=[0]))  # 각 페이지의 정보를 DataFrame으로 변환하여 리스트에 추가
      

# 데이터프레임 합치기
df = pd.concat(df_list, ignore_index=True)

 

 

3. API 활용하여 데이터 수집하기

인터넷 서비스 업체에서 제공하는 api를 통해서 수집한 데이터를 판다스 자료구조로 변환하는 방식

 

- 구글 지오코딩 API

구글 지오코딩의 api를 이용하여 장소에 대한 위도경도 데이터를 가져와 데이터프레임으로 저장할 수 있다.

지오코딩의 api 변환방식에 대해서 먼저 알아보자면, 아래와 같다. 아래는 해운대 해수욕장에 대한 위경도 정보를 확인한 것이다.

 

 

#예제 2-6 구글 지오코딩 위치정보
import googlemaps
import pandas as pd

my_key = "AIzaSyDBV36PoBl6Fn6ToUgWZT2LhZZ25rl9fTc"

#구글맵스 객체 생성하기
maps = googlemaps.Client(key=my_key)

lat= [] #위도
lng= [] #경도

#장소 리스트
places= ["서울시청", "경희대학교 서울캠퍼스", "국립국악원"]	#경희대에 경우 서울캠퍼스라고 지정하지 않으면 출력이 안되는것 같다

i = 0
for place in places:
    i= i + 1
    try:
        print(i, place)
        #지오코딩 API 결과값 호출하여 geo_location 변수에 저장
        geo_location = maps.geocode(place)[0].get('geometry')
        lat.append(geo_location['location']['lat'])
        lng.append(geo_location['location']['lng'])

    except:
        lat.append('')
        lng.append('')
        print(i)

#데이터프레임으로 변환하기
df= pd.DataFrame({'위도':lat, '경도':lng}, index = places)
print('\n')
print(df)
#결과값
1 서울시청
2 경희대학교 서울캠퍼스
3 국립국악원


                    위도          경도
서울시청         37.566585  126.978204
경희대학교 서울캠퍼스  37.596837  127.051844
국립국악원        37.477759  127.008304

 

4. 데이터 저장하기

4-1 CSV 파일로 저장

CSV 파일로 저장: df.to_csv("경로")

4-2 JSON 파일로 저장

JSON 파일로 저장: df.to_json("경로")

4-3 Excel 파일로 저장

Excel파일로 저장: df.to_excel("경로")

 

4-4 여러개의 데이터프레임을 하나의 Excel 파일로 저장

#데이터 여러개를 한 엑셀로 저장 : pd.ExcelWriter("파일경로")

# df1을 'sheet1'으로, df2를 'sheet2'로 저장
writer = pd.ExcelWriter("./파일명.xlsx")
df1.to_excel(writer, sheet_name='sheet1')
df2.to_excel(writer, sheet_name='sheet2')
writer.save()