質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
CCXT

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

JSON

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

Python

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

pandas

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

Q&A

解決済

1回答

544閲覧

配信される辞書型のデータを整理したい

kei_124981

総合スコア11

CCXT

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

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/17 05:07

編集2020/10/17 06:11

初心者のため方法がわかりません。
アイデアを下さい。

【やりたいこと】
APIから毎秒受け取る辞書型のデータを整えてcsvに1時間ごとに出力したい。
https://github.com/ccxt/ccxt/wiki/Manual
ここのfetc_order_bookを使いたいです。

【うまくいかない部分】
APIから受け取るのは以下の辞書型のデータです。

'bids': [[1197426.0, 0.03882239], [1197395.0, 0.0055], [1197394.0, 0.0741403], [1197392.0, 0.001], [1197341.0, 0.08875373], [1197320.0, 0.01999716], [1197310.0, 0.03551], [1197279.0, 0.001], [1197269.0, 0.05], [1197268.0, 0.2], [1197266.0, 0.01998774], [1197261.0, 0.02003151], [1197238.0, 0.03], [1197236.0, 0.01], [1197235.0, 0.17386665], [1197225.0, 0.001], [1197211.0, 0.02], [1197210.0, 0.05], [1197200.0, 0.21685433], [1197150.0, 0.102], [1197144.0, 0.00847]], 'asks': [[1197663.0, 0.002], [1197666.0, 0.132], [1197667.0, 0.0276], [1197699.0, 0.01], [1197700.0, 0.06941974], [1197748.0, 0.08315269], [1197759.0, 0.00425625], [1197794.0, 0.00117761], [1197815.0, 0.02003151], [1197824.0, 0.05], [1197825.0, 0.11], [1197831.0, 0.01], [1197837.0, 0.02], [1197845.0, 0.0251], [1197881.0, 0.01998774], [1197891.0, 0.02], [1197893.0, 0.15], [1197897.0, 0.01999716], [1197907.0, 0.03900977], [1197958.0, 0.001], [1197963.0, 0.15]]

これを、bidprice1:1197426.0,bidsize1:0.03882239...
という風にcsvに出したいので、それぞれの[]の中の1番目をprice2番目をsizeに関連付けたいのですが、うまくいきません。
自分で調べながら以下のコードを書いてみたのですが、以下のエラーが出てしまいます。
"'dict' object cannot be interpreted as an integer"

何か根本的な部分が間違っているのでしょうか。
こんな風に構成したらいいよ、といったような汎用的なアドバイスでも構いませんので、アドバイスいただけると幸いです。
よろしくお願いいたします。

python

1 2#板データの取得 3exchange = ccxt.bitflyer() 4exchange.load_markets() 5#通貨ペア 6symbol = 'BTC/JPY' 7#板の深さ 8limit = 10 9#スリープ秒数 10sleep = 1 11 12 13#板データの取得 14def get_board(): 15 order_book = exchange.fetch_order_book(symbol) 16 market_depth = exchange.fetch_order_book(symbol,limit) 17 dict_data = {'time' : dt.now()} #現在時刻の取得 18 dict_data.update({'ask_price_{}'.format(i): order_book['asks'][0][0] for i in range(market_depth)}) 19 dict_data.update({'ask_size_{}'.format(i): order_book['asks'][0][0] for i in range(market_depth)}) 20 dict_data.update({'bid_price_{}'.format(i): order_book['bids'][0][0] for i in range(market_depth)}) 21 dict_data.update({'bid_size_{}'.format(i): order_book['bids'][0][0] for i in range(market_depth)}) 22 return pd.Series(dict_data)

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

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

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

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

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

nto

2020/10/17 05:20 編集

ちなみにorder_book変数には何が代入されているのでしょうか?
kei_124981

2020/10/17 05:22

閲覧ありがとうございます。 以下になります。 exchange = ccxt.bitflyer() exchange.load_markets() #通貨ペア symbol = 'BTC/JPY' order_book = exchange.fetch_order_book(symbol)
Lhankor_Mhy

2020/10/17 05:37

depth には何が入っているのですか?
Lhankor_Mhy

2020/10/17 05:41

bidsize がご提示のコードにはないようですが、それは気にしなくていいですか?
Lhankor_Mhy

2020/10/17 05:43

asks というものも、提示データには含まれていないですが、これも無視してよいですか?
kei_124981

2020/10/17 05:48

閲覧ありがとうございます。 編集中のコードを間違えて載せていたので、掲載したコードをアップデートしました。 asksについて、わかりづらいですが、掲載したデータの中段右端あたりに['asks']とありました。
Lhankor_Mhy

2020/10/17 05:50

すみません、見落としていました。 エラーが出ているのは、 dict_data.update({'ask_price_{}'.format(i): order_book['asks'][0][0] for i in range(market_depth)} ↑この行という理解であっていますか?
Lhankor_Mhy

2020/10/17 05:50

あ、コードを変更されたのですね。 では、考え直します。
Lhankor_Mhy

2020/10/17 05:53

このコードに変更した後も、 list indices must be integers or slices, not str このエラーメッセージは変わっていないのですか?
nto

2020/10/17 06:11

market_depthは辞書型であり、range関数の引数として与える事ができるものではありません。 range関数は任意の数値を指定する事で、指定した範囲での数値を羅列する事ができる関数になります。 よくある例ではrange(len(データ))と、対象のデータの個数を数値としてrange関数の引数にする場合がありますが、len(market_depth)としたいという事でしょうか? ちなみにmarket_depthのデータ個数(キー個数)は5になります。
kei_124981

2020/10/17 06:12

考えて下さりありがとうございます。 たびたびすみません。今のコードで出るエラーは以下でした。 "'dict' object cannot be interpreted as an integer"
kei_124981

2020/10/17 06:13

エラーが出るのはご指摘の部分で間違いないと思います
kei_124981

2020/10/17 06:26

>>nto様 ご回答ありがとうございます。 辞書型だとrange使えないんですね。 意図としては、order_bookから受け取るbids側とasks側のそれぞれのデータの個数を指定したいと思ったのですが...そもそもrangeではだめということですね。
nto

2020/10/17 06:32 編集

rangeに何の値を与えたいのかがわからない為、質問者様が求める回答を出来ずにいる状態です。 それではorder_bookのbidsの個数とasksの個数分データを処理するという事でよろしかったでしょうか? となるとmarket_depthは今回の処理に使用しないという事になりますが、それであっていますか?
Lhankor_Mhy

2020/10/17 06:35 編集

ntoさんのおっしゃっているのは、そういうことではないと思いますよ。 market_depthが辞書だ、ということだと思います。 想定しているものが入っているかどうか、中身をご確認されては?
nto

2020/10/17 06:42 編集

あと、宜しければもう少し詳しくどの様な出力を求めているのか追記頂けますでしょうか。 [これを、bidprice1:1197426.0,bidsize1:0.03882239...という風にcsvに出したいので]という例だけでは、「ask_price_1やask_size_1はどこにいってしまったの?」と疑問が残ります。 数行程度でも構いませんので、もう少し具体的な出力例を挙げて頂けると助かります。
kei_124981

2020/10/17 06:47

ご回答ありがとうございます。 nto様がおっしゃる通り、やりたいことは両サイドの個数分のデータを処理したいということです。 market_depthから受け取るデータとorder_bookから受け取っているデータに違いがなかったので、rangeの部分が必要なかったのでしょうか。 他の方の書いたコードを参考にしながら書いたのですが、そもそもmarket_depthの記述がいらなかったのかもしれません。
kei_124981

2020/10/17 06:53

【出力に関して】 親身になって考えて下さってありがとうございます。 以下の様にできたらと思っています。 (受け取るデータ) 'bids': [[1197426.0, 0.03882239], [1197395.0, 0.0055] (csvへの出力) bid price1 bid size1  bid price2 bid size2 1197426.0 0.03882239 1197395.0 0.0055 このような形で、受け取った[]内のデータの1番目をprice、2番目をsizeとし、bidsからasksまで受け取るデータを羅列していきたいです。 横軸にask price1 ask size1....bid price10 bid size 10 縦軸が時間軸 のような形を想定しています。
guest

回答1

0

ベストアンサー

まずはエラーの要因としては修正依頼欄にも記述した様に
range関数の引数には整数のみ与える事が出来ますが、整数以外の引数を与えていた事がエラーの要因となります。

order_bookに格納されている'bids'リストとasksリストの内容を同時に取得し処理を行いたいならば
for [bid_price, bid_size], [ask_price, ask_size] in zip(order_book['bids'], order_book['asks']):
とすると、それぞれ順番に取得が可能な為同時に処理を行っていく事ができる様になります。
組み込み関数であるenumerate()を併用して何番目のデータを処理しているのか測れば良いでしょう。
ご質問者様が求めている通りの取得が出来ているかは分かりかねますが
今一度ご参考に実行してみていただき、まずはそこから手直しやデータの整形をしていきましょう。

python

1import ccxt 2from datetime import datetime as dt 3import pandas as pd 4 5 6#板データの取得 7exchange = ccxt.bitflyer() 8exchange.load_markets() 9#通貨ペア 10symbol = 'BTC/JPY' 11#板の深さ 12limit = 10 13#スリープ秒数 14sleep = 1 15 16def get_board(): 17 order_book = exchange.fetch_order_book(symbol) 18 dict_data = {'time' : dt.now()} #現在時刻の取得 19 20 # bidsの[price, size]、asksの[price, size]という形でzip関数を使用してそれぞれ処理を行っていく 21 for enum, [[bid_price, bid_size], [ask_price, ask_size]] in enumerate(zip(order_book['bids'], order_book['asks'])): 22 dict_data.update({f'ask_price_{enum}': ask_price}) 23 dict_data.update({f'ask_size_{enum}': ask_size}) 24 dict_data.update({f'bid_price_{enum}': bid_price}) 25 dict_data.update({f'bid_size_{enum}': ask_size}) 26 return pd.Series(dict_data) 27df = get_board()

投稿2020/10/17 07:01

nto

総合スコア1438

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

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

kei_124981

2020/10/17 11:48

nto様 丁寧なご回答本当にありがとうございます! お恥ずかしながらenumerate関数を初めて知りました。 今動かしてみてるところですが、できそうな気配です。 的確なアドバイスありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問