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

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

詳細はこちら
CCXT

CCXT(CryptoCurrency eXchange Trading)は、ビットコインやアルトコインといった仮想通貨の売買を自動化するためのJavaScript/Python/PHP向けライブラリ。CCXTが取引所間のAPI差分を吸収することで、異なる取引所に共通した実装が可能です。

bitFlyer API

bitFlyer APIは、仮想通貨取引所bitFlyerが公開しているAIPツール。bitFlyer Lightning/API playground/chainFlyer/Echoの4種類あり、bitFlyerソフトをカスタマイズすることが可能です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python

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

pandas

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

Q&A

1回答

3225閲覧

[Python]ccxtで取得した板情報を整理してcsvに出せない

kei_124981

総合スコア11

CCXT

CCXT(CryptoCurrency eXchange Trading)は、ビットコインやアルトコインといった仮想通貨の売買を自動化するためのJavaScript/Python/PHP向けライブラリ。CCXTが取引所間のAPI差分を吸収することで、異なる取引所に共通した実装が可能です。

bitFlyer API

bitFlyer APIは、仮想通貨取引所bitFlyerが公開しているAIPツール。bitFlyer Lightning/API playground/chainFlyer/Echoの4種類あり、bitFlyerソフトをカスタマイズすることが可能です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python

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

pandas

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

0グッド

0クリップ

投稿2020/10/11 06:34

閲覧ありがとうございます。

Pythonで、ccxtから板情報を1秒ごとに取得し、1時間ごとcsvに出力するとというプログラムを書いています。

コードは以下になるのですが、型変換の部分が違うのかデータが取り出せません。

初心者なのでおかしな部分が多々あるかもしれませんが、お分かりになる方がいらっしゃればご助言いただきたいです。
よろしくお願いいたします。

python

1import ccxt 2import time 3from datetime import datetime as dt 4import pandas as pd 5import json 6import os 7import requests 8import json 9 10#ccxtから取引所を読み込む 11exchange = ccxt.bitflyer() 12exchange.load_markets() 13#通貨ペア 14symbol = 'BTC/JPY' 15order_book = exchange.fetch_order_book(symbol) 16#スリープ秒数 17sleep_t = 1 18#板の深さ 19depth = 5 20 21#板データ取得 22def get_board(): 23 data = order_book 24 #jsonデータを辞書型へ変換 25 board = json.loads(data.text) 26 #現在時刻の取得 27 dict_data = {'time' : dt.now()} 28 dict_data.update({'ask_price_{}'.format(i) : board['asks'][i]['price'] for i in range(depth)}) 29 dict_data.update({'ask_price_{}'.format(i) : board['asks'][i]['size'] for i in range(depth)}) 30 dict_data.update({'bid_price_{}'.format(i) : board['bids'][i]['price'] for i in range(depth)}) 31 dict_data.update({'bid_price_{}'.format(i) : board['bids'][i]['size'] for i in range(depth)}) 32 #辞書型をpandas seriesに変換 33 return pd.Series(dict_data) 34 35#ループ処理 36def get_coin_board(): 37 init_time = dt.now() 38 end_time = dt.now() 39 print('START /', init_time) 40 main_list = [] 41 while (end_time - init_time).seconds < 3600: 42 try: 43 #jsonデータをpandas seriesへ変換 44 dict_data = get_board() 45 #pandas seriesをリストへ追加 46 main_list.append(dict_data) 47 except Exception as e: 48 print('exception: ',e.args) 49 time.sleep(sleep_t) 50 end_time = dt.now() 51 #pandas seriesのリストを結合 52 df_data = pd.concat(main_list, axis=1).T 53 df_data.to_csv('./data/exchange_hourly_board_day_{}_init_{}_{}_end_{}_{}.csv'.format(init_time.day, init_time.hour, init_time.minute, end_time.hour, end_time.minute)) 54 print('END /', end_time) 55 56if __name__ == '__main__': 57 if not os.path.exists('./data'): 58 os.mkdir('./data') 59 while True: 60 try: 61 get_coin_board() 62 except Exception as e: 63 print('exception: ', e.args)

出力されたエラー
exception: ("'dict' object has no attribute 'text'",)

File "*******", line 62, in <module>
get_coin_board()

File "******", line 50, in get_coin_board
time.sleep(sleep_t)

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

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

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

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

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

meg_

2020/10/11 07:12 編集

エラーの発生元はどこでしょうか? 例外処理を使用されているので、どの行が問題なのか分かりかねます。 [追記] kairi003さんの回答を見ると「board = json.loads(data.text)」がエラー発生元のようですね。分かりました。
guest

回答1

0

bitFlyerやcctxのことは何も分からないので恐縮ですが、「dataは辞書型だからtextなんて属性は持ってない」と言われています。
このdataはexchange.fetch_order_book(symbol)で取得したorder_bookで、text属性に文字列型のjsonを持っているとしているようですが、推察するにorder_bookの時点で既にjsonは辞書型に展開されていて、json.loadsは不要なのではないでしょうか?

型変換が気になるならidleで動かしてみたりtype()で型名をチェックして見るといいと思います。

投稿2020/10/11 06:44

編集2020/10/11 07:26
kairi003

総合スコア1332

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

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

kei_124981

2020/10/12 14:33

ご回答ありがとうございます。 ご指摘の通り、抽出した時点で既に辞書型だったようです。 board = json.loads(data.text) この部分を削除し、boardの部分をdataに書き直したところ、以下のメッセージが出てきてしまいました。 'list indices must be integers or slices, not str', この場合、ccxtから送られてくるデータに適切にアクセスできていないということなのでしょうか? str型に変換してみたりしたのですが、対処のしかたがわかりませんでした。
kairi003

2020/10/12 14:37

多分どこか辞書型だと思ってる場所がリストです。 boardの中身の構造を一度確認し直したほうが良いと思います。 json.dumpsしてテキストファイルに書き出してエディタで見るか、pprintで見てみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問