データ前処理ガイド#
このページでは、haniwers で収集した生データをCVS形式に変換・前処理するための preprocess コマンドの使い方を解説します。
概要#
preprocess コマンドは、生データから以下の2つの出力ファイルを生成します:
前処理済みデータ (
processed.csv.gz) - 生データにヒット判定・hit_type計算を追加集計データ (
resampled.csv) - 時間窓ごとに統計量を集計
コマンド一覧#
2つのコマンドが利用可能です:
raw2csv- フル機能の前処理(推奨:細かい制御が必要な場合)raw2tmp- クイック変換(推奨:高速処理と v0 互換性重視)
raw2csv: フル前処理パイプライン#
最も汎用的な前処理コマンドです。タイムゾーン、時間オフセット、集計間隔をカスタマイズできます。
基本的な使い方#
haniwers-v1 preprocess raw2csv <データディレクトリ> --save
例#
1. 最も簡単な使い方#
# ディレクトリ内のすべての CSV ファイルを処理
haniwers-v1 preprocess raw2csv sandbox/test_data/20240611_run93 --save
出力:
processed.csv.gz- 前処理済みデータresampled.csv- 10分単位(デフォルト)の集計データ
2. 集計間隔をカスタマイズ#
# 5分単位の集計
haniwers-v1 preprocess raw2csv data/ --interval 300 --save
# 1時間単位の集計
haniwers-v1 preprocess raw2csv data/ --interval 3600 --save
3. タイムゾーンを変更#
# JST(日本標準時)を指定
haniwers-v1 preprocess raw2csv data/ --tz UTC+09:00 --save
# IANA タイムゾーン形式
haniwers-v1 preprocess raw2csv data/ --tz Asia/Tokyo --save
4. 時間オフセットを適用#
測定時刻にズレがある場合、秒単位でオフセットを指定できます:
# すべてのタイムスタンプに 30秒を加算
haniwers-v1 preprocess raw2csv data/ --offset 30 --save
# 1分を減算(負の値)
haniwers-v1 preprocess raw2csv data/ --offset -60 --save
5. ファイルパターンを指定#
デフォルトでは *.csv にマッチするファイルを処理します。
別のパターンを指定できます:
# "osechi_data_*.csv" ファイルのみ処理
haniwers-v1 preprocess raw2csv data/ --pattern "osechi_data_*.csv" --save
# "scan_*.csv" ファイルのみ処理
haniwers-v1 preprocess raw2csv data/ --pattern "scan_*.csv" --save
6. 詳細ログを表示#
# 処理中の詳細情報を表示
haniwers-v1 preprocess raw2csv data/ --save --verbose
オプション一覧#
オプション |
デフォルト |
説明 |
|---|---|---|
|
なし(出力なし) |
ファイルに保存するかどうか |
|
600 |
集計時間ウィンドウ(秒) |
|
0 |
タイムスタンプのオフセット(秒) |
|
UTC+09:00 |
タイムゾーン |
|
|
ファイルマッチングパターン |
|
なし |
詳細ログを表示 |
raw2tmp: クイック変換(v0互換)#
高速な前処理が必要な場合、または v0 との互換性を重視する場合に使用します。
特徴#
常に自動保存:
--saveフラグ不要固定設定: タイムゾーンは UTC+09:00、オフセットなし
v0互換出力: ファイル名が
tmp_raw2tmp.csv.gz,tmp_raw2tmp.csvで統一
基本的な使い方#
haniwers-v1 preprocess raw2tmp <データディレクトリ>
例#
1. 最も簡単な使い方#
haniwers-v1 preprocess raw2tmp sandbox/test_data/20240611_run93
自動で以下のファイルが保存されます:
tmp_raw2tmp.csv.gz- 前処理済みデータtmp_raw2tmp.csv- 10分単位の集計データ
2. 集計間隔を変更#
# 5分単位
haniwers-v1 preprocess raw2tmp data/ --interval 300
# 1時間単位
haniwers-v1 preprocess raw2tmp data/ --interval 3600
3. ファイルパターンを指定#
haniwers-v1 preprocess raw2tmp data/ --pattern "osechi_data_*.csv"
オプション一覧#
オプション |
デフォルト |
説明 |
|---|---|---|
|
600 |
集計時間ウィンドウ(秒) |
|
|
ファイルマッチングパターン |
処理の流れ#
両コマンドは、以下のパイプラインで処理されます:
生データ (.csv)
↓
[ステップ1] ファイルを読み込み・統合
↓
[ステップ2] タイムスタンプをパース(タイムゾーン・オフセット適用)
↓
[ステップ3] ヒット判定を計算(hit_top, hit_mid, hit_btm)
↓
[ステップ4] hit_type を計算(3層の同時検出パターン)
↓
[ステップ5] 時間ウィンドウで集計
↓
[ステップ6] 統計量を計算(平均、標準偏差、レート)
↓
前処理済みデータ (.csv.gz) ← 保存
集計データ (.csv) ← 保存
出力ファイルの解説#
前処理済みデータ (processed.csv.gz)#
元の生データにヒット判定と hit_type を追加したもの。すべてのイベント情報を保持:
datetime,top,mid,btm,adc,tmp,atm,hmd,time,hit_top,hit_mid,hit_btm,hit_type
2024-06-11 06:32:24.755250+09:00,0,2,0,0,30.12,100161.0,42.26,2024-06-11 06:32:24.755250+09:00,0,1,0,2
2024-06-11 06:32:30.976835+09:00,0,0,5,0,30.07,100160.33,42.29,2024-06-11 06:32:30.976835+09:00,0,0,1,1
...
詳細は データフォーマット を参照してください。
集計データ (resampled.csv)#
指定した時間ウィンドウごとに統計量を集計したデータ:
time,hit_type,events,adc_mean,adc_std,tmp_mean,tmp_std,atm_mean,atm_std,hmd_mean,hmd_std,event_rate,event_rate_top,event_rate_mid,event_rate_btm
2024-06-11 06:30:00+09:00,1,32,0.0,0.0,30.17,0.053,100157.5,3.76,42.27,0.081,0.053,0.0,0.0,0.018
2024-06-11 06:40:00+09:00,6,128,0.0,0.0,30.21,0.042,100159.2,2.45,42.31,0.076,0.213,0.067,0.080,0.045
...
よくある使用パターン#
パターン1: 新しいデータセットを素早く確認#
# 高速処理(raw2tmp推奨)
haniwers-v1 preprocess raw2tmp raw_data/
パターン2: 詳細な解析前に精密処理#
# フル機能(raw2csv推奨)
haniwers-v1 preprocess raw2csv raw_data/ --interval 600 --verbose --save
パターン3: 異なるタイムゾーンでの処理#
# ローカルタイムゾーンでタイムスタンプを再計算
haniwers-v1 preprocess raw2csv raw_data/ --tz Asia/Tokyo --save
パターン4: 複数の集計単位で比較#
# 5分単位の細粒度データ
haniwers-v1 preprocess raw2csv raw_data/ --interval 300 --save
# 別の出力ディレクトリで 1時間単位の粗粒度データ
cd aggregated_1h/
haniwers-v1 preprocess raw2csv ../raw_data/ --interval 3600 --save
データ構造の確認コマンド#
前処理前後のデータを確認するための便利なシェルコマンドを紹介します。
生データ(.csv)の確認#
ファイル情報#
# ファイルサイズを確認
ls -lh osechi_data_*.csv
# ファイルの行数を確認
wc -l osechi_data_*.csv
# 複数ファイルの合計行数
cat osechi_data_*.csv | wc -l
データの先頭を確認#
# 最初の5行を表示
head -5 osechi_data_2024-06-11T06h32m14s_0000000.csv
# カラム名を確認(ヘッダーがない場合は最初のデータ行が表示)
head -1 osechi_data_2024-06-11T06h32m14s_0000000.csv
データの統計情報#
# ファイルの概要を表示
head -3 osechi_data_2024-06-11T06h32m14s_0000000.csv | column -t -s','
# データのユニークな日時範囲を確認
head -1 osechi_data_*.csv | cut -d',' -f1
tail -1 osechi_data_*.csv | cut -d',' -f1
特定のカラムを確認#
# top カラムの値を確認(最初の10個)
cut -d',' -f2 osechi_data_2024-06-11T06h32m14s_0000000.csv | head -10
# adc カラムの統計(値がすべて数値か確認)
cut -d',' -f5 osechi_data_2024-06-11T06h32m14s_0000000.csv | sort -n | tail -5
前処理済みデータ(.csv.gz)の確認#
注記:
zcatコマンドはgunzip --decompress --stdoutと同等です。zcatが使えない環境ではgunzip -d -c processed.csv.gzに置き換えてください。
ファイル情報#
# 圧縮ファイルのサイズを確認
ls -lh processed.csv.gz
# 圧縮前のサイズを確認
gunzip -l processed.csv.gz
# 行数を確認(フルスキャン)
zcat processed.csv.gz | wc -l
データの先頭を確認#
# 最初の5行を表示
zcat processed.csv.gz | head -5
# カラム名を確認
zcat processed.csv.gz | head -1
# データを整形して表示
zcat processed.csv.gz | head -3 | column -t -s','
カラム構成の確認#
# カラム数をカウント
zcat processed.csv.gz | head -1 | tr ',' '\n' | nl
# カラム名と型の一覧
zcat processed.csv.gz | head -1 | tr ',' '\n' | awk '{print NR": "$0}'
特定カラムのデータ確認#
# hit_type のユニーク値を確認(0-7のみ含まれるか)
zcat processed.csv.gz | cut -d',' -f13 | sort | uniq -c
# time カラムの範囲を確認
zcat processed.csv.gz | cut -d',' -f9 | head -1
zcat processed.csv.gz | cut -d',' -f9 | tail -1
# adc カラムのヒストグラム(簡易版)
zcat processed.csv.gz | cut -d',' -f5 | tail -n +2 | sort -n | tail -10
データの整合性を確認#
# 圧縮ファイルが正常か確認(エラーがなければ何も表示されない)
gzip -t processed.csv.gz && echo "✓ ファイルは正常"
# 重複した datetime がないか確認
zcat processed.csv.gz | cut -d',' -f1 | sort | uniq -d | wc -l
集計データ(.csv)の確認#
ファイル情報#
# ファイルサイズを確認
ls -lh resampled.csv
# 行数を確認(集計時間ウィンドウの数)
wc -l resampled.csv
# カラム数を確認
head -1 resampled.csv | tr ',' '\n' | wc -l
データの先頭と末尾を確認#
# 最初の5行を表示
head -5 resampled.csv
# カラム名を確認
head -1 resampled.csv | tr ',' '\n' | nl
# データを整形して表示
head -3 resampled.csv | column -t -s','
集計期間の確認#
# 時間ウィンドウの開始と終了を確認
head -2 resampled.csv | cut -d',' -f1
tail -1 resampled.csv | cut -d',' -f1
# 総測定時間を計算
echo "Total rows: $(tail -n +2 resampled.csv | wc -l)"
echo "Interval (seconds): $(head -1 resampled.csv | tr ',' '\n' | grep -n interval | cut -d: -f1)"
イベント統計の確認#
# イベント数の合計
tail -n +2 resampled.csv | cut -d',' -f3 | awk '{sum+=$1} END {print "Total events: " sum}'
# hit_type の分布
tail -n +2 resampled.csv | cut -d',' -f2 | sort | uniq -c
# イベントレートの範囲
tail -n +2 resampled.csv | cut -d',' -f12 | sort -n | awk 'NR==1 || NR==NF {print}'
データ検証スクリプト#
前処理の結果を素早く確認するワンライナー:
# 前処理前後のデータ比較
echo "=== 生データ情報 ==="
wc -l osechi_data_*.csv | tail -1
echo "=== 前処理済みデータ ==="
zcat processed.csv.gz | wc -l
echo "=== 集計データ(ウィンドウ数) ==="
tail -n +2 resampled.csv | wc -l
echo "=== hit_type の分布 ==="
zcat processed.csv.gz | cut -d',' -f13 | tail -n +2 | sort | uniq -c
echo "=== イベント総数 ==="
tail -n +2 resampled.csv | cut -d',' -f3 | awk '{sum+=$1} END {print sum}'
高度なデータ検査:xan を使用#
大規模なデータセットを効率的に検査する場合、xan (CSV parser) の使用をお勧めします。
xan のインストール#
# macOS
brew install xan
# Linux / その他
cargo install xan
xan の基本的な使い方#
生データ(.csv)の検査#
# ファイルの基本情報
xan count osechi_data_2024-06-11T06h32m14s_0000000.csv
# 最初の5行を表示
xan cat osechi_data_2024-06-11T06h32m14s_0000000.csv | head -5
# 特定カラムのみ表示
xan select datetime,top,mid,btm osechi_data_2024-06-11T06h32m14s_0000000.csv | head -5
# 統計情報を表示(カラムごと)
xan stats osechi_data_2024-06-11T06h32m14s_0000000.csv
前処理済みデータ(.csv.gz)の検査#
重要な利点: xan は .csv.gz ファイルを直接読み込めます。gunzip で解凍する必要がありません。
# 行数を確認(圧縮ファイルから直接)
xan count processed.csv.gz
# 最初の5行を表示
xan cat processed.csv.gz | head -5
# 特定カラムのみ表示
xan select time,events,hit_type processed.csv.gz | head -5
# 統計情報を表示
xan stats processed.csv.gz
# hit_type のカラムのみを確認
xan select hit_type processed.csv.gz | head -10
集計データ(.csv)の検査#
# ウィンドウ数を確認
xan count resampled.csv
# イベント統計を表示
xan select time,events,hit_type resampled.csv | head -5
# すべての統計情報
xan stats resampled.csv
xan の利点#
✅ .csv.gz ファイルを直接読み込める(解凍不要)
✅ 大規模ファイルで高速(Rust製)
✅ カラム選択が直感的
✅ シンプルな構文
✅ パイプライン処理に対応
xan vs シェルコマンド#
用途 |
シェルコマンド |
xan コマンド |
|---|---|---|
行数カウント |
|
|
最初の5行 |
|
|
統計情報 |
複数コマンドの組み合わせ |
|
カラム選択 |
|
|
トラブルシューティング#
“No files matching pattern found”#
ファイルパターンが正しいか確認してください:
# ファイル一覧を確認
ls -la /path/to/data/
# 正しいパターンを指定
haniwers-v1 preprocess raw2csv /path/to/data/ --pattern "osechi_data_*.csv" --save
処理が遅い#
大量のファイルを処理している可能性があります。以下の対策を試してください:
# 1. 不要なファイルを除外
haniwers-v1 preprocess raw2csv data/ --pattern "osechi_data_*.csv" --save
# 2. 粗い集計間隔を使用(メモリ削減)
haniwers-v1 preprocess raw2csv data/ --interval 3600 --save
タイムゾーンエラー#
タイムゾーン指定が無効の場合、エラーが表示されます:
# 正しい形式を使用
haniwers-v1 preprocess raw2csv data/ --tz UTC+09:00 --save # OK
haniwers-v1 preprocess raw2csv data/ --tz Asia/Tokyo --save # OK
haniwers-v1 preprocess raw2csv data/ --tz JST --save # NG(形式が無効)