yoshiyukiminami / python

0 stars 0 forks source link

データのトリミング-無効データ判定 #27

Closed duri0214 closed 2 years ago

duri0214 commented 2 years ago

26

つかいかた

関数にCSVのパスと、深さの from to を指定して実行すると、エラー行を返します

if __name__ == "__main__":
    errors = find_invalid_data('data_sample_error-disp-on.csv', {"from": 10, "to": 50})
    for error in errors:
        print(error)

Test

わざと正常な行をつくって、エラーが出力されないことを確認 image image

Next Step?

∔補正は可能か・・例:{・・20㎝,21cm,22cm,23cm,24cm・・:・・500,600,232,232,900・・}→{・・20㎝,21cm,22cm,23cm,24cm・・:・・500,600,700,800,900・・}

変換のパターンが決まってれば可能です。例えば 50cm の列の平均値を入れる、など

yoshiyukiminami commented 2 years ago

すみません、エラーの定義が説明不足でした。 データは232から始まって深度が深くなるにしたがって数値が増えますが、232より大きくなった数値が減ること(例:232→350→500→800→600→650)はあっても232に戻ることはありません。なのでエラーの定義としては土壌硬度データの数値が232以上で増加・減少する中で、急に232という最小値が出現することになります。 TESTのCSVファイル画像で言えば、1~19行のAF列の232、20・23行のAE・AF列の232、24行のAC・ADおよびAF列の232がエラー値で、V列(深度10㎝)より左(深度10㎝より深い深度の列)のうち最初に232より大きい数値になっている列までの232はエラー値ではありません。 なので、考え方としては最初に232以上の数値が出現する列を特定して、それより大きい深度(深い)で232が出現した場合をエラーと判定するようなプログラムになりそうです。

yoshiyukiminami commented 2 years ago

本日お疲れさまでした。ホワイトボードの内容を添付させて頂きます

Whiteboard 3 -01

duri0214 commented 2 years ago

@yoshiyukiminami

duri0214 commented 2 years ago

@yoshiyukiminami すべて 232 だったときの行エラーの表示に対応。確認が終わったら承認して、 master に merge してください(次回の zoom のときでもOKです) image

yoshiyukiminami commented 2 years ago

修正ありがとうございます。 質問2つ ①別のcsvファイルでテストする場合、serviceフォルダに新規のcsvファイルを追加する方法は?  →自分のPCに特定フォルダを作成して、そのフォルダに格納したcsvファイルをすべて読み込み無効データの判定をするようなアップセルの可能ですよね。 ②有効データで232(最低値)から始まらないパターン(1㎝から232以上の数値で始まる。サンプルデータでは11行目のように)がたまに出ます。その場合、first_col_in_a_lineが正しくスパイクできず、途中から出てくる最初の232(つまりこれは無効データ)の次に出てくる232以上のデータ列をfirst_col_in_a_lineと誤認識する可能性がありますか?→添付画像の左Ⓑ 

【余談】 データ調整で「2点間の平均値を代入」(現行)を「なめらかな直線になるような数値の代入」(添付画像の右②)にしたい場合、44行目を『「mean1」と「mean2」の差数を「punch_in」と「punch_out」の列数∔1で割った数値』を足していくコマンドにすればよい? #27_無効データの判定_20220522

duri0214 commented 2 years ago

@yoshiyukiminami

①について

もちろん可能ですが、今回はあくまでモジュールとして作ってあるので、このモジュールが「どこのフォルダから読む」ということを決めるというよりは、あとでアプリケーションの枠組みができてからCSVパスを指定してモジュールを動かす想定になってます。なのでいまは、処理対象となっているCSVと同じ名前に変えて処理を試すという使い方になります。

②について

1行あたりの検査が始まった最初のValueが232を超えていて、最後のValueまで232を超えていた場合、最初のValueが first_col_in_a_line になります(逆もしかり)。つまり「1cmめが232になる」という前提には立ってないので1cm~60cmが検査範囲になるので正常動作します(11行目の値をひとつだけ232にするケース)

余談について

以下の2行(43, 44行目)が、補正している部分になるんですが、ここを等差数列にするのであれば、いくつ補正しなければならないのか?の数(添付画像の右①でいうと 900 が 2個ある、の 2 )を変数にいれて、NumPylinspace あたりでいける と思います

for j in range(idx["punch_in"], idx["punch_out"] + 1):
    line[j] = sum([line[idx["mean1"]], line[idx["mean2"]]]) / 2
In [1]: import numpy as np
In [2]: np.linspace(800, 1000, 4)
Out[2]:
  array([800., 866.66666667, 933.33333333, 1000.])