0

我有一个具有以下架构的 Pandas 数据框:

yyyy_mm_dd      datetime64[ns]
avg_score              float64
avg_response           float64
se_score               float64
se_response            float64
dtype: object

我尝试在 Jupyter 笔记本中使用 Matplotlib 绘制它:

fig = plt.figure(figsize=(10,6))
ax = fig.gca()
ax.errorbar(daily_aggs_df.yyyy_mm_dd, daily_aggs_df.avg_score, daily_aggs_df.se_score, label='model prediction')
ax.errorbar(daily_aggs_df.yyyy_mm_dd, daily_aggs_df.avg_response, daily_aggs_df.se_response, label='actual outcome')

但是我遇到了一个意外的异常:OverflowError: signed integer is less than minimum . 我该如何解决这个错误?

作为参考,正常调用ax.plot(...),没有错误时间序列,工作得很好。我正在使用 Pandas 0.23.1 版。

完整的异常堆栈跟踪:

---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
/opt/blue-python/2.7/lib/python2.7/site-packages/matplotlib/pyplot.pyc in post_execute()
    147             def post_execute():
    148                 if matplotlib.is_interactive():
--> 149                     draw_all()
    150 
    151             # IPython >= 2

/opt/blue-python/2.7/lib/python2.7/site-packages/matplotlib/_pylab_helpers.pyc in draw_all(cls, force)
    148         for f_mgr in cls.get_all_fig_managers():
    149             if force or f_mgr.canvas.figure.stale:
--> 150                 f_mgr.canvas.draw_idle()
    151 
    152 atexit.register(Gcf.destroy_all)

/opt/blue-python/2.7/lib/python2.7/site-packages/matplotlib/backend_bases.pyc in draw_idle(self, *args, **kwargs)
   2030         if not self._is_idle_drawing:
   2031             with self._idle_draw_cntx():
-> 2032                 self.draw(*args, **kwargs)
   2033 
   2034     def draw_cursor(self, event):

/opt/blue-python/2.7/lib/python2.7/site-packages/matplotlib/backends/backend_agg.pyc in draw(self)
    462 
    463         try:
--> 464             self.figure.draw(self.renderer)
    465         finally:
    466             RendererAgg.lock.release()

/opt/blue-python/2.7/lib/python2.7/site-packages/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)
     61     def draw_wrapper(artist, renderer, *args, **kwargs):
     62         before(artist, renderer)
---> 63         draw(artist, renderer, *args, **kwargs)
     64         after(artist, renderer)
     65 

/opt/blue-python/2.7/lib/python2.7/site-packages/matplotlib/figure.pyc in draw(self, renderer)
   1141 
   1142             mimage._draw_list_compositing_images(
-> 1143                 renderer, self, dsu, self.suppressComposite)
   1144 
   1145             renderer.close_group('figure')

/opt/blue-python/2.7/lib/python2.7/site-packages/matplotlib/image.pyc in _draw_list_compositing_images(renderer, parent, dsu, suppress_composite)
    137     if not_composite or not has_images:
    138         for zorder, a in dsu:
--> 139             a.draw(renderer)
    140     else:
    141         # Composite any adjacent images together

/opt/blue-python/2.7/lib/python2.7/site-packages/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)
     61     def draw_wrapper(artist, renderer, *args, **kwargs):
     62         before(artist, renderer)
---> 63         draw(artist, renderer, *args, **kwargs)
     64         after(artist, renderer)
     65 

/opt/blue-python/2.7/lib/python2.7/site-packages/matplotlib/axes/_base.pyc in draw(self, renderer, inframe)
   2407             renderer.stop_rasterizing()
   2408 
-> 2409         mimage._draw_list_compositing_images(renderer, self, dsu)
   2410 
   2411         renderer.close_group('axes')

/opt/blue-python/2.7/lib/python2.7/site-packages/matplotlib/image.pyc in _draw_list_compositing_images(renderer, parent, dsu, suppress_composite)
    137     if not_composite or not has_images:
    138         for zorder, a in dsu:
--> 139             a.draw(renderer)
    140     else:
    141         # Composite any adjacent images together

/opt/blue-python/2.7/lib/python2.7/site-packages/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)
     61     def draw_wrapper(artist, renderer, *args, **kwargs):
     62         before(artist, renderer)
---> 63         draw(artist, renderer, *args, **kwargs)
     64         after(artist, renderer)
     65 

/opt/blue-python/2.7/lib/python2.7/site-packages/matplotlib/axis.pyc in draw(self, renderer, *args, **kwargs)
   1134         renderer.open_group(__name__)
   1135 
-> 1136         ticks_to_draw = self._update_ticks(renderer)
   1137         ticklabelBoxes, ticklabelBoxes2 = self._get_tick_bboxes(ticks_to_draw,
   1138                                                                 renderer)

/opt/blue-python/2.7/lib/python2.7/site-packages/matplotlib/axis.pyc in _update_ticks(self, renderer)
    967 
    968         interval = self.get_view_interval()
--> 969         tick_tups = [t for t in self.iter_ticks()]
    970         if self._smart_bounds:
    971             # handle inverted limits

/opt/blue-python/2.7/lib/python2.7/site-packages/matplotlib/axis.pyc in iter_ticks(self)
    910         Iterate through all of the major and minor ticks.
    911         """
--> 912         majorLocs = self.major.locator()
    913         majorTicks = self.get_major_ticks(len(majorLocs))
    914         self.major.formatter.set_locs(majorLocs)

/opt/blue-python/2.7/lib/python2.7/site-packages/matplotlib/dates.pyc in __call__(self)
    981     def __call__(self):
    982         'Return the locations of the ticks'
--> 983         self.refresh()
    984         return self._locator()
    985 

/opt/blue-python/2.7/lib/python2.7/site-packages/matplotlib/dates.pyc in refresh(self)
   1001     def refresh(self):
   1002         'Refresh internal information based on current limits.'
-> 1003         dmin, dmax = self.viewlim_to_dt()
   1004         self._locator = self.get_locator(dmin, dmax)
   1005 

/opt/blue-python/2.7/lib/python2.7/site-packages/matplotlib/dates.pyc in viewlim_to_dt(self)
    758             vmin, vmax = vmax, vmin
    759 
--> 760         return num2date(vmin, self.tz), num2date(vmax, self.tz)
    761 
    762     def _get_unit(self):

/opt/blue-python/2.7/lib/python2.7/site-packages/matplotlib/dates.pyc in num2date(x, tz)
    399         tz = _get_rc_timezone()
    400     if not cbook.iterable(x):
--> 401         return _from_ordinalf(x, tz)
    402     else:
    403         x = np.asarray(x)

/opt/blue-python/2.7/lib/python2.7/site-packages/matplotlib/dates.pyc in _from_ordinalf(x, tz)
    252 
    253     ix = int(x)
--> 254     dt = datetime.datetime.fromordinal(ix).replace(tzinfo=UTC)
    255 
    256     remainder = float(x) - ix

OverflowError: signed integer is less than minimum
4

1 回答 1

0

我能够通过使用底层的 numpy datetime 数组来解决这个错误,而不是直接使用 Pandas 系列:

fig = plt.figure(figsize=(10,6))
ax = fig.gca()
ax.errorbar(daily_aggs_df.yyyy_mm_dd.values, daily_aggs_df.avg_score, daily_aggs_df.se_score, label='model prediction')
ax.errorbar(daily_aggs_df.yyyy_mm_dd.values, daily_aggs_df.avg_response, daily_aggs_df.se_response, label='actual outcome')

但我不知道为什么会这样。

于 2019-08-15T14:13:54.953 回答