본문 바로가기

Python

custom function

1. 논의의 출발

   데이터프레임이 있는데 특정 2개나 3개의 column에 조건을 주어서 새로운 column을 만들어 내기 위해서.

   아직도 난 custom function(커스텀함수)를 만드는 것에 익숙하지가 않다. 

   그런데 적용까지 하려니 더 헷갈려서...

 

 

2. 함수의 적용을 검색해보면 천편일률적으로 lambda, map, filter, reduce에 관한 설명이 뒤따르고

   예제도 대동소이하다. 

https://teddylee777.github.io/python/lambda-map-filter-reduce%EC%97%90-%EB%8C%80%ED%95%9C-%EC%89%AC%EC%9A%B4%EC%9D%B4%ED%95%B4

 

python의 built-in function인 lambda, map, filter, 그리고 reduce에 대한 쉬운 이해와 사용법

python의 built-in function인 lambda, map, filter, 그리고 reduce에 대한 쉬운 이해와 사용법에 대하여 알아보겠습니다.

teddylee777.github.io

  보통 lambda 설명을 하고 위와 같은 함수 설명이 이어지는데

  람다 함수를 이해하기 위해 몇 가지 찾아본 결과

https://namu.wiki/w/%EB%9E%8C%EB%8B%A4%EC%8B%9D

 

람다식 - 나무위키

이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권�

namu.wiki

  위키 설명이 그나마 이해하기 쉽다. 

 "람다식, 또는 람다 함수는 프로그래밍 언어에서 사용되는 개념으로

  익명 함수(Anonymous functions)를 지칭하는 용어이다.

  프로그래밍 언어학적으로 파고들면 이것만 한 달 이상 배우는 경우도 많으며,

  실제로 여러 대학들에서 사용하는 프로그래밍 언어 교재에서도 꽤나 많은 분량을 차지하는 개념이다.

  실무적으로는 코드의 간결함, 지연 연산을 통한 퍼포먼스 향상,

  그리고 기존 이터레이션 관련 코드를 구현하는 데 있어 불필요한 부분들을 제거할 수 있다는 점에서

  비교적 중요하게 다루어지고 있다.

  람다식은 주로 고차 함수에 인자(argument)로 전달되거나 고차 함수가 돌려주는 결과값으로 쓰인다. "

 

 

3. 다만, 보다 실전적으로 커스텀 함수를 어떻게 적용할 것인지는 감이 잘 안잡혀서 찾아본 결과

  http://www.leejungmin.org/post/2018/04/21/pandas_apply_and_map/

 

Pandas의 map함수, apply함수, applymap함수 차이점 분석

Pandas를 쓰다보면 초반에 개념 잡기 힘든 부분이 map함수, apply함수, applymap함수이다. 데이터분석을 하다가 헷갈려서 이참에 정리를 좀 해보았다. Pandas에서 배열의 합계나 평균같은 일반적인 통계�

www.leejungmin.org

  map함수, apply함수, applymap함수에 관해 위 사이트만큼 설명이 잘된 곳은 보지 못했다. 

  추천 100개...

 

 

4. CFTC 자료에 필요한 column을 만들기 위해 커스텀 함수를 만들고 map과 apply 함수를 적용해보자.

   핵심은

   "map함수는 DataFrame 타입이 아니라, 반드시 Series 타입에서만 사용해야 하며

    apply함수는 DataFrame에서 복수 개의 컬럼이 필요할 경우 사용한다. "

   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
def 증가감소판단(data):
    if data > 0:
        return("증가"
    elif data < 0:
        return("감소")
    else:
        data == 0
        return("보합"
 
 
def 순매수매도증감(data1, data2):
    if (data1 > 0& (data2 > 0):
        return("순매수증가")
    elif (data1 > 0& (data2 < 0):
        return("순매수감소")
    elif (data1 < 0& (data2 < 0):
        return("순매도증가")
    else
        (data1 < 0& (data2 > 0)
        return("순매도감소")
 
COT = pd.read_excel("D:\\category\\CFTC\\new\\option\\annual.xls")
 
COT['Netlong'= COT['M_Money_Positions_Long_ALL'- COT['M_Money_Positions_Short_ALL']  
COT['M_Money ratio']= np.where(COT['M_Money_Positions_Short_ALL'== 0" ", COT['M_Money_Positions_Long_ALL'/ COT['M_Money_Positions_Short_ALL'] )
 
sheet_list = ['SRW''HRW''HRS','Corn']
 
item_list = ['WHEAT-SRW - CHICAGO BOARD OF TRADE',
             'WHEAT-HRW - CHICAGO BOARD OF TRADE',
             'WHEAT-HRSpring - MINNEAPOLIS GRAIN EXCHANGE',
             'CORN - CHICAGO BOARD OF TRADE']
 
for item, sheet_temp in tqdm(zip(item_list, sheet_list), desc = "cftc", mininterval=0.01):
    time.sleep(0.01)
    
    wb = xw.Book(r'D:\\category\\CFTC\\new\\option\\cftctest.xlsx')
    sheet = wb.sheets[sheet_temp]
    df = COT_Org[COT_Org['Name'].isin([item])]['Netlong']- COT_Org[COT_Org['Name'].isin([item])]['Netlong'].shift(1)
    df1 = pd.DataFrame(df)
    df1.columns = ['Netlong_change']
    df2 = pd.merge(COT_Org[COT_Org['Name'].isin([item])], df1, left_index= True, right_index = True)
    df2['판단'= df2['Netlong_change'].map(증가감소판단)
    df2['Streak'= df2['판단'].groupby((df2['판단'!= df2['판단'].shift()).cumsum()).cumcount() + 1
    df2['Streak_signal'= np.where(df2['Netlong_change']< 0, df2['Streak'* (-1), df2['Streak'])
    df2["순매수매도변화"= df2.apply(lambda x: 순매수매도증감(x["Netlong"], x["Netlong_change"]), axis = 1).dropna(axis=0)
    sheet.range('a1').value = df2
cs

   

  그 동안 연습했던 코드의 반복이다.