Programming Language/Python2022. 3. 14. 22:25
728x90

 

문자열 포맷 방식

참조: https://docs.python.org/3.9/library/string.html#formatstrings

 

1. % 기호 방식

2. {} 기호 방식

3. f-strings 방식

 

s_val = 'string'
i_val = 123
f_val = 3.141592

# 1. % 기호방식
for i in range(3):
    print('%% method: %s / %d / %.2f' % (s_val, i_val+i, f_val))
# % method: string / 123 / 3.14
# % method: string / 124 / 3.14
# % method: string / 125 / 3.14

# 2. {} 기호방식
for i in range(3):
    print('{{}} method: {} / {} / {:.2f}'.format(s_val, i_val+i, f_val))
# {} method: string / 123 / 3.14
# {} method: string / 124 / 3.14
# {} method: string / 125 / 3.14

# 3. f-string 방식
for i in range(3):
    print(f'f-string method: {s_val} / {i_val+i} / {f_val:.2f}')
# f-string method: string / 123 / 3.14
# f-string method: string / 124 / 3.14
# f-string method: string / 125 / 3.14

 

 

728x90
Posted by 하루y
Programming Language/Python2022. 3. 12. 16:27
728x90

판다스 10분 요약 : https://pandas.pydata.org/pandas-docs/stable/user_guide/10min.html

판다스 문서: https://pandas.pydata.org/pandas-docs/stable/user_guide/index.html

무료 전자책 참조: https://wikidocs.net/32829

import pandas as pd

df = pd.DataFrame(
    {'가격': [100, 140, 155, 70, 90],
     'PER': [1.1, 0.8, 0.7, 2.3, 3.9],
     '거래량': [1000, 800, 890, 700, 2000]},
    index=['a', 'b', 'c', 'd', 'e']
)

# 0. 기본데이터
print(df)
#     가격  PER   거래량
# a  100  1.1  1000
# b  140  0.8   800
# c  155  0.7   890
# d   70  2.3   700
# e   90  3.9  2000

# 1. 필터링
print(df[df['가격'] > 100])
#      가격  PER  거래량
# b  140  0.8  800
# c  155  0.7  890

# 조건이 여러개면 & 로직 연산자를 이용한다.!!! 
# df[df['가격'] > 100 & df['가격'] > 100]

# 필터링 데이터 구조.
print(type(df['가격'] > 100))
# <class 'pandas.core.series.Series'>

# 필터링 데이터 결과.
print((df['가격'] > 100))
# a    False
# b     True
# c     True
# d    False
# e    False
# Name: 가격, dtype: bool

# 2.1 시리즈 졍렬
print(df['PER'].sort_values(ascending=False))
# e    3.9
# d    2.3
# a    1.1
# b    0.8
# c    0.7
# Name: PER, dtype: float64

# 2.2 데이터프레임 정렬
print(df.sort_values(by='PER', ascending=True))
#     가격  PER   거래량
# c  155  0.7   890
# b  140  0.8   800
# a  100  1.1  1000
# d   70  2.3   700
# e   90  3.9  2000

# 3. rank. 시리즈로 결과 리턴
print(df['PER'].rank(ascending=True))
# a    3.0
# b    2.0
# c    1.0
# d    4.0
# e    5.0
# Name: PER, dtype: float64
728x90
Posted by 하루y
Programming Language/Python2022. 3. 12. 15:54
728x90

- 데이터 분석 모듈로 시리즈(Series)와 데이터프레임(DataFrame) 데이터구조를 제공한다.
- 시리즈가 1차원 구조면 데이터프레임은 2차원의 데이터 구조다.

 

  • 판다스 데이터 구조
=import pandas as pd

# 시리즈
sr = pd.Series([400, 300, 800])
# 첫번째 숫자는 인덱스
print(sr)
# 0    400
# 1    300
# 2    800
# dtype: int64

sr = pd.Series([400, 300, 800], index=['두산퓨얼셀', 'OCI', '대한항공'])
print(type(sr))
# <class 'pandas.core.series.Series'>

# 인덱스를 지정했을 때
print(sr)
# 두산퓨얼셀     400
# OCI    300
# 대한항공     800
# dtype: int64

print(type(sr['두산퓨얼셀']))
# <class 'numpy.int64'>
print(sr['두산퓨얼셀'])
# 400
print(sr[1])
# 300

# 데이터프레임
df = pd.DataFrame({'가격':[40000, 110000, 29000], 'PER': [0.5, 1.2, 0.2], 'ROA': [1.01, 3.1, 0.97]}, index=['두산퓨얼셀', 'OCI', '대한항공'])
print(type(df))
# <class 'pandas.core.frame.DataFrame'>
print(df)
# <class 'pandas.core.frame.DataFrame'>
#         가격  PER   ROA
# 두산퓨얼셀    40000  0.5  1.01
# OCI   110000  1.2  3.10
# 대한항공   29000  0.2  0.97

print(type(df['가격']))
# <class 'pandas.core.series.Series'>

# 시리즈데이터 가져오기
print(df['가격'])
# 두산퓨얼셀      40000
# OCI     110000
# 대한항공     29000
# Name: 가격, dtype: int64
print(df['가격']['OCI'])
# 110000

# 행데이터 가져오기
print(df.loc['두산퓨얼셀'])
# 가격     40000.00
# PER      0.50
# ROA      1.01
# Name: 두산퓨얼셀, dtype: float64

# 행데이터도, 시리즈 타입이네요.
print(type(df.loc['두산퓨얼셀']))
# <class 'pandas.core.series.Series'>
728x90
Posted by 하루y
Programming Language/Python2022. 3. 10. 22:25
728x90

handler에서 encoding을 설정하는데, 각 handler의 아큐먼트(args) 위치에서 encoding 자리에서 설정합니다.

주의할 점은, 테스트 Python 버전은 3.9인데, config파일에 한글(2바이트)문자가 있으면 오류가 발생함.

버전 3.10에는 fileConfig의 아규먼트에 encoding가 추가되었습니다.

 

추가적인 handler의 args 양식은 아래 자료를 참조하세요. 

 

참조자료

 - loggin.config  : https://docs.python.org/ko/3/library/logging.config.html#module-logging.config

 - loggin.handlers:   https://docs.python.org/ko/3/library/logging.handlers.html

 

import logging.config

logging.config.fileConfig('../logging.conf')
logger = logging.getLogger(__name__)

logger.info("테스트 입니다.")

 

내용추가. (2022-03-17)

qualname 설정과 패키지에 대해서

 - 시스템의 패키지가 java처럼 하나로 묶이지 않으면, Log가 일부에서 출력되지 않는 문제가 발생함. Class는 정상적으로 나오는데,  Class가 없는 Util에서 로그가 출력 되지 않음. qualname을 모듈의 package가 다르니(예: util / api / data), 로그하나로 qualname설정으로 비Class 로그는 출력이 되지 않음. 테스트 해보면, 앞 패키지로 제어되는 건 확인됨.

그래서, util / api / data를 JAVA 처럼 sample/util, sample/api, sample/data 로 변경하면, 전체 로그가 출력됨.

 

package를 sample.main / sample.util / sample.api 이렇게 구조를 잡아야 전체를 제어할 수 있다.
qualname=sample 로 설정하면, 모든 로그를 출력할 있다.
logging.config.fileConfig('logging.conf') <-- main 에서 한 번만 호출하면 된다.
logger = logging.getLogger(__name__)  <-- 각 모듈에서 한 번만 호출한다.

 

 

logging.conf 파일 내용입니다.

[loggers]
keys=root, infoLogger

[handlers]
keys=consoleHandler, fileHandler

[formatters]
keys=consoleFormatter, fileFormatter

####################
## logger
####################
[logger_root]
# level=NOTSET
# handlers=
level=DEBUG
handlers=consoleHandler

[logger_infoLogger]
level=DEBUG
handlers=consoleHandler, fileHandler
# package를 sample.main / sample.util / sample.api 이렇게 구조를 잡아야 전체를 제어할 수 있다.
# qualname=sample 로 설정하면, 모든 로그를 출력할 있다.
# logging.config.fileConfig('logging.conf') <-- main 에서 한 번만 호출하면 된다.
# logger = logging.getLogger(__name__)      <-- 각 모듈에서 한 번만 호출한다.
qualname=sample
propagate=0

####################
## handler
####################
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=consoleFormatter
args=(sys.stdout,)

[handler_fileHandler]
class=FileHandler
formatter=fileFormatter
# FileHandler(filename, mode='a', encoding=None, delay=False, errors=None)
args=('logfile.log','a','utf8')

####################
## formatter
####################
[formatter_consoleFormatter]
format=%(asctime)s %(name)s [%(levelname)-8s] %(message)s
datefmt=

[formatter_fileFormatter]
format=%(asctime)s %(name)s [%(levelname)-8s] %(message)s
datefmt=

아래는 TimedRotatingFileHandler 에서 args 설정.

[handler_fileHandler]
class=handlers.TimedRotatingFileHandler
formatter=fileFormatter
# TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None, errors=None)
# when: 'midnight', 'W0'-'W6', D', 'H', 'M'
#    - W0 is monday
args=('logfile.log', 'midnight', 1, 0, 'utf8')
728x90
Posted by 하루y