【问题标题】:Pandas type error trying to plot试图绘制的熊猫类型错误
【发布时间】:2016-02-14 01:58:29
【问题描述】:

我正在尝试基于 Pandas 数据框创建基本散点图。但是当我调用分散例程时,我收到一个错误“TypeError:无效类型提升”。重现问题的示例代码如下所示:

t1 = pd.to_datetime('2015-11-01 00:00:00')
t2 = pd.to_datetime('2015-11-02 00:00:00')

Time = pd.Series([t1, t2])
r = pd.Series([-1, 1])

df = pd.DataFrame({'Time': Time, 'Value': r})
print(df)

print(type(df.Time))
print(type(df.Time[0]))

fig = plt.figure(figsize=(x_size,y_size))
ax = fig.add_subplot(111)
ax.scatter(df.Time, y=df.Value, marker='o')

结果输出是

        Time  Value
0 2015-11-01     -1
1 2015-11-02      1
<class 'pandas.core.series.Series'>
<class 'pandas.tslib.Timestamp'>

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-285-f4ed0443bf4d> in <module>()
     15 fig = plt.figure(figsize=(x_size,y_size))
     16 ax = fig.add_subplot(111)
---> 17 ax.scatter(df.Time, y=df.Value, marker='o')

C:\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py in scatter(self, x,    y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, **kwargs)
   3635             edgecolors = 'face'
   3636 
-> 3637         offsets = np.dstack((x, y))
   3638 
   3639         collection = mcoll.PathCollection(

C:\Anaconda3\lib\site-packages\numpy\lib\shape_base.py in dstack(tup)
    365 
    366     """
--> 367     return _nx.concatenate([atleast_3d(_m) for _m in tup], 2)
    368 
    369 def _replace_zero_by_x_arrays(sub_arys):

TypeError: invalid type promotion

四处搜索我发现了一个类似的帖子Pandas Series TypeError and ValueError when using datetime,这表明该错误是由该系列中的多种数据类型引起的。但这似乎不是我的示例中的问题,正如我打印的类型信息所证明的那样。

请注意,如果我停止使用 pandas 日期时间对象并将“时间”设为浮点数,则可以正常工作,例如

t1 = 1.1 #
t2 = 1.2

Time = pd.Series([t1, t2])
r = pd.Series([-1, 1])

df = pd.DataFrame({'Time': Time, 'Value': r})
print(df)

print(type(df.Time))
print(type(df.Time[0]))

fig = plt.figure(figsize=(x_size,y_size))
ax = fig.add_subplot(111)
ax.scatter(df.Time, y=df.Value, marker='o')

有输出

   Time  Value
0   1.1     -1
1   1.2      1
<class 'pandas.core.series.Series'>
<class 'numpy.float64'>

图表看起来还不错。我不知道为什么使用日期时间会导致无效类型提升错误?我正在使用 Python 3.4.3 和 pandas 0.16.2。

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    以上所有答案都很棒。但是,就我而言,错误是通过更新库来修复的。您可以通过 Conda 终端使用以下命令执行此操作, 康达更新--全部

    【讨论】:

      【解决方案2】:

      我已将 datetime 列的类型更改为运行中的字符串:

      plt.scatter(df['Date'].astype('str'), df['Category'], s=df['count'])
      

      散点图有效。 问候

      【讨论】:

        【解决方案3】:

        还有另一种方式,我们应该放弃使用 Series。只需使用列表时间。

        t1 = pd.to_datetime('2015-11-01 00:00:00')
        t2 = pd.to_datetime('2015-11-02 00:00:00')
        
        Time = pd.Series([t1, t2])
        r = pd.Series([-1, 1])
        
        df = pd.DataFrame({'Time': Time, 'Value': r})
        print(df)
        
        print(type(df.Time))
        print(type(df.Time[0]))
        x_size = 800
        y_size = 600
        fig = plt.figure(figsize=(x_size,y_size))
        ax = fig.add_subplot(111)
        ax.scatter(list(df.Time.values), list(df.Value.values), marker='o')
        

        【讨论】:

        • 你的方法也很有效。我对其进行了编辑以修复图形大小并删除了对列表的显式调用(不是必需的)。
        • 这对我也很有效,非常感谢。但是列表可以使用吗?这样 Matplotlib 就不会尝试修改它们?
        【解决方案4】:

        你也可以这样做:

            import matplotlib.pyplot as plt
            import numpy as np
            import pandas as pd
            import datetime
        
            df = pd.DataFrame({"Time":["2015-11-01 00:00:00", "2015-11-02 00:00:00"], "value":[ 1, -1]})
            df['Time'] = pd.to_datetime(df['Time'])
            fig, ax = plt.subplots()
            ax.scatter(np.arange(len(df['Time'])), df['value'], marker='o')
            ax.xaxis.set_ticks(np.arange(len(df['Time'])))
            ax.xaxis.set_ticklabels(df['Time'], rotation=90)
            plt.xlabel("Time")
            plt.ylabel("value")
        
            plt.show()
        

        【讨论】:

          【解决方案5】:

          scatter 绘图有一些在plotplot_date 中无法模拟的属性(作为绘制不同大小标记的能力)。

          在绘制散点图之前将类型为:pandas.tslib.Timestamp 的时间序列转换为类型为:datetime.datetime 的列表对我有用:

          times = [d.to_pydatetime() for d in df.Time]]
          ax.scatter(times, y=df.Value, marker='o')
          

          【讨论】:

            【解决方案6】:

            感谢@martinvseticka。根据您指出的 numpy 代码,我认为您的评估是正确的。我能够进一步简化您的调整(并添加了第三个样本点)以获得

            t1 = pd.to_datetime('2015-11-01 00:00:00')
            t2 = pd.to_datetime('2015-11-02 00:00:00')
            t3 = pd.to_datetime('2015-11-03 00:00:00')
            
            Time = pd.Series([t1, t2, t3])
            r = pd.Series([-1, 1, 0.5])
            
            df = pd.DataFrame({'Time': Time, 'Value': r})
            
            fig = plt.figure(figsize=(x_size,y_size))
            ax = fig.add_subplot(111)
            ax.plot_date(x=df.Time, y=df.Value, marker='o')
            

            关键似乎是调用“plot_date”而不是“plot”。这似乎告诉 mapplotlib 不要尝试连接数组。

            【讨论】:

              【解决方案7】:

              这是你要找的吗?

              import numpy as np
              import pandas as pd
              import matplotlib.pyplot as plt 
              import matplotlib.dates as dates
              
              t1 = pd.to_datetime('2015-11-01 00:00:00')
              t2 = pd.to_datetime('2015-11-02 00:00:00')
              
              idx = pd.Series([t1, t2])
              s = pd.Series([-1, 1], index=idx)
              
              fig, ax = plt.subplots()
              ax.plot_date(idx, s, 'v-')
              plt.tight_layout()
              plt.show()
              

              我是 Python 新手,所以希望我没有错。基本上,我尝试根据https://stackoverflow.com/a/13674286/99256 调整您的示例。

              您的脚本的问题是 numpy tries 连接 df.Timedf.Value 系列,它找不到适合新数组的类型,因为一个数组是数字的,第二个是组合的Timestamp 个实例。

              【讨论】:

              • 是的,我正在广泛研究这个问题,这就是我所知道的全部内容,尽管它本身并不是一个解决方案。
              • 谢谢@martinvseticka。我能够稍微更新您的建议(见下文)。这当然是不直观的行为——我原以为 X 和 Y 数组可能是不同的数据类型。
              猜你喜欢
              • 1970-01-01
              • 2018-05-07
              • 2017-11-28
              • 2018-07-05
              • 1970-01-01
              • 1970-01-01
              • 2017-06-08
              • 2016-04-21
              • 2017-09-24
              相关资源
              最近更新 更多