蛇使いな彼女BLOG
【第94回】dt/dzコンター描画プログラムのアップデート作業に関して
2023.10.06
皆さんこんにちは。
現在モトハシは次回学会に向けてdt/dzをEL基準で出力できるように既存のプログラムをアップデートしている所ですが、その最中データの結合が上手くいかない問題で困ってしまいました (゚´Д`゚)
プログラムは問題なく走るんですが、結果の配列が空になっている状態。
以下全文ですが、
https://imgur.com/LnbzReb
やっていることは
□データファイルごとに条件を揃える
□項目間で勾配条件をそろえる
□整理されたフレーム枠にデータを統合する←ここで結合出来ない不具合
□項目ごとにタイムスタンプの整理
□データの編集とテキスト化
□保存
この関数を走らせると条件に合うデータ行が整列された状態で排出されるはずですが、どうやら以下☆マーク部分に問題があるようです。
関数内でexecを使うことで、項目別に結合配列を自動的に更新していく操作が上手く作動しないようなのです!
詳細はドキュメントに記載されていますが、どうやら関数定義の外では返り値がNoneになるようです。
関数どけてベタ打ちしたら普通に連結されたデータが返ってきました……
つまり掲載のコードではファイル回している途中で同時に項目処理と変数更新を行うのが無理のようです。
コードが正常に動くよう修正するとしたら、9個ある項目すべてにIf構文を付けて分岐させないといけないという事😵(なんかスマートじゃないよね)
それもこれも↓項目間で抽出定義を揃えようと追加したこの一文が全ての元凶。(上記全文リンク内86行目)
nd=d.loc[(diff_WTDO[col[0]]!=0)&(np.abs(diff_WTDO[col_name]/diff_WTDO[col[0]])>0)]
そもそも当初水温とDOだけのつもりで作成したので変数がdiff_WTDOのままですね(笑)
この2項目なら互いに相関性があるので、当初抽出定義は水温項目だけに適応すれば十分だと考えていました。
今回の書き換え作業では水温・DO以外の項目も描画対象にしたかったので、各項目毎にこの操作を追加することにしました。
が、処理の流れとしては1つのプロファイルを開いている間に水質9項目をそれぞれ冒頭で宣言した格納配列の末尾に連結していかないといけないため、ふつうに考えたらexec(‘’)構文を使わざるをえません。
しかしこれが関数外ではNoneとなるため結果の参照も出来なければ、ローカルファイルへの保存も不可能になります。
このままではスクリプトコードが散らかり放題なので他に上手な方法が無いか試してみますが、色々と考えることが多くて学会の準備とは大変なものです。
(ある程度きちんとまとまったコードを書かないと後から再利用するのが大変な上に、自分でもこれ一体なんの処理してるん?ってなるときがあります笑)
後日談。
なんとかデータが空になる不具合は修正できましたが、抽出定義を変更したことによる結果の違いについては、比較的高品質な水質データについては水温のみにフィルターを掛けようが、各項目に掛けようが排出されるデータは全て同じ個数になりました 。
一方、台風や大雨などのイベント後、他のセンサーに比べて特にECや濁度など、
項目の一部にエラーが確認できる低品質のデータの場合はPCYと濁度だけ他の項目と比較して抽出個数が異なりました。
つまり今回のフィルタリング操作に対するデータの応答は、全ての項目間で同じもしくはほぼ全てのセンサーで連動しているという特徴を持っている事になります。
dt/dzでは深さ方向に対する微細~極端な変動を、良くも悪くも全て表現出来ていることが今回分かりました。
今日はここまで