2015-11-12 16 views
9

私はパンダのデータフレームに基づいて基本散布図を作成しようとしています。しかし、スキャッタルルーチンを呼び出すと、 "TypeError:invalid type promotion"というエラーが発生します。問題を再現するためのサンプルコードを以下に示す:プロットしようとするパンダタイプのエラー

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 datetimeオブジェクトの使用をやめ、「Time」を浮動小数点にするのではなく、うまく動作することに注意してください。出力

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

やグラフで

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') 

だけで正常に見えます。私はdatetimeの使用が無効な型昇格エラーを引き起こしている理由について紛失していますか?私はPython 3.4.3とpandas 0.16.2を使用しています。

答えて

6

ありがとう@martinvseticka。あなたの評価はあなたが指摘した数字のコードに基づいて正しいと思います。私は、キーは、むしろ「プロット」より「plot_date」を呼び出しているように見える

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') 

を取得するにはもう少しあなたの微調整を簡素化することができた(と第三のサンプル点を追加しました)。これは配列を連結しようとしないmapplotlibに通知するようです。

+0

私はあなたがそれを解決してうれしいです。良い仕事:) –

+0

私はあなたの質問に完全な解決策を提供する場合、あなた自身の答えを受け入れることをお勧めします。これにより、問題が解決されたことがシステムに示されます。 –

3

これはあなたが探しているものですか?

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に従ってあなたの例を適用しようとしました。

スクリプトの問題はnumpytriesdf.Timedf.Valueシリーズを連結すると、1列が数値であり、第二の1がTimestampのインスタンスで構成されているので、それが新しい配列に適したタイプを見つけることができないということです。

+0

ええ、よく、私はこの問題を広く見ていましたが、これは解決策そのものではありませんが、私が知っているすべてです。 –

+0

ありがとう@martinvseticka。私は少しあなたの提案を更新することができました(下記参照)。これは確かに非直感的な動作です - 私はXとYの配列が異なるデータ型である可能性があると思います。 –

1

scatterプロットは、(さまざまなサイズのマーカーをプロットする能力として)plotまたはplot_dateでシミュレートできないいくつかの特性を持っています。タイプのリストにpandas.tslib.Timestamp:タイプの時系列の変換

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

ます。また、このような何かを行うことができます:散乱をプロットする前にdatetime.datetimeは私のためにトリックをした

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() 
2

別の方法があります、我々はシリーズを使用する必要があります。リストを時間だけ使用してください。

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') 
+0

あなたのアプローチもうまく動作します。私は図形のサイズを修正するためにそれを編集し、リストに明示的な呼び出しを削除しました(必要ではありません)。 –

0

私はハエで、文字列に日時列の型を変更しました:

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

と散布図は動作します。 よろしくです

関連する問題