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

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

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

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

pandas

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

Q&A

解決済

1回答

2545閲覧

pandasで範囲ごとの集計をしたい

taro_yamada

総合スコア55

Python

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

pandas

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

0グッド

0クリップ

投稿2020/09/29 05:58

編集2020/10/03 01:08

株価の板情報を基に、pandasのデータフレームで以下のようなファイルを作っています。
これを、現在値の2499.5を基準に0.1%刻み(変数にしたい)でqtyの合計の表に集計したいです。
indexの0から9が売りの気配、10から19が買いの気配です。

コードも自分で考えて打ち込んでみたものの全く話にならなそうだったので、いきなりご相談させていただきました。
イメージはpandas.pivot_table()に近いのですが、範囲で集計できなかったので、別の案を考えています。

price qty 0 2569.0 400.0 1 2560.0 400.0 2 2549.0 100.0 3 2536.0 300.0 4 2525.0 100.0 5 2524.0 100.0 6 2520.0 400.0 7 2510.0 100.0 8 2501.0 100.0 9 2500.0 9500.0 10 2499.0 2600.0 11 2480.0 300.0 12 2455.0 200.0 13 2451.0 100.0 14 2450.0 400.0 15 2400.0 200.0 16 2390.0 300.0 17 2380.0 1000.0 18 2350.0 500.0 19 2331.0 200.0
price qty 0 成行 400.0 1 それ以上 400.0 2 2517.0 100.0 3 2515.0 300.0 4 2512.0 100.0 5 2510.0 100.0 6 2507.0 400.0 7 2505.0 100.0 8 2502 100.0 9 2500.0 9500.0 ←現在値を基準に上下に0.1%ずつ幅を持たせて集計したい 10 2498.0 2600.0 11 2495.0 300.0 12 2493.0 200.0 13 2490.0 100.0 14 2488.0 400.0 15 2485.0 200.0 16 2383.0 300.0 17 2380.0 1000.0 18 それ以下 500.0 19 成行 200.0

追加でお願いします。
cutした後に1行減ってしまいます。
pandasの扱いに慣れていなくて、どのように処理すれば上手く集計できるのかわかりません。
色々と申し訳ありませんが、どうぞご教示ください。

df_refact.csv

1price,qty 2989.0,9200.0 3988.0,9400.0 4987.0,11400.0 5986.0,12600.0 6985.0,9300.0 7984.0,7200.0 8983.0,6100.0 9982.0,7800.0 10981.0,4800.0 11980.0,48600.0 12979.0,38800.0 13978.0,1200.0 14976.0,2400.0 15975.0,11600.0 16974.0,1000.0 17973.0,2100.0 18972.0,1600.0 19971.0,3100.0 20970.0,5400.0 21969.0,1700.0 22

after_cut.csv

1price,qty 2970.0,5400.0 3971.0,3100.0 4972.0,1600.0 5973.0,2100.0 6974.0,1000.0 7975.0,11600.0 8976.0,2400.0 90.0,0.0 10978.0,1200.0 11979.0,38800.0 12980.0,48600.0 13981.0,4800.0 14982.0,7800.0 15983.0,6100.0 16984.0,7200.0 17985.0,9300.0 18986.0,12600.0 19987.0,11400.0 20988.0,9400.0 21

li.csv

19.697000000000000455e+02 29.707000000000000455e+02 39.717000000000000455e+02 49.726000000000000227e+02 59.736000000000000227e+02 69.746000000000000227e+02 79.756000000000000227e+02 89.766000000000000227e+02 99.775000000000000000e+02 109.785000000000000000e+02 119.795000000000000000e+02 129.805000000000000000e+02 139.815000000000000000e+02 149.823999999999999773e+02 159.833999999999999773e+02 169.843999999999999773e+02 179.853999999999999773e+02 189.863999999999999773e+02 199.872999999999999545e+02 209.882999999999999545e+02 21

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

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

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

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

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

guest

回答1

0

ベストアンサー

ちょっとよくわかってないかも知れませんが、
基準値である2499.5の0.1%ずつの値刻みで集計していく方法です。

python

1import numpy as np 2import pandas as pd 3from io import StringIO 4 5s1 = '''price,qty 62569.0,400.0 72560.0,400.0 82549.0,100.0 92536.0,300.0 102525.0,100.0 112524.0,100.0 122520.0,400.0 132510.0,100.0 142501.0,100.0 152500.0,9500.0 162499.0,2600.0 172480.0,300.0 182455.0,200.0 192451.0,100.0 202450.0,400.0 212400.0,200.0 222390.0,300.0 232380.0,1000.0 242350.0,500.0 252331.0,200.0''' 26 27df = pd.read_csv(StringIO(s1)) 28 29start = 2499.5 30width = start * 0.001 31li = np.round(np.arange(start - (width * 10), start + (width * 10), width), decimals=1) 32df = df.groupby(pd.cut(df["price"], li, labels=li[1:])).sum() 33df = df.drop('price', axis=1).reset_index() 34 35print(df) 36''' 37 price qty 380 2477.0 0.0 391 2479.5 0.0 402 2482.0 300.0 413 2484.5 0.0 424 2487.0 0.0 435 2489.5 0.0 446 2492.0 0.0 457 2494.5 0.0 468 2497.0 0.0 479 2499.5 2600.0 4810 2502.0 9600.0 4911 2504.5 0.0 5012 2507.0 0.0 5113 2509.5 0.0 5214 2512.0 100.0 5315 2514.5 0.0 5416 2517.0 0.0 5517 2519.5 0.0 5618 2522.0 400.0 57'''

投稿2020/09/29 08:05

yureighost

総合スコア2183

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

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

taro_yamada

2020/09/29 08:21

なるほど、こうやるのか、、、と唸ってしまいました。 本当にありがとうございます。 今晩、これをベースにチューニングしてみたいと思います。 また、よろしくお願いいたします。
taro_yamada

2020/09/29 12:57

一つ追加で質問です。 jupiterNotebookで実行した時はうまくいったのですが、本番環境で実施したところ、下記のエラーが出て、liがうまく作れませんでした。 何かわかりますでしょうか? UnboundLocalError: local variable 'np' referenced before assignment
yureighost

2020/09/29 13:45

これはメソッド内などのローカルスコープで変数npを初期化する前に参照していないかというエラーです。 私のソース範囲ではそういったことを行っていないので、 別な処理でnpという変数で何か問題がないか調べてみてください。
taro_yamada

2020/09/29 14:27

私の初歩的なミスでした。修正できました。 ちなみに、もう一点すみません 今のやり方だと、なぜかstartの株価によってはarangeで生成されるレコードの数が変動します。 簡単な数学の問題なのかもしれませんが、固定させる方法について良いアイデアはないでしょうか?
taro_yamada

2020/09/29 15:37

度々すみません。10を10.5に修正したら上手く動きました。 ありがとうございました。
taro_yamada

2020/10/02 17:15

df = df.groupby(pd.cut(df["price"], li, labels=li[1:])).sum() やはり行のときにラベルとリストが合っていないせいか行が落ちてしまいます。 もう少しいい方法があるかもしれません・・・・
yureighost

2020/10/02 23:34

その説明だとどこに問題があるのか把握できません。 問題のある元データと結果データ、そして欲しい想定データなどを提示していただけると回答しやすいです。
taro_yamada

2020/10/03 15:22

しっかり調べたらわかりました。 リストを20個で固定したかったのですがarrangeでリストを作成すると小数点の処理でリストの数が変動するようで、linspaceを使ったら上手く動きました。 色々をありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問