Programming Language/Python2022. 3. 19. 01:02
728x90

 

tabulate 모듈을 사용해서 공통으로 작성했습니다.

지원하는 tablefmt중에서 'presto' 양식으로 처리했습니다.

 

 

import re
from tabulate import tabulate


def get_string_dataframe(df, pivot_yn=True, index_drop=True):
    """DataFrame의 TEXT출력 문자를 반환한다."""
    if pivot_yn:
        df = df.T

    if index_drop:
        df = df.reset_index(drop=index_drop)

    body = tabulate(df, headers='keys', tablefmt='presto', disable_numparse=True)
    hindex = body.index('\n')
    header = body[:hindex]
    newheader = re.sub('[ ]{2,}', ' ', header)
    body = header[:header.index('|') + 1] + newheader[newheader.index('|') + 1:] + '\n' + body[hindex + 1:]
    return body
    
def test_get_string_dataframe():
    data = {'18498': {'종목코드': '003960', '종목명': '사조대림', '주문번호': '18498', '주문상태': '체결', '주문수량': 37, '주문가격': 27700, '현재가': 27600, '주문구분': '매도', '미체결수량': 0, '체결량': 37, '시간': '090552', '당일매매수수료': 3580, '당일매매세금': 2357},
            '18308': {'종목코드': '073560', '종목명': '우리손에프앤지', '주문번호': '18308', '주문상태': '체결', '주문수량': 480, '주문가격': 2135, '현재가': 2140, '주문구분': '매도', '미체결수량': 434, '체결량': 46, '시간': '090542', '당일매매수수료': 300, '당일매매세금': 227},
            '16975': {'종목코드': '307930', '종목명': '컴퍼니케이', '주문번호': '16975', '주문상태': '접수', '주문수량': 54, '주문가격': 8920, '현재가': 8820, '주문구분': '매도', '미체결수량': 54, '체결량': 0, '시간': '090432', '당일매매수수료': 0, '당일매매세금': 0},
            '16923': {'종목코드': '001120', '종목명': 'LX인터내셔널', '주문번호': '16923', '주문상태': '체결', '주문수량': 61, '주문가격': 30450, '현재가': 30400, '주문구분': '매도', '미체결수량': 0, '체결량': 61, '시간': '090428', '당일매매수수료': 6490, '당일매매세금': 4273},
            '16819': {'종목코드': '084010', '종목명': '대한제강', '주문번호': '16819', '주문상태': '체결', '주문수량': 21, '주문가격': 22000, '현재가': 21650, '주문구분': '매도', '미체결수량': 0, '체결량': 21, '시간': '090423', '당일매매수수료': 1600, '당일매매세금': 1062},
            '16780': {'종목코드': '010060', '종목명': 'OCI', '주문번호': '16780', '주문상태': '체결', '주문수량': 4, '주문가격': 110500, '현재가': 111000, '주문구분': '매도', '미체결수량': 0, '체결량': 4, '시간': '090421', '당일매매수수료': 1540, '당일매매세금': 1017},
            '13708': {'종목코드': '017480', '종목명': '삼현철강', '주문번호': '13708', '주문상태': '체결', '주문수량': 73, '주문가격': 6690, '현재가': 6560, '주문구분': '매도', '미체결수량': 0, '체결량': 73, '시간': '090213', '당일매매수수료': 1700, '당일매매세금': 1123},
            '13699': {'종목코드': '008260', '종목명': 'NI스틸', '주문번호': '13699', '주문상태': '체결', '주문수량': 96, '주문가격': 5030, '현재가': 4895, '주문구분': '매도', '미체결수량': 0, '체결량': 96, '시간': '090213', '당일매매수수료': 1690, '당일매매세금': 1110},
            '13698': {'종목코드': '006800', '종목명': '미래에셋증권', '주문번호': '13698', '주문상태': '체결', '주문수량': 124, '주문가격': 8260, '현재가': 8270, '주문구분': '매도', '미체결수량': 0, '체결량': 124, '시간': '090213', '당일매매수수료': 3560, '당일매매세금': 2356},
            }

    df = pd.DataFrame(data)
    print(get_string_dataframe(df))


if __name__ == "__main__":
    test_get_string_dataframe()

#     | 종목코드 | 종목명 | 주문번호 | 주문상태 | 주문수량 | 주문가격 | 현재가 | 주문구분 | 미체결수량 | 체결량 | 시간 | 당일매매수수료 | 당일매매세금
# ----+--------+---------+--------+--------+--------+--------+--------+--------+---------+-------+--------+-----------+----------
#  0  | 003960 | 사조대림    | 18498  | 체결     | 37     | 27700  | 27600  | 매도     | 0       | 37    | 090552 | 3580      | 2357
#  1  | 073560 | 우리손에프앤지 | 18308  | 체결     | 480    | 2135   | 2140   | 매도     | 434     | 46    | 090542 | 300       | 227
#  2  | 307930 | 컴퍼니케이   | 16975  | 접수     | 54     | 8920   | 8820   | 매도     | 54      | 0     | 090432 | 0         | 0
#  3  | 001120 | LX인터내셔널 | 16923  | 체결     | 61     | 30450  | 30400  | 매도     | 0       | 61    | 090428 | 6490      | 4273
#  4  | 084010 | 대한제강    | 16819  | 체결     | 21     | 22000  | 21650  | 매도     | 0       | 21    | 090423 | 1600      | 1062
#  5  | 010060 | OCI     | 16780  | 체결     | 4      | 110500 | 111000 | 매도     | 0       | 4     | 090421 | 1540      | 1017
#  6  | 017480 | 삼현철강    | 13708  | 체결     | 73     | 6690   | 6560   | 매도     | 0       | 73    | 090213 | 1700      | 1123
#  7  | 008260 | NI스틸    | 13699  | 체결     | 96     | 5030   | 4895   | 매도     | 0       | 96    | 090213 | 1690      | 1110
#  8  | 006800 | 미래에셋증권  | 13698  | 체결     | 124    | 8260   | 8270   | 매도     | 0       | 124   | 090213 | 3560      | 2356

 

그리고, DataFrame을 바로 출력할 때는 아래 설정으로 포맷을 조정할수 있습니다.

# pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
pd.set_option('display.width', None)
pd.set_option('display.colheader_justify', 'left')
# pd.set_option('display.precision', 10)

print(df.to_markdown(index=False))
728x90

'Programming Language > Python' 카테고리의 다른 글

dataframe 출력 사이즈 설정  (0) 2022.05.31
Python 모듈 실행시 ModuleNotFoundError 처리  (0) 2022.03.25
[Python] 클래스  (0) 2022.03.14
[Python] 모듈과 패키지  (0) 2022.03.14
[Python] 내장함수  (0) 2022.03.14
Posted by 하루y