流量時系列から代表出水を抽出する作業は一見簡単そうですが、プログラミングする場合は微分等が必要となり、結構手間がかかります。
そのため、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
リンク
リンク