CSV Lab に戻る

CSV Lab 計算処理の信頼性

CSV Lab は、計算結果をユーザーが検証しやすいよう、処理の入口・計算・可視化・出力を同じパイプライン上にそろえています。 このページでは、Calc、CoolProp、Plot がどのような安全策で動いているかを、実装抜粋とともに説明します。

信頼性のための基本方針

  • CSV/Excel/TDMS は最初に DataFrame 化し、後続処理は同じ表形式に統一します。
  • Calc は Python eval を使わず、列配列だけを numexpr に渡します。
  • CoolProp は入力単位をSIへ変換し、失敗行を NaN として扱います。
  • Plot は元データを直接描画せず、必要列抽出・数値化・ソート・間引きを通します。
  • Run/Plot/Download は同じ処理パイプラインを使うため、画面表示と出力CSVの処理順序が揃います。
  • 重い処理はジョブ化し、進捗・キャンセル・キャッシュで長時間処理時の破綻を抑えます。

主要処理の実装抜粋

Calc: 式評価は numexpr に限定

ユーザー式は列名を直接 eval せず、UIが作る変数マップを DataFrame の数値配列に変換してから numexpr で評価します。結果は行数に合わせ、NaN/inf はJSON出力時に null 化します。

import numexpr as ne

out = ne.evaluate(expr2, local_dict=local_dict)
if np.isscalar(out):
    out = np.full(len(df), float(out), dtype=np.float64)
else:
    out = np.asarray(out, dtype=np.float64)
df[new_col] = out

CoolProp: 単位変換と失敗時 NaN

CoolProp は PropsSI のSI入力にそろえてから呼び出します。入力欠損・範囲外・二相域などで PropsSI が失敗した行は NaN として記録し、失敗数をログに残します。

try:
    value = float(PropsSI(out, k1, float(x1[i]), k2, float(x2[i]), fluid))
    out_arr[i] = value
    _coolprop_memo_put(memo_key, value)
except Exception:
    fail += 1

df[new_col] = out_arr

Plot: 必要列だけを処理し、数値化してから描画

Plot専用ジョブでは、処理ステップが参照する列とX/Y列だけに絞ってパイプラインを実行します。描画直前にX/Y列を数値化し、Xでソートしてから最大点数へ間引きます。

plot_projection = _plot_required_input_columns(steps_for_cache or [], x, y_cols)
df, logs, _p = process_file_with_recipe(
    content,
    recipe,
    required_input_columns=plot_projection,
)
sub = df[cols].copy()
sub[x] = pd.to_numeric(sub[x], errors="coerce")
sub = sub.dropna(subset=[x]).sort_values(x)

検証していること

自動テストでは、入出力の境界条件と長時間処理に関わる箇所を中心に確認しています。

  • CSVプレビューのスライス、ヘッダー推定、NR-X末尾メタブロック除外
  • Excelのシート一覧取得、選択シート読み込み、画像無視
  • TDMS取り込みと変換キャッシュ
  • Run/Download の処理結果と全件CSV出力
  • Plot用データ生成とジョブ実行
  • ジョブキャンセル、ジョブ統計、JWT/API設定

制限事項

すべての物理計算・単位系・センサー仕様をCSV Labが自動で保証するわけではありません。 特にCoolPropの流体名、入力単位、二相域、センサー校正値はユーザー側の実験条件に依存します。 重要な報告値に使う場合は、既知データや手計算との照合を推奨します。