json data parsing 시 오류 발생
안녕하세요 강사님, 패스트 캠퍼스 강의 수강 중 문의사항이 생겨 질문 드립니다.
현재 parsing_output(ex_id) 함수를 _run.log_scalar의 metrics 에서 json 읽을 경우 동일한 부분에서 다른 모델일 경우에도 계속해서 ValueError가 발생합니다.
metric_df=pd.DataFrame(json_data['metrics']['values'][0]['values']) 행에서 DataFrame constructor not properly called라고 계속 error가 발생합니다.
해당 json 파일 확인 결과 values 값이 mape,mae,mse\r\n410.6999624575988,47.991885136076206,13871.771004075945\r\n 이렇게 나와있는데 이스케이프 문자로 인한 오류인가요?
그렇지 않다면 어떻게 고쳐야 할지 알고 싶습니다.
현재는 ex.main함수에서 결과를 가져와 콘캣하는 식으로 코드 진행하고 있습니다.
아래는 현재 진행하고 있는 코드 일부입니다.
def parsing_run(ex_id): with open(f'./experiments/{ex_id}/run.json') as json_file: json_data = json.load(json_file) output = pd.DataFrame(json_data['result']) return output
def parsing_output(ex_id): with open(f'./experiments/{ex_id}/metrics.json') as json_file: json_data = json.load(json_file) with open(f'./experiments/{ex_id}/config.json') as config_file: config_data = json.load(config_file)
output_df = pd.DataFrame(json_data['model_name']['values'], columns=['model_name'], index=['score'])
output_df['experiment_num'] = ex_id
output_df['config'] = str(config_data)
output_df = pd.concat([output_df,parsing_run(ex_id)], axis=1)
return output_df
안녕하세요 :)
values 값들을 list로 감싸보시겠어요?
답변 감사합니다.
values 값들을 list로 감싸라는게 metrics.json 얘기하시는건가요?? metrics.json의 values 값을 list로 감싼 후에 실행하니 metric_df의 결과가 index, columns 가 각각 0이 생기고 해당 셀에 values에 있던 값들이 다 출력되네요. mape,mae,mse\r\n410.6999624575988,47.991885136076206,13871.771004075945\r\n 이런 식으로 출력이 됩니다..
안녕하세요 :)
정확한 상황을 파악하기 위해 노트북 파일과 experiment metrics.json을 업로드해주실 수 있으신가요~? 코드를 확인해보고 수정해드릴게요-!
저도 패스트 캠퍼스 동일한 강의를 듣고 싸이트에서 올려주신 코드를 실행할 때 동일한 에러가 발생합니다. 아래와 같이 metric_df 을 DataFrame으로 생성하는 부분에서 위의 분과 같은 오류가 나서 @ex.main의 함수에 결과를 return하는 경우의 두번째 parsing_output() 함수로 사용하고 있는데, 어느 부분을 수정해야 할까요? 수정한 코드로 패스트캠퍼스에 올려주시면 감사하겠습니다.
metric_df = pd.DataFrame(json_data['metrics']['values'][0]['values']) output_df = pd.concat([output_df, metric_df], axis=1)
오류메시지는 아래와 같습니다.
ValueError Traceback (most recent call last)
~\Anaconda3\lib\site-packages\pandas\core\frame.py in init(self, data, index, columns, dtype, copy) 483 ) 484 else: --> 485 raise ValueError("DataFrame constructor not properly called!") 486 487 NDFrame.init(self, mgr, fastpath=True)
ValueError: DataFrame constructor not properly called!
저 또한 같은 문제가 생겨 구글링해서 찾아보려해도 잘 못찾겠네요 ㅜㅜ text 형태로 저장돼서 DataFrame 형태로 불러오는게 안되는 것 같습니다.
@JinseoWoo 안녕하세요 :) 혹시 코드를 colab이나 https://nbviewer.jupyter.org/ 에 올려서 공유해주실 수 있으실까요~? 제가 가상환경에서 해봤는데 작동해서, 이 부분 해결해보고 싶네요..! 셀에서 !pip list 로 한번 쳐주셔서 버전을 알려주시면 좋을 것 같아요! :)
https://gist.github.com/JinseoWoo/840cc77f99f93f2805e1ff9a24cc17c1
nbviewer로 볼 수 있도록 했습니다!
실험 결과가 저장 될 때 _run.log_scalar('model_name', lr_reg.class.name) 이 명령은 기존 강의 내용대로 저장되는 것 같습니다.
_run.log_scalar('metrics', score) score를 저장하면 그 형태가 위에 이미지 처럼 meta 안에 string 형태로 저장되어 문제가 있는 것 같아요.
@JinseoWoo
안녕하세요! :)
- _run.log_scalar에 metrics에 저장하는 경우 다음과 같은 코드를 사용해보시겠어요?
여태 2) 의 함수에 대해 이야기하신 줄 알았는데, 같은 이름의 함수를 2개 만들었는데 앞에 있는 함수 이야기라는걸 방금 인지했네요..! 아래 코드를 사용하시면 정상적으로 돌아갈거에요-!
from io import StringIO
# 1) _run.log_scalar에 metrics을 저장하는 경우
def parsing_output(ex_id):
with open(f'./experiments/{ex_id}/metrics.json') as json_file:
json_data = json.load(json_file)
with open(f'./experiments/{ex_id}/config.json') as config_file:
config_data = json.load(config_file)
output_df = pd.DataFrame(json_data['model_name']['values'], columns=['model_name'], index=['score'])
output_df['experiment_num'] = ex_id
output_df['config'] = str(config_data)
values_data = StringIO(json_data['metrics']['values'][0]['values'])
metric_df = pd.read_csv(values_data)
output_df = pd.concat([output_df.reset_index(drop=True),
metric_df.reset_index(drop=True)], axis=1)
output_df = output_df.round(2)
return output_df
@zzsza 답변 너무 감사합니다~! 문제가 해결이 되었네요~! :)
한가지 더 질문드리고 싶은게 있습니다.
혹시 실험결과가 metrics.json에 저장될 때 meta 안에 들어가서 문자형태가 아닌 dictionary 형태로 저장하게 할 수 있나요..?
제가 구글링 여러번 해봤지만 답을 찾지 못하겠네요 ㅜㅜ