For ループを使用してデータテーブルをサブセット化し、各サブセットで列操作を実行する親愛なるコミュニティの皆さん、私はこのトピックについて非常に悩んでいます。誰かが助けてくれるかもしれません。 私のデータテーブルは、「シリアル番号」の下に、異なる時点「タイムスタンプ」で測定された多くの部分で構成されています。 測定結果 (Isc、Pmpp など)
測定時間が増加するにつれて行に保存されます。 私がしなければならないことは、各部品の最初の測定値(時間的に最も早いもの)で測定値を個別に正規化することです。 部品 XY と同様 -> (Pmpp/Pmpp0; t=0)
私は、大きなデータテーブルを、1 つの部分とその経時的な連続測定のみを含む多くのサブテーブルにサブセット化するスクリプトを作成しました。 以下のコードのように:
dt_LT = Open(big_datatable.jump);
Mod_Tab = dt_LT << Tabulate( Add Table( Row Table( Grouping Columns( :SerialNumber ) ) ) );
Mod_dt = Mod_Tab << Make Into Data Table;
Mod_dt << Set Name( "Modul-Datatable" );
Zahl_Mod = NRow (Mod_dt);
Current Data Table (Mod_dt);
Mod_List = :Name( "SerialNumber") << Get Values;
content= Text Box(Mod_List);
New Window ("Modul gefunden", content);
Current Data Table (dt_LT);
For (i = 1, i <= Zahl_Mod, i++,
dt_LT << clear row states;
dt_LT << select Where (:Name ("SerialNumber") == Mod_List[i]);
If( N Row( dt_LT << get selected rows ) < 3, Continue() );
Mod = dt_LT << Subset ((selected Rows), Output Table Name("Module_"||Mod_List[i]));
これはうまくいきます。 必要なだけサブテーブルを取得します。 また、各サブセット内の最も古い測定値も正常に機能することを見つけます。 以下のコードを参照してください。
Current data table(Mod);
Eval (init_Zeit = col minimum(:Timestamp);
init_flash = Mod << get rows where ((:Timestamp) == init_Zeit);
row = init_flash[1];
失敗するのは正規化です。 スクリプトは最後のサブセットでスタックし、他のすべてのデータを最後のサブセット テーブルの最も古い測定値で正規化します。以下のスクリプトを参照してください
Em0 = :Eff_Modul[row];
Ez0 = :Eff_Zelle[row];
FF0 = :FF[row];
Impp0 = :Impp[row];
Isc0 = :Isc[row];
Pmpp0 = :Pmpp[row];
Rs_Serial0 = :Rs_Serial[row];
Rsh_Shunt0 = :Rsh_Shunt[row];
Vmpp0 = :Vmpp[row];
Impp0 = :Impp[row];
Voc0 = :Voc[row];
New Column ("Pmpp_Norm", Numeric, continuous,
Formula ( :Pmpp / Pmpp0));
最後のサブセットテーブルでは、測定列の正規化後に 1 が得られます。他のすべてのサブテーブルでは、正規化された値に対して 1 未満の値が得られます。 for ループ内でサブセット テーブルを切り替えるにはどうすればよいですか? 誰か助けてくれませんか? 事前にお願いします
ミカエル
Re: For ループを使用してデータテーブルをサブセット化し、各サブセットで列操作を実行するうまくいきます。 助けてくれてありがとう!
ミカエル・ラグズ
Re: For ループを使用してデータテーブルをサブセット化し、各サブセットで列操作を実行するお返事をありがとうございます。 実際、for ループに「I」という式がありましたが、これによりインクリメントインデックス「i」との混乱が生じました。 式の名前を「I1」に変更したところ、うまくいきました。
ち、ミカエル
Re: For ループを使用してデータテーブルをサブセット化し、各サブセットで列操作を実行するL 値は代入の左側です。 非変数に何かを代入しようとしています。 例えば:
Insert Into( { 5, 6, 7 }, 8 );
この代替案は次のように機能します。
my list = { 5, 6, 7 };
Insert Into( my list, 8 );
Re: For ループを使用してデータテーブルをサブセット化し、各サブセットで列操作を実行するこんにちは、とても早い回答ありがとうございます!
提案どおりにスクリプトを書き直しました。 リストの最初の項目では計算がうまく機能しますが、for ループが中断して次の項目に切り替わることはありません。 デバッガーは、L 値を持たないオブジェクトを参照して何かを言及しています...
それが何を意味するのかよくわかりません。 変数をリセットする必要がありますか?それともアクティブなテーブルの選択を削除しますか?
改めて本当にありがとうございました!
VG、ミカエル
Re: For ループを使用してデータテーブルをサブセット化し、各サブセットで列操作を実行するグローバル変数を使用するPmpp0列の数式で Pmpp0 の値が反復ごとに変化し続けると、それに応じて数式の計算も変更されます。 このアプローチを使用する場合は、変数の評価された現在値を式で明示的に使用する必要があります。
例えば:
Pmpp0 = :Pmpp[row];
F = Eval Expr(:Pmpp / Expr(Pmpp0));// Formula expression with evaluated Pmpp0
Mod << New Column("Pmpp_Norm", Numeric, continuous, Formula(Name Expr(F)));