KevinFire2030 / Fire2025

0 stars 0 forks source link

[23W26] quantifia 구현 #23

Open KevinFire2030 opened 1 year ago

KevinFire2030 commented 1 year ago

https://quantifia.com/퀀트-투자를-이해하기-첫걸음부터-전략까지/

KevinFire2030 commented 1 year ago

[Pandas] 리스트, 딕셔너리 자료형을 데이터프레임, Series로 바꾸기

리스트를 데이터프레임으로 변환(list to DataFrame) 리스트 1개를 데이터프레임으로 바꾸는 경우는 Series로 변환하는 경우와

원리가 동일하므로 생략하도록 하겠습니다.

리스트가 여러 개인 경우, 각 리스트를 같은 행 내에서 취급하려는 경우에는

리스트들을 하나의 리스트로 묶어서 pd.DataFrame 메소드에 input으로

넣어주시면 데이터프레임 형성이 가능하며,

각 리스트를 같은 열 내에서 취급하려는 경우에는

리스트들을 zip으로 묶어 input으로 넣어주시면 됩니다.

결과를 비교하면 아래 예시와 같습니다.

a = [10, 30, 20, 40]
b = ['a', 'g', 'h', 'c']

# 각 리스트를 한 행에 취급
pd.DataFrame([a, b])

# 결과
    0     1   2   3
0   10  30   20   40
1   a    g    h    c
# 각 리스트를 한 열에 취급
pd.DataFrame(zip(a, b))

# 결과
    0     1
0   10    a
1   30    g
2   20    h
3   40    c

만일, index 이름과 열 이름을 지정하고 싶으시다면 index와 columns 인자를

아래의 경우처럼 지정해주시면 됩니다.

a = [10, 30, 20, 40]
b = ['a', 'g', 'h', 'c']

# 인덱스와 열 이름 지정
pd.DataFrame(zip(a, b), index = pd.Index(['aaa', 'bbb', 'ccc', 'ddd']), columns = ['col1', 'col2'])

# 결과
    col1    col2
aaa 10      a
bbb 30      g
ccc 20      h
ddd 40      c

혹은, 각 리스트를 value로 가지는 딕셔너리를 생성하여

바로 아래의 dict to DataFrame 방법을 응용할 수도 있습니다.

KevinFire2030 commented 1 year ago

https://zzinnam.tistory.com/entry/pandas-valuecounts-함수

krx['category'].value_counts()

보통주 2532 스팩 74 리츠 22

KevinFire2030 commented 1 year ago

Python Dataframe 조건 검색 where 사용 방법

https://ponyozzang.tistory.com/687

Dataframe에 저장한 데이터중 특정 값만 출력하고 싶은 경우가 있습니다.

이러한 경우에는 where() 사용해 조건과 일치하는 데이터 행만 출력할 수 있습니다.

where

where은 Dataframe 원하는 컬럼에 조건을 설정해 해당하는 데이터행의 값만 출력합니다.

샘플을 보겠습니다.

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [-20, -10, 0, 10, 20],
                   'B': [1, 2, 3, 4, 5],
                   'C': ['a', 'b', 'b', 'b', 'a']})

# DataFrame 샘플 데이터
#     A  B  C
# 0 -20  1  a
# 1 -10  2  b
# 2   0  3  b
# 3  10  4  b
# 4  20  5  a

print(df.where(df['C'] == 'a'))

결과

        A      B     C
0   -20.0   1.0      a
1   NaN  NaN  NaN
2   NaN  NaN  NaN
3   NaN  NaN  NaN
4   20.0    5.0      a

Dataframe C항목에 where 조건을 지정했습니다.

C항목 값이 a인 행 데이터만 출력하고 있습니다.

조건과 일치하지 않은 행은 NaN을 표시하고 있습니다.

NaN대신에 다른 값을 표기하고 싶은 경우에는 두 번째 파라미터를 지정합니다.

df.where(검색 조건, NaN 표시값)
import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [-20, -10, 0, 10, 20],
                   'B': [1, 2, 3, 4, 5],
                   'C': ['a', 'b', 'b', 'b', 'a']})

print(df.where(df['C'] == 'a', 0))

결과

    A    B   C
0  -20  1   a
1    0   0   0
2    0   0   0
3    0   0   0
4   20  5   a

조건과 일치하지 않은 데이터 행은 결측값 NaN대신에 0으로 출력하고 있습니다.

만약 조건과 일치하지 않은 결측값 NaN을 표시하고 싶지 않은 경우에는 dropna를 사용합니다.

자세한 내용은 아래를 참조해주세요.

Python DataFrame 결측값 제거 dropna 사용 방법

DataFrame에서 검색 조건을 지정해 조건과 일치하는 데이터만 찾고 싶은 경우 where()를 사용합니다. where()에 지정한 조건과 일치하는 데이터는 값이 표시가 됩니다. 조건과 일치하지 않는 데이터는

where 복수 조건 검색 조건을 복수로 설정하는 방법을 알아보겠습니다.

복수 조건으로 AND 조건 또는 OR 조건을 지정할 수 있습니다.

AND 조건 사용 방법을 알아보겠습니다.

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [-20, -10, 0, 10, 20],
                   'B': [1, 2, 3, 4, 5],
                   'C': ['a', 'b', 'b', 'b', 'a']})

print(df.where((df['C'] == 'a') & (df['A'] == 20)))

결과

      A     B     C
0 NaN NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN
3 NaN NaN NaN
4 20.0    5.0     a

검색조건은 C컬럼 값이 a이고 A컬럼 값에 20인 행만 출력하도록 하고 있습니다.

2개의 조건과 일치하는 데이터는 인덱스가 4인 행입니다.

나머지 데이터행은 NaN으로 표시되고 있습니다.

이번에는 OR 조건을 사용해 검색하는 방법을 알아보겠습니다.

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [-20, -10, 0, 10, 20],
                   'B': [1, 2, 3, 4, 5],
                   'C': ['a', 'b', 'b', 'b', 'a']})

print(df.where((df['C'] == 'a') | (df['A'] == 10)))

결과

        A      B      C
0  -20.0    1.0     a
1  NaN  NaN  NaN
2  NaN  NaN  NaN
3   10.0    4.0     b
4   20.0    5.0     a

검색 조건은 C컬럼 값이 a 또는 A컬럼 값이 10인 행만 출력하도록 하고 있습니다.

2개의 조건과 일치하는 데이터는 인덱스가 0,3,4인 행입니다.

조건과 일치하지 않는 데이터행은 NaN으로 표시되고 있습니다.

!=T 조건 값이 일치하지 않는 조건을 설정하는 방법을 보겠습니다.

값이 일치하는 조건으로는 == 를 사용합니다.

일치하지 않는 조건을 검색하고 싶은 경우에는 !=를 사용합니다.

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [-20, -10, 0, 10, 20],
                   'B': [1, 2, 3, 4, 5],
                   'C': ['a', 'b', 'b', 'b', 'a']})

print(df.where(df['C'] != 'a'))

결과

       A      B      C
0  NaN  NaN  NaN
1  -10.0   2.0       b
2     0.0   3.0       b
3   10.0   4.0       b
4  NaN  NaN  NaN

검색 조건으로 C컬럼의 값이 a가 아닌 데이터행은 검색하고 있습니다.

조건과 일치하는 데이터는 인덱스 1,2,3행입니다.

인덱스 0,4는 조건에 해당되지 않기 때문에 NaN으로 표시되고 있습니다.

KevinFire2030 commented 1 year ago

The above exception was the direct cause of the following exception: Traceback (most recent call last): File "D:\Anaconda3\envs\py39_32\lib\site-packages\pandas\core\indexes\base.py", line 3804, in get_loc raise KeyError(key) from err KeyError: 'state' python-BaseException

KevinFire2030 commented 1 year ago

image

D:\Anaconda3\envs\py39_32\python.exe "C:/Program Files/JetBrains/PyCharm Community Edition 2022.3.2/plugins/python-ce/helpers/pydev/pydevd.py" --multiprocess --qt-support=auto --client 127.0.0.1 --port 64285 --file D:\Fire2025\23W23\quantifia\PyMon.py 
Connected to pydev debugger (build 223.8617.48)
connected
보통주    2532
스팩       74
리츠       22
Name: category, dtype: int64
ok
0 / 2628
Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2022.3.2\plugins\python-ce\helpers\pydev\pydevd.py", line 1496, in _exec
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2022.3.2\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "D:\Fire2025\23W23\quantifia\PyMon.py", line 143, in <module>
    pymon.run()
  File "D:\Fire2025\23W23\quantifia\PyMon.py", line 134, in run
    if self.check_speedy_rising_volume(code):
  File "D:\Fire2025\23W23\quantifia\PyMon.py", line 97, in check_speedy_rising_volume
    df = self.get_ohlcv(code, today)
  File "D:\Fire2025\23W23\quantifia\PyMon.py", line 85, in get_ohlcv
    df = web.DataReader(code, 'naver', end=end)
  File "D:\Anaconda3\envs\py39_32\lib\site-packages\pandas\util\_decorators.py", line 211, in wrapper
    return func(*args, **kwargs)
  File "D:\Anaconda3\envs\py39_32\lib\site-packages\pandas_datareader\data.py", line 662, in DataReader
    return NaverDailyReader(
  File "D:\Anaconda3\envs\py39_32\lib\site-packages\pandas_datareader\base.py", line 253, in read
    df = self._read_one_data(self.url, params=self._get_params(self.symbols))
  File "D:\Anaconda3\envs\py39_32\lib\site-packages\pandas_datareader\naver.py", line 81, in _read_one_data
    prices = DataFrame(
  File "D:\Anaconda3\envs\py39_32\lib\site-packages\pandas\core\frame.py", line 738, in __init__
    data = list(data)
  File "D:\Anaconda3\envs\py39_32\lib\site-packages\pandas_datareader\naver.py", line 104, in _parse_xml_response
    root = ElementTree.fromstring(xml_content)
  File "D:\Anaconda3\envs\py39_32\lib\xml\etree\ElementTree.py", line 1349, in XML
    parser.feed(text)
xml.etree.ElementTree.ParseError: XML or text declaration not at start of entity: line 3, column 0
python-BaseException
KevinFire2030 commented 1 year ago

for i, code in enumerate(self.krx_codes['code']):

KevinFire2030 commented 1 year ago

code nan

image

image

KevinFire2030 commented 1 year ago

파이썬의 f-string으로 문자열 포멧팅하기

https://www.daleseo.com/python-f-strings/

기본 문법

파이썬에서 문자열은 아시는 것처럼 홈 따옴표나 쌍 따움표를 이용해서 나타내죠?

>>> "나는 문자열입니다."
'나는 문자열입니다.'
이러한 일반적인 문자열 앞에 f 또는 F 문자만 붙여주면 f-string이 됩니다.

>>> f"나는 f-string입니다."
'나는 f-string입니다.'

변수 치환

중괄호(brace)을 사용하면 f-string 안 에 파이썬의 표현식(expression)을 삽입할 수 있는데요.

>>> x = 1
>>> y = 2
>>> f"{x} + {y}는 {x + y}입니다."
'1 + 2는 3입니다.'

이처럼 문자열 안에 어떤 변수나 표현식을 삽입할 때 f-string의 진가가 발휘되기 시작합니다.

>>> first_name = "John"
>>> last_name = "Doe"
>>> f"Welcome, {first_name} {last_name}!"
'Welcome, John Doe!'

함수 호출

f-string을 사용하면 문자열 안에서 심지어 함수를 호출할 수 있습니다.

>>> word = "Python"
>>> f"{word}는 {len(word)}글자입니다."
'Python는 6글자입니다.'
>>> f"대문자로는 {word.upper()}이고, 소문자로는 {word.lower()}입니다."
'대문자로는 PYTHON이고, 소문자로는 python입니다.'
다른 표현식
사실 상 f-string을 사용하면 파이썬에서 상상할 수 있는 모든 표현식을 문자열 안에 삽입할 수 있기 때문에 활용도가 무궁무진하다고 볼 수 있습니다.

>>> word = "Python"
>>> f"{word}의 첫 두 글자는 {word[:2]}입니다."
'Python의 첫 두 글자는  Py입니다.'
>>> word = "Python"
>>> f"{word}를 거꾸로 하면 {word[::-1]}입니다."
'Python를 거꾸로 하면 nohtyP입니다.'
>>> f"3회 반복: {','.join([word] * 3)}"
'3회 반복: Python,Python,Python'
객체 치환
f-string 안 에서 객체를 사용하면 해당 객체를 상대로 str() 내장 함수를 호출된 결과가 삽입됩니다.

>>> from datetime import date
>>> f"오늘은 {date.today()}입니다."
'오늘은 2021-02-27입니다.'

str() 내장 함수 대신에 repr() 내장 함수가 호출된 결과를 삽입하고 싶다면 !r을 뒤에 붙여주면 됩니다.

>>> from datetime import date
>>> f"오늘은 {date.today()!r}입니다."
'오늘은 datetime.date(2021, 2, 27)입니다.'
참고로 보통 str() 내장 함수는 사람이 읽기 편한 형태로 객체를 문자열로 변환해주는 반면에, repr() 내장 함수는 디버깅하기 용이한 형태로 객체를 문자열로 변환해줍니다. 따라서 str() 내장 함수의 호출 결과가 디버깅하기에 부족하다면, !r을 활용해서 객체에 대한 좀 더 자세한 정보를 얻을 수 있을 수 있습니다.

디버깅

Python 3.8에서는 f-string을 좀 더 사용하기 편하도록 문법이 개선이 되었는데요.

기존에는 변수명과 변수값을 콘솔에 출력해볼 때, f-string 안 에 변수를 2번 사용했어야 했습니다.

>>> num = 1
>>> print(f"num={num}")
num=1

하지만 이제는 f-string 안 에 변수를 한 번만 사용해도 되기 때문에 디버깅할 때 특히 유용합니다.

>>> num = 1
>>> print(f"{num=}")
num=1
KevinFire2030 commented 1 year ago

KeyError: 532


            print(i, '/', num)
            if self.check_speedy_rising_volume(code):
                print(f"종목코드: {code}, 종목명: {self.krx_codes['company'][i]}")
                buy_list.append(code)

Traceback (most recent call last): File "D:\Anaconda3\envs\py39_32\lib\site-packages\pandas\core\indexes\base.py", line 3802, in get_loc return self._engine.get_loc(casted_key) File "pandas_libs\index.pyx", line 138, in pandas._libs.index.IndexEngine.get_loc File "pandas_libs\index.pyx", line 165, in pandas._libs.index.IndexEngine.get_loc File "pandas_libs\hashtable_class_helper.pxi", line 2263, in pandas._libs.hashtable.Int64HashTable.get_item File "pandas_libs\hashtable_class_helper.pxi", line 2273, in pandas._libs.hashtable.Int64HashTable.get_item KeyError: 532 The above exception was the direct cause of the following exception: Traceback (most recent call last): File "D:\Anaconda3\envs\py39_32\lib\site-packages\pandas\core\indexes\base.py", line 3804, in get_loc raise KeyError(key) from err KeyError: 532 python-BaseException

image

해결방법: krx.reset_index(drop=True, inplace=True)

image