2019.07.04 Apply 메소드를 통한 데이터프레임의 값 Update (1)
저는 파이썬을 공부하기 시작한 지 얼마 안 되었기 때문에, 파이썬
내에서 큰 데이터를 처리해야 할 일이 생겼을 때 당황한 적이 꽤 있습니다. 특히 데이터프레임의 경우, 파이썬 내에서 데이터 들을 ‘데이터 베이스’ 마냥 관리할 수 있게 도와주기에, 그걸 공부하게 될 때 엄청난 양의
데이터들을 자주 접하게 됩니다.
특히 데이터프레임을 만들고 난 후, 내부에 있는 값들을 일괄 변경해야
할 일이 생긴다면 더욱 난감하게 됩니다. 워낙 코딩 초짜라, ‘여러
개의 값을 처리한다면 반복문이 최고지!’ 라고 바로
생각이 튀어나오게 됩니다만, 수천 수만개의 데이터를 마주하게 되면,
for문으로도 한계가 있다는 것을 체감하고 이내 사고를 멈춰 버리게 됩니다…
그렇다면, 데이터프레임의 데이터들을 갱신할 일이 생긴다면 어떻게 코딩을
짜야 할까요? 무턱대고 for문 돌려서, 하나하나 값을 꺼낸 다음에 수정해 주어야 할까요? 몇
백 개 단위면 모르겠지만, 수십, 수천만의 데이터가
들어왔을 때도 반복문을 사용해야 할까요?
이 문제를 해결하기 위해, pandas에서는 apply라는 메소드를 제공하고 있습니다. apply를 이용하면
데이터프레임의 특정 열 값을 일괄적으로 수정할 수 있습니다. 자세한 정보는 아래 Documentation에서 확인하실 수 있습니다.
그렇다면 제가 공부하면서 만들었던 코드를 통해 자세히 알아보도록 할까요?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| k10=pd.DataFrame(columns=stock_dict['기업명'])
for idx,code in enumerate(code_list):
aa=getStockPrice(code)
aa['close']=pd.to_numeric(aa['close'])
stock_all=int(stock_dict['주식 발행 수'][idx])
cRatio=float(stock_dict['유동 비율'][idx])
aa['close']=aa['close'].apply(lambda x:x*cRatio*stock_all)
k10[stock_dict['기업명'][idx]]=aa['close']
k10
|
제가 만든 코드는, 코스피 시가총액 상위 10개 기업의 일일 시가총액을 데이터프레임으로 구성하는 것입니다. 솔직히
제가 적었는 데도 이해 하기가 쉽지 않네요… 간단하게 KOSPI200을
KOSPI10 으로 만들어서 표현한다고 하면 그나마 이해하기 쉬울 것 입니다. KOSPI200은 위키백과 링크를 걸어 둘 테니 참조하시기 바랍니다.
그럼 한 줄 한 줄 보도록 합시다. 먼저 처음 코드 입니다.
1
| k10=pd.DataFrame(columns=stock_dict['기업명'])
|
이 코드는 10대 기업의 데이터를 집어 넣을 데이터프레임 객체를
선언하는 코드입니다. stock_dict[‘기업명’]으로
columns을 선언했는데, stock_dict는 딕셔너리
타입의 객체로, ‘기업명’ 키에는 시가총액 상위 10대 기업의 이름이 들어가 있습니다. 이 코드 실행 시 결과는 다음과
같습니다.
다음 코드 입니다.
1
| for idx,code in enumerate(code_list):
|
위에서 반복문을 그렇게 욕했는 데도 왜 쓰냐는 의문을 가지실 수 있습니다. 이 for문은 착한 for문이라
써도 괜찮습니다. 단 10번만 돌릴 것이고, 10번은 눈치 채셨겠지만 기업의 개수만큼 돌리기에 그렇습니다.
그렇다면 무엇을 추출하려고 enumerate 까지 쓰면서 했냐, 물어보신다면 변수 명을 봐 주시면 됩니다. code_list는 list 타입 객체로, 각 기업의 종목 코드가 들어가 있는 리스트입니다. 내용물은 다음과 같습니다.
enumerate를 쓰면, sequence
형태 객체의 내용물들 말고도 인덱스 번호까지 추출하게 됩니다. 인덱스 번호는
전체 코드를 보셔서 아시겠지만, 나중에 특정 기업의 데이터들을 읽을 때 사용하게 됩니다. 자세한 설명은 이후에 알려드리겠습니다.
1
| aa=getStockPrice(code)
|
다음 코드입니다. 이 모듈은 파이썬 자체 내장 함수도 아니고, 어디서 Import 한 모듈도 아닙니다. 그렇습니다, 직접 만든 함수입니다.
하지만 보여드릴 수 없었습니다. 제가 만든 함수가 아니거든요. 제가 교육받고 있는 곳의 강사님이 제공해주신 함수입니다. 사실
이해 못해서 올려드리기가 조금 그렇네요.
하여튼 저 함수의 매개값은 특정 기업 종목 코드이며, 수정
주가를 모아 둔 데이터프레임을 반환합니다. 수정 주가의 자세한 설명은 하단의 네이버 사전을 참고하시기
바랍니다.
코드를 돌려서 나온 데이터프레임은 다음과 같습니다. 상위 다섯 개, 하위 다섯 개의 값을 보여드리겠습니다.
1
| aa['close']=pd.to_numeric(aa['close'])
|
다음 코드입니다. 위의 데이터프레임에서, ‘close’ 열이 있는 것을 확인 할 수 있습니다.
저 열에 들어가 있는 값은 주식의 종가입니다. 장이 마감했을 때 기록된 값입니다. 저것을 기준으로 일일 시가총액을 계산할 예정입니다.
코드를 보시면 pd.to_numeric이라는 메소드를 보실 수 있습니다. 이 메소드는 매개 객체의 모든 값을 정수, 혹은 실수로 전환해주는
메소드입니다. 왠지 낯설게 느껴질 수도 있는데요, 그렇습니다, 전에 배운 pd.to_datetime과 비슷한, 형 변환 메소드의 일종입니다. to_numeric의 자세한
설명은 다음 Documentation에서 확인하실 수 있습니다.
마저 코드의 설명을 하고 싶지만, 글이 너무 길어져서 가독성이 떨어지는
것 같습니다. 다음 페이지에서 계속 설명 드리도록 하겠습니다.
계속




댓글
댓글 쓰기