🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

6243閲覧

「TypeError: Expect data.index as DatetimeIndex」のエラーが消えない

ogiogimaru

総合スコア39

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/12/23 07:42

Pythonを学習中のものです。APIについての勉強中、為替チャートを表示するプログラムを書いていました。
APIからの情報は以下のように抜き取ることができました。(これはdfをいうリストに保存してあります。)

open high low close time time_id

0 139.632 139.632 139.560 139.628 2017-01-13 07:15:00+00:00 1
1 139.625 139.642 139.551 139.568 2017-01-13 07:20:00+00:00 2
2 139.567 139.596 139.473 139.493 2017-01-13 07:25:00+00:00 3
3 139.493 139.596 139.452 139.580 2017-01-13 07:30:00+00:00 4
4 139.580 139.606 139.542 139.554 2017-01-13 07:35:00+00:00 5
.. ... ... ... ... ... ...
283 136.843 136.997 136.838 136.972 2017-01-16 06:50:00+00:00 284
284 136.968 137.009 136.931 136.957 2017-01-16 06:55:00+00:00 285
285 136.955 137.022 136.800 136.880 2017-01-16 07:00:00+00:00 286
286 136.881 136.944 136.818 136.850 2017-01-16 07:05:00+00:00 287
287 136.856 136.872 136.717 136.813 2017-01-16 07:10:00+00:00 288

APIからは情報を抜き取ることに成功し、いざプロットしようといったところで以下のエラーが発生しました。

Traceback (most recent call last):

File "C:\Users\yagla\Program_lessons\Python\oanda.py", line 44, in <module>
mpf.plot(df, type = "candle")
File "C:\Users\yagla\AppData\Local\Programs\Python\Python39\lib\site-packages\mplfinance\plotting.py", line 275, in plot
dates,opens,highs,lows,closes,volumes = _check_and_prepare_data(data, config)
File "C:\Users\yagla\AppData\Local\Programs\Python\Python39\lib\site-packages\mplfinance_arg_validators.py", line 29, in _check_and_prepare_data
raise TypeError('Expect data.index as DatetimeIndex')
TypeError: Expect data.index as DatetimeIndex

DatetimeIndexが設定されていないからだと思い、以下のコードを追加しました。

df.set_index('time_id', inplace = True)

しかし、依然としてエラーは出続けました。いったい何がダメなのでしょうか。何卒ご教授お願いいたします。

以下は全コードです。

import pandas as pd import numpy as np import datetime import matplotlib.pyplot as plt import mplfinance as mpf from oandapyV20 import API import oandapyV20.endpoints.instruments as instruments days = 1 amount_candles = int(days * 24 * 60 / 5) # 表示するローソク足の全本数 display_time = amount_candles * 5 # 表示する時間 now_time = datetime.datetime.now() - datetime.timedelta(hours = 9) # 日本時間 start_time = now_time - datetime.timedelta(display_time) # 表示の開始時間 start_time = start_time.strftime("%Y-%m-%dT%H:%M:00.000000Z") # 要求する情報 params = { "alignmentTimezone": "Japan", "from": start_time, "count": amount_candles, "granularity": "M5" } # APIにアクセス access_token = "3127ccabb13084358520fe34701cfa5d-e225ccabf4340db5236500eccdda190b" api = API(access_token = access_token, environment = "practice") # 情報を要求 request = instruments.InstrumentsCandles( instrument = "GBP_JPY", params = params ) response = api.request(request) # データを形成 df = pd.DataFrame([row["mid"] for row in response['candles'] ]) # リスト内表記でresponseの中のcandlesの中のmidを新たなリストdfとして保存 df = df.astype(np.float64) df.columns = ["Open", "High", "Low", "Close"] df["time"] = [row["time"] for row in response["candles"]] df["time"] = pd.to_datetime(df["time"]).astype(str) # 冗長な日時データを短縮整形(文字型に変換) df["time_id"] = [i + 1 for i in range(len(response["candles"]))] df.set_index('time_id', inplace = True) mpf.plot(df, type = "candle")

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

IndexはDatetimeIndexでなければなりません、というエラーメッセージです。

ogiogimaruさんの処理では、df.indexはInt64Indexなので改善しません。

python

1>>> df.set_index('time_id', inplace = True) 2>>> print(type(df.index)) 3<class 'pandas.core.indexes.numeric.Int64Index'>

'time_id'ではなく'time'をindexに設定すれば、df.indexがDatetimeIndexになるので、このエラーメッセージは出なくなります。

python

1>>> df.set_index('time', inplace = True) 2>>> print(type(df.index)) 3<class 'pandas.core.indexes.datetimes.DatetimeIndex'>

投稿2020/12/28 10:52

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ogiogimaru

2020/12/29 04:19

ありがとうございました! 改善できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問