Closed choco529 closed 3 years ago
저도 같은 문제가 있어서 코드 뜯어봤었는데 데이터 타입 정의 문제 때문인 것 같아서 그 부분만 고치고 사용하고 있습니다.
from datetime import datetime
import numpy as np
import pandas as pd
def marcap_data(start, end=None, code=None):
'''
지정한 기간 데이터 가져오기
:param datetime start: 시작일
:param datetime end: 종료일 (지정하지 않으면 시작일과 동일)
:param str code: 종목코드 (지정하지 않으면 모든 종목)
:return: DataFrame
'''
start = pd.to_datetime(start)
end = start if end==None else pd.to_datetime(end)
df_list = []
# dtypes={'Code':str, 'Name':str,
# 'Open':int, 'High':int, 'Low':int, 'Close':int, 'Volume':int, 'Amount':int,
# 'Changes':int, 'ChangeCode':str, 'ChagesRatio':float, 'Marcap':int, 'Stocks':int,
# 'MarketId':str, 'Market':str, 'Dept':str,
# 'Rank':int}
# Amount, Marcap을 int 타입으로 변환할 수 없다는 에러메시지 발생
dtypes={'Code':str, 'Name':str,
'Open':int, 'High':int, 'Low':int, 'Close':int, 'Volume':int, 'Amount':float,
'Changes':int, 'ChangeCode':str, 'ChagesRatio':float, 'Marcap':float, 'Stocks':int,
'MarketId':str, 'Market':str, 'Dept':str,
'Rank':int}
for year in range(start.year, end.year + 1):
try:
csv_file = 'marcap/data/marcap-%s.csv.gz' % (year)
df = pd.read_csv(csv_file, dtype=dtypes, parse_dates=['Date'])
df_list.append(df)
except Exception as e:
print(e)
pass
df_merged = pd.concat(df_list)
df_merged = df_merged[(start <= df_merged['Date']) & (df_merged['Date'] <= end)]
df_merged = df_merged.sort_values(['Date','Rank'])
if code:
df_merged = df_merged[code == df_merged['Code']]
df_merged.set_index('Date', inplace=True)
return df_merged[df_merged['Volume'] > 0]
우분투 리눅스(python: 3.8.8, pandas: 1.2.4)와 구글 Colab(python: 3.7.10, pandas: 1.1.5)에서 문제가 없었습니다.
윈도우 아나콘다(python: 3.7.6, pandas: 1.2.4, 1.2.5 둘 다)에서 위 에러가 발생하는 것을 확인하였습니다. pd.concat()에서 타입 변환에 따른 문제로 생각됩니다.
수정하여 사용하신 내용을 그대로 반영하였습니다.
이슈 라이징과 해결 답변 모두 감사합니다.
marcap_data 함수를 호출하면 다음과 같은 에러가 발생합니다.
df_list에 왜 데이터가 없는지 살펴봤더니 csv를 read할 때 다음과 같은 에러가 발생했었습니다.
TypeErrorTraceback (most recent call last) pandas_libs\parsers.pyx in pandas._libs.parsers.TextReader._convert_tokens()
TypeError: Cannot cast array from dtype('float64') to dtype('int32') according to the rule 'safe'
During handling of the above exception, another exception occurred:
ValueErrorTraceback (most recent call last)