haniwers.preprocess#
Data Preprocessing and Cleaning for Raw Detector Data.
This module converts raw detector output files into clean, structured data that’s ready for analysis. It handles parsing, validation, and transformation of cosmic ray event data.
What Does This Module Do?
The preprocessing module:
Reads raw detector data files (CSV or DAT format)
Parses the raw data fields into meaningful quantities
Validates data integrity and handles missing values
Adds derived quantities (hit patterns, event types)
Saves cleaned data in standard formats
Data Processing Pipeline
Raw File → Parse → Add Fields → Validate → Clean Data
Example flow:
Raw detector sends:
255,120,0,512,25.5,101325,65Parsed as: top=255, mid=120, btm=0, adc=512, tmp=25.5, atm=101325, hmd=65
Added fields: hit_top=1 (because 255>threshold), hit_pattern=3
Output: Clean CSV with all fields ready for analysis
Key Functions
get_fnames() : Find data files matching a search pattern read_data_with_pandas() : Load multiple data files into a DataFrame add_hit() : Add binary hit indicators (detected or not detected) add_hit_type() : Add event type classification based on hit pattern preprocess() : Run complete preprocessing pipeline
File Format Support
.csv: Comma-separated values (preferred).dat: Raw detector format (automatically converted)
Example Usage
from haniwers.config import RunData
from haniwers.preprocess import preprocess
run = RunData(run_id=1, read_from="data/run001/")
data = preprocess(run) # Get cleaned data
print(f"Processed {len(data)} events")
print(data.columns) # See available data fields
Module Contents#
Functions#
測定データの一覧を取得 |
|
pd.DataFrameに変換 |
|
pl.DataFrameに変換 |
|
測定データをデータフレームに変換 |
|
|
|
|
|
|
|
測定データをリサンプル |
|
測定データをリサンプル |
|
測定データを前処理する |
|
測定データを指定してデータフレームに変換する |
|
ランを指定してデータフレームに変換する |
API#
- haniwers.preprocess.get_fnames(read_from: str, search_pattern: str) list[pathlib.Path]#
測定データの一覧を取得
測定データのファイル名の一覧を取得します。 ファイル名はPathオブジェクトに変換しています。 リストはファイル名で昇順ソートします。
- Args:
read_from (str): 測定データがあるパスsearch_pattern (str): ファイル名の検索パターン
- Returns:
fnames (list[Path]): 測定データの一覧
- Example:
fnames = get_fnames( read_from="../data/raw_data/20240601_run80", search_pattern="osechi_data_*.csv")
- haniwers.preprocess.read_data_with_pandas(fnames: list[pathlib.Path]) pandas.DataFrame#
pd.DataFrameに変換
複数の測定ファイルを読み込んでpd.DataFrameに変換します。 測定ファイルの拡張子は
.datと.csvに限定しています。- Args:
fnames (list[Path]): 測定データのファイル名のリスト
- Exception:
.dat/.csv以外の拡張子の場合は中断(break)
- Returns:
merged (pd.DataFrame): 結合したデータフレーム
- haniwers.preprocess.read_data_with_polars(fnames: list[pathlib.Path]) pandas.DataFrame#
pl.DataFrameに変換
複数のファイルを読み込んでpl.DataFrameに変換します。 polarsで読み込んだ方が、少し処理が速くなります。
ただし、そのままpl.DataFrameを返すと、あとの処理がうまくいかないので、 最後にpl.DataFrameからpd.DataFrameに変換しています。
- Args:
fnames (list[Path]): 測定データのファイル名のリスト
- Returns:
merged (pd.DataFrame): 結合したデータフレーム
- haniwers.preprocess.read_data(fnames: list[pathlib.Path]) pandas.DataFrame#
測定データをデータフレームに変換
read_data_with_polarsを使ってデータフレームに変換します。- Example:
fnames = get_fnames( read_from=..., search_pattern=".csv" ) data = read_data(fnames)
- haniwers.preprocess.add_time(data: pandas.DataFrame, offset: int, timezone: str) pandas.DataFrame#
timeカラムを追加測定データのデータフレームに
timeカラムを追加します。timeカラムはdatetimeカラムをタイムゾーン付き日時オブジェクトに変換したものです。 また、offset(秒)の分、測定時刻を正しい時刻に修正します。- Args:
data (pd.DataFrame): 測定データoffset (int): 測定時刻のオフセット(秒)
- Returns:
data (pd.DataFrame):timeカラムを追加した測定データ
- Example:
data = read_data(fnames) data = add_time(data)
注意
Raspberry Pi 4はRTCを内蔵していません。電源を切ると時計がストップします。 測定を開始する前に、ネットワークに接続してNTPから時刻を自動取得するか、
dateコマンドなどで時刻を手動設定する必要があります。 その作業を忘れてしまった場合のために、offsetオプションがあります。
- haniwers.preprocess.add_hit(data: pandas.DataFrame) pandas.DataFrame#
hitカラムを追加各シンチのレイヤーにヒットがあったかどうかを確認し、
hit_レイヤー名カラムを追加します。 ヒットがある場合は1、ヒットがない場合は0です。- Args:
data (pd.DataFrame): 測定データ
- Returns:
data (pd.DataFrame):hitカラムを追加したデータフレーム
- Example:
data = read_data(fnames) data = add_time(data) data = add_hit(data)
- haniwers.preprocess.add_hit_type(data: pandas.DataFrame) pandas.DataFrame#
hit_typeカラムを追加レイヤーごとのヒット情報から、ヒットの種類を計算します。 ヒット情報が計算できてない場合は、警告を表示し、元のデータを返します。
- Args:
data (pd.DataFrame):add_hitしたあとの測定データ
- Returns:
data (pd.DataFrame):hit_typeを追加したデータフレーム
- Example:
data = read_data(fnames) data = add_time(data) data = add_hit(data) data = add_hit_type(data)
- haniwers.preprocess.resample_data(data: pandas.DataFrame, interval: int)#
測定データをリサンプル
dataに指定した測定データをpandas.DataFrame.resampleでリサンプルします。 データは前処理済みのデータを指定してください。 再集計したデータをさらに、再集計することもできます。- Note:
入力データに必要なカラム:
["time", "hit_type", "hit_top", "hit_mid", "hit_btm", "adc", "tmp", "atm", "hmd"]出力データに追加されるカラム:
["interval", "event_rate", "event_rate_top", "event_rate_mid", "event_rate_btm"]
- Args:
data (pd.DataFrame): 前処理済みのデータフレームinterval (int): リサンプル間隔(秒)
- Returns:
merged (pd.DataFrame): 再集計後のデータフレーム
- haniwers.preprocess.resample_data_with_hit_type(data: pandas.DataFrame, interval: int) pandas.DataFrame#
測定データをリサンプル
ヒット種類(
hit_type)ごとにリサンプルします。- Args:
data (pd.DataFrame):hit_typeを持つデータフレームinterval (int): リサンプルの間隔(秒)
- Returns:
resampled (pd.DataFrame):hit_typeごとにリサンプルしたデータフレーム
- haniwers.preprocess.preprocess_data(data: pandas.DataFrame, interval: int, datetime_offset: int, timezone: str) tuple[pandas.DataFrame, pandas.DataFrame]#
測定データを前処理する
- Args:
data (pd.DataFrame): 測定データinterval (int): リサンプル間隔(秒)datetime_offset (int): 時刻のオフセット(秒)timezone (str): タイムゾーン情報
- Returns:
data (pd.DataFrame): 前処理したあとのデータresampled (pd.DataFrame): リサンプルしたデータ
- haniwers.preprocess.raw2csv(fnames: list[pathlib.Path], interval: int, datetime_offset: int, timezone: str) tuple[pandas.DataFrame, pandas.DataFrame]#
測定データを指定してデータフレームに変換する
- Args:
fnames (list[Path]): 前処理するファイル名のリストinterval (int): リサンプル間隔(秒)datetime_offset (int): 時刻のオフセット(秒)timezone (str): タイムゾーン情報
- Returns:
data (pd.DataFrame): 前処理したあとのデータresampled (pd.DataFrame): リサンプルしたデータ
- haniwers.preprocess.run2csv(run: haniwers.config.RunData) tuple[pandas.DataFrame, pandas.DataFrame]#
ランを指定してデータフレームに変換する
- Args:
run (RunData): RunDataオブジェクト
- Returns:
data (pd.DataFrame): 前処理したあとのデータresampled (pd.DataFrame): リサンプルしたデータ
- Example:
run = RunData(...) data, resampled = run2csv(run) print(f"gzip={len(data)}") print(f"csv ={len(resampled)}")