Open KevinFire2030 opened 1 year ago
리스트를 데이터프레임으로 변환(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 방법을 응용할 수도 있습니다.
krx['category'].value_counts()
보통주 2532 스팩 74 리츠 22
https://ponyozzang.tistory.com/687
Dataframe에 저장한 데이터중 특정 값만 출력하고 싶은 경우가 있습니다.
이러한 경우에는 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으로 표시되고 있습니다.
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
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
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
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
https://quantifia.com/퀀트-투자를-이해하기-첫걸음부터-전략까지/