• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

103LinearRegressionMarathonWinner.py 코드가 실행이 안되네요

19.09.12 00:17 작성 조회수 120

0

코드를 실행하면

"sys:1: DtypeWarning: Columns (1) have mixed types. Specify dtype option on import or set low_memory=False." 메세지가 뜨면서 아래와 같이 왼쪽만 그림이 뜨고, 

"Get History"버튼을 클릭하면 아래와 같은 에러가 뜨면서 실행이 안되네요.. 에러의 원인을 해결 못하겠습니다. 확인좀 부탁드리겠습니다. 

Exception in Tkinter callback

Traceback (most recent call last):

  File "/anaconda3/lib/python3.6/tkinter/__init__.py", line 1702, in __call__

    return self.func(*args)

  File "/anaconda3/lib/python3.6/tkinter/__init__.py", line 746, in callit

    func(*args)

  File "/anaconda3/lib/python3.6/site-packages/matplotlib/backends/_backend_tk.py", line 88, in _on_timer

    TimerBase._on_timer(self)

  File "/anaconda3/lib/python3.6/site-packages/matplotlib/backend_bases.py", line 1373, in _on_timer

    ret = func(*args, **kwargs)

  File "/anaconda3/lib/python3.6/site-packages/matplotlib/animation.py", line 1481, in _step

    still_going = Animation._step(self, *args)

  File "/anaconda3/lib/python3.6/site-packages/matplotlib/animation.py", line 1217, in _step

    self._draw_next_frame(framedata, self._blit)

  File "/anaconda3/lib/python3.6/site-packages/matplotlib/animation.py", line 1236, in _draw_next_frame

    self._draw_frame(framedata)

  File "/anaconda3/lib/python3.6/site-packages/matplotlib/animation.py", line 1772, in _draw_frame

    self._drawn_artists = self._func(framedata, *self._args)

  File "103LinearRegressionMarathonWinner.py", line 68, in animateFrame

    ax.annotate(seconds_to_hhmmss(t_y), (t_x, t_y), fontsize=8)

  File "103LinearRegressionMarathonWinner.py", line 46, in seconds_to_hhmmss

    hours = seconds // (60*60)

TypeError: unsupported operand type(s) for //: 'str' and 'int'

답변 1

답변을 작성해보세요.

0

안녕하세요? 자세한 정보주셔서 감사합니다.

같은 소스코드도 사용하는 컴퓨터 OS, CPU, 메모리 등 환경에 따라 차이가 있을 수 있는데,

위의 내용을 보면 원인은,

Pandas에서 CSV 데이터를 가져올 때 data type을 Str형태로 가져와서 생기는 문제로 보입니다.

"sys:1: DtypeWarning: Columns (1) have mixed types. ....

Pandas에서 read_csv()를 그냥 사용하면 Pandas가 파일을 다 읽고나면 column의 Data Type을 자동으로 판단합니다. 그러지 못할 경우나 원하지 않는 방식으로 판단하는 경우를 막기위해서 명시적으로 dtype을 선언해 줍니다.

제가 몇 대의 컴퓨터에서 테스트 했을 때는 read_csv()실행 후 숫자값을 int로 알아서 가져와서 굳이 dtype을 명시해주지 않았으나 이 경우에는 pd.read_csv("./data/marathon_2015_2017.csv") 실행 시 dtype을 명시적으로 선언해 줘야할 것 같습니다.

값을 str으로 가져왔기 때문에 나중에 46번째 줄을 실행할 때 아래의 에러가 뜨는 것이겠지요?

TypeError: unsupported operand type(s) for //: 'str' and 'int'

예제코드 12번째 줄을 아래와 같이 바꾸고 실행해 보시겠습니까?

marathon_2015_2017 = pd.read_csv("./data/marathon_2015_2017.csv", dtype={'5K': int,'10K': int,'15K': int,'20K': int,'Half': int,'25K': int,'30K': int,'35K': int,'40K': int,'Official Time': int})

사용할 모든 column의 Data Type을 CSV에서 가져올 때 Pandas에게 명시적으로 int값으로 가져오라고 명령하는 것이지요.

제 환경에서는 실행이 잘 되는데(기존에도 잘 됐지만), 실행해 보시고 문제가 해결되면 사용하시는 PC의 OS, CPU, 메모리 정보와 같이 결과를 알려주시면 감사하겠습니다.  필요하면 관련 내용을 보완하고 수강생들에게 모두 공지하도록 하겠습니다.

그리고 혹시 "./data/marathon_2015_2017.csv"파일은 제 위치에 놓아두신건지 다시 확인바랍니다.

좋은 정보 다시한번 감사드리며 건승하시길 기원합니다.