잇연

[sesac LLM] day11-240113 Pandas, DataFrame, Series 본문

SESAC LLM 개발자 강의/Python

[sesac LLM] day11-240113 Pandas, DataFrame, Series

잇연 2024. 1. 16. 19:49

복습

Rest API

  • get : url로 데이터를 전달
  • post: 패킷의 body에 데이터를 전달,감춰서 전달, 많이 보낼 수 있다.

Pandas

Pandas는?

  • Wes McKinney가 시작한 오픈소스 프로젝트
  • 데이터 분석을 위해 만들어졌다.
  • 이전에는 R이 데이터 처리와 분석 영역에서 강세였는데, Python이 양대산맥이 될 수 있도록 만듦
  • talkPython : Wes McKinney가 Python에 대해서 이야기하는 팟캐스트이다. (파이썬에 대한 썰을 푸는데, 재미로 들어도 좋고, 실제로 만든 사람이 이야기하는 내용이니 해당 언어나 라이브러리에 대해서도 더 이해가 깊어질 수 있다.)

데이터 분석에서 Pandas를 많이 쓰는 이유 WHY?

  • 표 형태의 데이터를 쉽게 조작, 분석 가능
  • Pandas의 핵심 객체 : DataFrame, Series
  • 엑셀에서 모든 일을 Pandas에서 할 수 있는데 , 엑셀보다 좋은점 : Python의 다른 라이브러리들과 결합해서 쓸 수 있다.

DataFrame

  • DataFrame은 행(row)과 열(column)로 구성된 2차원 데이터 구조
  • SQL 테이블이나 엑셀 스프레드 시트와 비슷하게 생각하면 된다.
  • 행 : row 열 :column 행과 열 모두 다 인덱스로 되어있다.
  • *주의 행 인덱스: 각 행을 구별하는 데 사용됩니다. 이는 데이터의 위치를 나타내며, 보통 숫자, 문자열, 날짜 등 다양한 형태로 될 수 있습니다. 열 인덱스: 각 열의 이름으로 사용됩니다. 이는 데이터의 속성이나 변수를 나타내며, 주로 문자열로 구성됩니다.
  • 열은 주로 속성 값으로, 행은 객체의 이름으로 구성되며 데이터는 주로 행 방향으로 추가된다. (아래로)
  • 각 열은 동일한 데이터 타입을 가진다.
  • Pandas 에서는 행과 열에 이름을 붙일 수 있다.

DataFrame예제코드

pip install pandas

import pandas as pd
# DataFrame 생성
data = {
	'이름': ['철수', '영희', '민수'],
	'age': [28, 22, 31],
	'gender': ['남', '여', '남']
}
df = pd.DataFrame(data)
# DataFrame 출력
df
#나이만 받고싶다 하면 
df['gennder']
# 컬럼 이름 정의
columns = ['이름', 'age', 'gender']
df2 = pd.DataFrame(data, columns=columns)
# DataFrame 출력
df2

이런 식으로 아까와 달리 리스트로 만들 수도 있다. 동일하게 만들 수 있다.

Series

  • Series 는 Pandas에서 1차원 배열과 같은 데이터 구조이다.
  • 하나의 열에 해당하는 데이터와 인덱스를 가지고 있다.
import pandas as pd
# Series 생성
data = pd.Series([100, 200, 300, 400, 500], index=['a', 'b', 'c', 'd', 'e'])
# Series 출력
print(data)
  • DataFrame 과 Series 는 Pandas의 기본 자료형이다.
  • DataFrame 은 표 형태의 데이터를, Series 는 한 줄의 벡터 데이터(열, 칼럼, 리스트 등등)로 표현된다.

만약에 데이터프레임을 csv로 만들고 싶다면, 다음과 같이 써주면 csv가 생성된다.

df.to_csv("df.csv", index=False)
#결과(df.csv 파일생성)
이름,age,gender
철수,28,남
영희,22,여
민수,31,남

그리고 해당 csv를 읽고 싶을 때는 다음과 같이 입력한다.

df = pd.read_csv("df.csv")
#내보내기
pd.to_csv("파일이름.csv", index=False)
#불러내기 
pdf.read_csv("파일이름.csv")

#다른 확장자도 쓸 수 있다.

구글에서 Gephi 검색해서 다운로드 받고 설치…


실습

열린 국회정보 API 및 Pandas 실습

  • 판다스 리퀘스트 설치
!pip install pandas requests
  • 임포트 해주기
import requests
import pandas as pd
import itertools
  • 발급받은 api키 입력
# 발급 받은 API 키
YOUR_API_KEY = '640b6edf35bb47f280aac61745395c9e'
# 국회의원 발의법률안 데이터 아이디
data_id = 'nzmimeepazxkubdpn'

-  url로 데이터 가져오기

url = f"https://open.assembly.go.kr/portal/openapi/{data_id}?KEY={YOUR_API_KEY}&AGE=21&Type=json"
response = requests.get(url).json()
# 한 번에 1000개씩 밖에 데이터를 못가져 온다...
len(response[data_id][1]['row'])
  • 데이터 자체는 23371 개 라고 한다.
max_page = response[data_id][0]['head'][0]['list_total_count']
max_page
  • 한번에 최대로 가져올 수 있는 데이터의 수는 1000개이다. 23000개의 데이터를 1000개씩 가져오도록 하자. 1000개씩 데이터를 넣어주도록 코드를 짜준다.
all_laws = []
for page_num in range(1, int(max_page/1000+2)):
    p_size= page_num*1000
    p_index = page_num
    url = f"<https://open.assembly.go.kr/portal/openapi/{data_id}?KEY={YOUR_API_KEY}&AGE=21&Type=json&pIndex={page_num}&pSize=1000>"
    laws = requests.get(url).json()[data_id][1]['row']
    all_laws.extend(laws)
all_laws = pd.DataFrame(all_laws)
all_laws.head()
# 혹시 날아갈까, 데이터를 파일로 저장하자.
all_laws.to_csv("all_laws.csv",index=False)
# 이번에는 국회의원들의 프로필을 털어보자.
data2_id = 'nwvrqwxyaytdsfvhu'
url =f"<https://open.assembly.go.kr/portal/openapi/{data2_id}?KEY={YOUR_API_KEY}&Type=json&UNIT_CD=100020&pSize=1000>"
senators = requests.get(url).json()[data2_id][1]['row']
senators = pd.DataFrame(senators)
senators
# 혹시 날아갈까, 데이터를 파일로 저장하자.
senators.to_csv("senators.csv",index=False)
# 아래는 같은 법률로 발의된 국회의원들의 조합을 찾아서, 그래프를 그리기 위한 데이터를 만드는 과정이다.
all_laws['PUBL_PROPOSER'] = all_laws['PUBL_PROPOSER']+','+all_laws['RST_PROPOSER']
all_laws['senator'] = all_laws['PUBL_PROPOSER'].str.split(',')
all_laws = all_laws[all_laws['senator'].notnull()]
pairs = all_laws['senator'].apply(lambda x: x if x is None else list(itertools.combinations(x,2))).explode()
pairs = pd.DataFrame(pairs.tolist(), columns=['Source', 'Target'])
pairs = pairs[pairs['Target'].notnull()]
# edge_list.csv 파일로 저장하자.
pairs.to_csv("edge_list.csv", index=False)
# edge_list.csv 파일로 저장하자.
pairs.to_csv("edge_list.csv", index=False)