MENU

Github無料講座(crypto-data-analysis-course)をしました(2026年6月23日)

GIthubにアップロードしてくれていた(crypto-data-analysis-course)の vol01_data_acquisition_and_cleansing.ipynb を読みました。
そのうち、

# 出来高がゼロの足が連続している場合、取引停止やデータ欠損の兆候

zero_volume = df_1h[df_1h['volume'] == 0]
print(f"=== 出来高ゼロのチェック === ")
print(f" 出来高ゼロの足: {len(zero_volume)} 件 / {len(df_1h):,} 件")
if len(zero_volume) > 0:

# 連続ゼロの検出

is_zero = (df_1h['volume'] == 0).astype(int)
consecutive = is_zero.groupby((is_zero != is_zero.shift()).cumsum()).cumsum()
max_consecutive = consecutive.max()
print(f" 最大連続ゼロ: {max_consecutive} 本")
if max_consecutive >= 3:
print(" ⚠️ 3本以上の連続ゼロ出来高があります。取引停止の可能性があるため要調査")
print(f"\n出来高ゼロの行:")
print(zero_volume[['close', 'volume']].head(10).to_string())
else:
print("→ 出来高ゼロの足はなし(正常)")

consecutive = is_zero.groupby((is_zero != is_zero.shift()).cumsum()).cumsum()

部分が何度やって読み解いてもよく分からなかったので、考えていこうと思います。

目次

consecutive = is_zero.groupby((is_zero != is_zero.shift()).cumsum()).cumsum() とは

まず、このまま眺めていてもよく分からないので、分解します。

# 1つ前の行と値が変わった場所を True にする
is_changed = is_zero != is_zero.shift()

# 値が変わるたびにグループ番号を増やす
group_id = is_changed.cumsum()

# グループごとに累積和を取る
# これにより、ゼロ出来高が 1, 2, 3... と数えられる
consecutive = is_zero.groupby(group_id).cumsum()

順番に見ていきます。


is_changed = is_zero != is_zero.shift()

これは、右側の

is_zero != is_zero.shift()

は条件ですね。この結果を

is_changed

に代入するというコードのようです。
では、

is_zero != is_zero.shift()

は何を言っているのでしょうか?
例をもちいて考えていきます。

時点is_zerois_zero.shift()
10Nan
200
310
411
511
601
710
811
901

この
is_zero

is_zero.shift()

!=
の時、つまり、
is_zero

is_zero.shift()

違う時、True
同じ時、False
なので、

時点is_zerois_zero.shift()is_changed (違う?)
10NanTrue
200False
310True
411False
511False
601True
710True
811False
901True
1010True

となります。


group_id = is_changed.cumsum()

次はこれです。
これをはじめて見た時、私は

cumsum()

って、何と思いました😅
これは 累積和 というものらしいです。
どういう事をするものかというと

np.cumsum()
npnp.cumsum()
00
22
13
58
08
19
312
416

つまり、

np.cumsum()

のはじめの行は

np

をそのまま移し、その次の行からは
前の行の

np.cumsum()

とその行の

np

を足すを繰り返す関数のようです。
では、話を

group_id = is_changed.cumsum()

に戻しまして、
つまり、これは

is_changed.cumsum()

is_changed

を累積和したものだと分かります。
つまり、下の表のようになります。

時点is_zerois_changedis_zeroを数値にgroup_id
10True11
20False01
31True12
41False02
51False02
60True13
71True14
81False04
90True15
101True16

最後に、

consecutive = is_zero.groupby(group_id).cumsum()

です。
ここで、これは何?
となるのは、

groupby()

です。

例えば、

import pandas as pd

df = pd.DataFrame({
    "symbol": ["BTC", "BTC", "ETH", "ETH", "SOL"],
    "volume": [100, 200, 50, 70, 30]
})

こんなDataFrameがあったとして、このDataframeの中身は

symbolvolume
0BTC100
1BTC200
2ETH50
3ETH70
4SOL30

です。ここで、

df.groupby("symbol")["volume"].sum()

を考えます。
この結果は

symbol
BTC 300
ETH 120
SOL 30
Name: volume, dtype: int64

になるそうです。
つまり、

df の symbol のうち、BTC の行だけ集めて volume を合計
df の symbol のうち、ETH の行だけ集めて volume を合計
df の symbol のうち、SOL の行だけ集めて volume を合計

しています。
では、例えから本題に戻ります。

consecutive = is_zero.groupby(group_id).cumsum()

これは、is_zero を group_id の値でグループ分けして、各グループ内で cumsum() するという意味です。

時点is_zerogroup_id
101
201
312
412
512
603
714
814
905
1016
is_zerogroup_id
0, 0グループ1
1, 1, 1グループ2
0グループ3
1, 1グループ4
0グループ5
1グループ6

つまり、
グループ1、グループ2、グループ3、グループ4、グループ5、グループ6に分けて 、グループごとに is_zeroの累積和をとっている。

時点is_zerogroup_idグループconsecutive
101グループ10
201グループ10
312グループ21
412グループ22
512グループ23
603グループ30
714グループ41
814グループ42
905グループ50
1016グループ61

結局、この1行は何をしていたのか?

is_zero = (df_1h['volume'] == 0).astype(int)
consecutive = is_zero.groupby((is_zero != is_zero.shift()).cumsum()).cumsum()

↓分解

is_changed = is_zero != is_zero.shift()
group_id = is_changed.cumsum()
consecutive = is_zero.groupby(group_id).cumsum()

これは、

  1. volume == 0 の行を 1、それ以外を 0 にする
  2. 0 と 1 が切り替わる場所を見つける
  3. 切り替わるたびに group_id を増やす
  4. group_id ごとに cumsum() する
  5. その結果、出来高ゼロが何本連続しているかが分かる

という処理だった。

つまり、

is_zero = (df_1h['volume'] == 0).astype(int)
consecutive = is_zero.groupby((is_zero != is_zero.shift()).cumsum()).cumsum()
max_consecutive = consecutive.max()

と合わせると、この1行は「最大で何本連続して出来高ゼロだったか」を調べるための前処理でした。

ああ、少し分かった気がしました😅

出典

この記事は、Hoheto さんの GitHub リポジトリ
「crypto-data-analysis-course」の vol01_data_acquisition_and_cleansing.ipynb を学習した記録です。

元リポジトリ: https://github.com/i-love-profit/crypto-data-analysis-course
作者: Hoheto さん
ライセンス: MIT License

元コードの一部を引用し、自分の理解のために分解・解説しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

botterになって稼げるといいなと思っている夢見がちな人。

コメント

コメントする

CAPTCHA


目次