時系列データをグラフにプロットするときのエラー

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,021

harunouta

score 115

 前提・実現したいこと

あるデータセットから横軸が日時で、縦軸が数値のグラフを描画しようとしています。
データセットの例はこのようになっています。
csv形式で読み込んだ時には、どちらもobject型になっておりました。

データセットに読み込むところのコード

#read csv
import pandas as pd
pd.set_option('display.max_columns', 8)
df = pd.read_csv("sample.csv" , encoding='cp932', header=None)


他に日本語のデータも含まれており、文字化けを防ぐためにこのencodingにしてあります。

2017/1/1    8645
2017/1/2    9600
2017/1/3    0193
2017/1/4    0100
2017/1/5    8093
2017/1/6    0195

以下のようにしてobject型をdatetime64[ns]型にすることはできました。

df[0] = pd.to_datetime(df[0]) 

 発生している問題・エラーメッセージ

①まず、縦軸の数値のデータセットをobject型からint型に変換する時に以下のエラーが起こって、変換ができていません。

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-47-b8e01bf2393d> in <module>()
      1 #objectint型に
----> 2 df[4] = df[1].astype(int) 

~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/pandas/util/_decorators.py in wrapper(*args, **kwargs)
     89                 else:
     90                     kwargs[new_arg_name] = new_arg_value
---> 91             return func(*args, **kwargs)
     92         return wrapper
     93     return _deprecate_kwarg

~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/pandas/core/generic.py in astype(self, dtype, copy, errors, **kwargs)
   3408         # else, only a single dtype is given
   3409         new_data = self._data.astype(dtype=dtype, copy=copy, errors=errors,
-> 3410                                      **kwargs)
   3411         return self._constructor(new_data).__finalize__(self)
   3412 

~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/pandas/core/internals.py in astype(self, dtype, **kwargs)
   3222 
   3223     def astype(self, dtype, **kwargs):
-> 3224         return self.apply('astype', dtype=dtype, **kwargs)
   3225 
   3226     def convert(self, **kwargs):

~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/pandas/core/internals.py in apply(self, f, axes, filter, do_integrity_check, consolidate, **kwargs)
   3089 
   3090             kwargs['mgr'] = self
-> 3091             applied = getattr(b, f)(**kwargs)
   3092             result_blocks = _extend_blocks(applied, result_blocks)
   3093 

~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/pandas/core/internals.py in astype(self, dtype, copy, errors, values, **kwargs)
    469     def astype(self, dtype, copy=False, errors='raise', values=None, **kwargs):
    470         return self._astype(dtype, copy=copy, errors=errors, values=values,
--> 471                             **kwargs)
    472 
    473     def _astype(self, dtype, copy=False, errors='raise', values=None,

~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/pandas/core/internals.py in _astype(self, dtype, copy, errors, values, klass, mgr, raise_on_error, **kwargs)
    519 
    520                 # _astype_nansafe works fine with 1-d only
--> 521                 values = astype_nansafe(values.ravel(), dtype, copy=True)
    522                 values = values.reshape(self.shape)
    523 

~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/pandas/core/dtypes/cast.py in astype_nansafe(arr, dtype, copy)
    623     elif arr.dtype == np.object_ and np.issubdtype(dtype.type, np.integer):
    624         # work around NumPy brokenness, #1987
--> 625         return lib.astype_intsafe(arr.ravel(), dtype).reshape(arr.shape)
    626 
    627     if dtype.name in ("datetime64", "timedelta64"):

pandas/_libs/lib.pyx in pandas._libs.lib.astype_intsafe()

pandas/_libs/src/util.pxd in util.set_value_at_unsafe()

ValueError: invalid literal for int() with base 10: '    '


②int型になっている他のカラムとdatetime64[ns]型の時系列データを描画しようとしたところ、以下のエラーが出てしまいました。

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-35-9ffca3834b6d> in <module>()
      2 x= df[1]
      3 y = df[13]
----> 4 plt.scatter(x, y)
      5 show()

~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/matplotlib/pyplot.py in scatter(x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, edgecolors, hold, data, **kwargs)
   3355                          vmin=vmin, vmax=vmax, alpha=alpha,
   3356                          linewidths=linewidths, verts=verts,
-> 3357                          edgecolors=edgecolors, data=data, **kwargs)
   3358     finally:
   3359         ax._hold = washold

~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/matplotlib/__init__.py in inner(ax, *args, **kwargs)
   1708                     warnings.warn(msg % (label_namer, func.__name__),
   1709                                   RuntimeWarning, stacklevel=2)
-> 1710             return func(ax, *args, **kwargs)
   1711         pre_doc = inner.__doc__
   1712         if pre_doc is None:

~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/matplotlib/axes/_axes.py in scatter(self, x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, edgecolors, **kwargs)
   4085             linewidths = rcParams['lines.linewidth']
   4086 
-> 4087         offsets = np.column_stack([x, y])
   4088 
   4089         collection = mcoll.PathCollection(

~/.pyenv/versions/anaconda3-5.0.1/lib/python3.6/site-packages/numpy/lib/shape_base.py in column_stack(tup)
    351             arr = array(arr, copy=False, subok=True, ndmin=2).T
    352         arrays.append(arr)
--> 353     return _nx.concatenate(arrays, 1)
    354 
    355 def dstack(tup):

TypeError: invalid type promotion

 該当のソースコード

import pandas as pd
#objectをint型に
df[2]= df[2].astype(int) 

import matplotlib.pyplot as plt
import numpy as np
x= df[1] #datetime64[ns]型の時系列データ
y = df[13] #int型
plt.scatter(x, y)
show()

 試したこと

以下はデータセットではなく、配列にしてありますが、
簡易版ではエラーが起きることなくプロットすることができました。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from pylab import *
from pylab import rcParams

df_1 = ['2017-01-01', '2017-01-02', '2017-01-03']
df_2 = {'000', '010', '011'}
df_1 = [pd.to_datetime(s) for s in df_1]
df_2  = [int(s) for s in df_2]


x= df_1
y = df_2 

plt.scatter(x, y)
show()

 補足情報(FW/ツールのバージョンなど)

Python 3.6.0 :: Anaconda 4.3.0

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • harunouta

    2018/08/13 00:15

    ご質問いただきましてありがとうございます。csv形式のデータセットで、数値もobjectになっていたため、データセット本体のサンプルが再現できない状態にあります。

    キャンセル

  • y_waiwai

    2018/08/13 00:19

    csv形式のデータセット、というのは意味不明です。csvファイルをデータセットに読み込むところのコードを提示してください

    キャンセル

  • harunouta

    2018/08/13 07:22

    コメントいただきましてありがとうございます。質問内容を編集させていただきました、

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる