| import pandas as pd |
| import numpy as np |
| from datasets import load_dataset |
| import os |
|
|
| _cached_normal = None |
| _cached_fraud = None |
|
|
| def _load_paysim_data(): |
| """Loads the PaySim dataset from Hugging Face Hub (cached automatically).""" |
| global _cached_normal, _cached_fraud |
| if _cached_normal is None or _cached_fraud is None: |
| print("Loading PaySim dataset from Hugging Face Hub...") |
| |
| ds = load_dataset('theman10/paysim', split='train') |
| df = ds.to_pandas() |
| |
| |
| df = df[['step', 'type', 'amount', 'oldbalanceOrg', 'newbalanceOrig', |
| 'oldbalanceDest', 'newbalanceDest', 'isFraud']] |
| |
| _cached_normal = df[df['isFraud'] == 0] |
| _cached_fraud = df[df['isFraud'] == 1] |
| return _cached_normal, _cached_fraud |
|
|
| def generate_live_batch(batch_size: int = 15, current_step: int = 0, force_malicious: bool = False) -> pd.DataFrame: |
| """Generates a batch by sampling from the PaySim dataset.""" |
| normal_df, fraud_df = _load_paysim_data() |
| |
| if force_malicious: |
| num_fraud = np.random.choice([1, 2, 3]) |
| else: |
| num_fraud = 0 |
| |
| num_normal = batch_size - num_fraud |
| |
| batch = pd.concat([ |
| normal_df.sample(num_normal), |
| fraud_df.sample(num_fraud) if num_fraud > 0 else pd.DataFrame() |
| ]) |
| |
| batch = batch.sample(frac=1).reset_index(drop=True) |
| return batch |
|
|
| if __name__ == "__main__": |
| print("Testing PaySim data loader...") |
| df_test = generate_live_batch(5, force_malicious=True) |
| print(df_test) |
|
|