趣味で計算流砂水理

趣味で計算流砂水理 Computational Sediment Hydraulics for Fun Learning

数値計算とか河川工学とかプログラミングのことを書いています

MENU

scipy.signal.find_peaksで流量時系列から代表出水を簡単に抽出する

スポンサーリンク

流量時系列から代表出水を抽出する作業は一見簡単そうですが、プログラミングする場合は微分等が必要となり、結構手間がかかります。

そのため、scipy.signal.find_peaks — SciPy v1.9.3 Manualライブラリを使って簡単にやってみます。

対象データはとあるダムの過去15年間の1時間間隔の流入量です。

まず、scipy.signal import find_peaksをオプションなしで使ってみます。

from scipy.signal import find_peaks

# v:ダム流量データの配列
peaks, _ = find_peaks(v)

v[peaks]を散布図で書くと次のとおりです。

拡大図

すべてのピークを拾ってしまい、使えそうにないです。

次に、公式等を参考に以下のオプションを付けます。

  • height=100:ピークの最小値
  • distance=24 : 隣り合うピークの最小距離
from scipy.signal import find_peaks

# v:ダム流量データの配列
peaks, _ = find_peaks(v, height=100, distance=24)

拡大図

ほぼ完璧に波形のピークを拾えています。

例えば、上位30洪水を抽出する場合は、何でも良いですがnumpyで以下のような処理を行います。

めちゃくちゃ簡単です。

import pandas as pd
import numpy as np

qmax = v[peaks]
date = df.index[peaks] # 日付
ind = np.argsort(qmax)[::-1]
dfmax = pd.DataFrame({'date':date[ind[:30]], 'Q':qmax[ind[:30]]})
dfmax
date Q
0 2019-09-12 16:00:00 1749.78
1 2007-09-07 02:00:00 906.86
2 2016-07-23 08:00:00 809.22
3 2021-07-16 07:00:00 713.31
4 2017-09-23 00:00:00 679.63
5 2011-09-21 17:00:00 644.21
6 2012-06-19 23:00:00 576.43
7 2015-09-09 13:00:00 509.00
8 2018-08-31 21:00:00 457.19
9 2013-10-16 05:00:00 429.03
10 2008-08-29 00:00:00 407.78
11 2011-07-20 01:00:00 371.44
12 2014-10-06 10:00:00 355.04
13 2012-07-14 04:00:00 339.82
14 2007-07-15 10:00:00 336.24
15 2013-09-16 09:00:00 322.83
16 2012-05-03 07:00:00 319.07
17 2008-05-20 08:00:00 303.61
18 2013-04-06 23:00:00 290.46
19 2019-04-21 08:00:00 280.20
20 2014-06-07 06:00:00 246.24
21 2009-10-08 08:00:00 245.16
22 2006-10-06 15:00:00 236.92
23 2019-07-16 18:00:00 236.26
24 2006-07-19 13:00:00 236.03
25 2021-06-03 03:00:00 223.07
26 2009-08-10 07:00:00 203.89
27 2015-07-17 02:00:00 196.85
28 2018-07-24 23:00:00 187.92
29 2019-08-09 23:00:00 184.52

まとめ

pythonは何でもライブラリがあってやっぱり便利です。

参考サイト

SciPy 信号データ内のピークを見つける - Emotion Explorer