"""标准库只检查可移植契约;不冒充真实pandas对象或Vibe运行。""" import json from dataclasses import dataclass @dataclass class Signals: index: list values: list class SignalEngine: semantics = 'target_long_state' def generate(self, data_map): result = {} for symbol, rows in data_map.items(): result[symbol] = Signals([r[0] for r in rows], [int(i >= 2 and r[1] > sum(x[1] for x in rows[i-2:i+1]) / 3) for i, r in enumerate(rows)]) return result def validate(engine, data_map, output): if getattr(engine, 'semantics', None) != 'target_long_state': raise ValueError('semantics') if not isinstance(output, dict) or set(output) != set(data_map): raise ValueError('output_keys_or_type') for symbol, rows in data_map.items(): index = [r[0] for r in rows] series = output[symbol] if len(index) != len(set(index)): raise ValueError('duplicate_index') if not isinstance(series, Signals) or series.index != index: raise ValueError('series_or_index') if len(series.values) != len(index) or not set(series.values) <= {0, 1}: raise ValueError('signal_domain') data = {'US:A': [('d1', 10), ('d2', 10), ('d3', 12)], 'US:B': [('d1', 10), ('d2', 10), ('d3', 8)]} engine = SignalEngine() out = engine.generate(data) validate(engine, data, out) assert out['US:A'].values == [0, 0, 1] and out['US:B'].values == [0, 0, 0] failures = [] for label, test_data, test_out in [ ('wrong_return', data, []), ('wrong_keys', data, {'A': out['US:A']}), ('duplicate_index', {'US:A': [('d1', 10), ('d1', 12)]}, {'US:A': Signals(['d1','d1'], [0,1])}), ('wrong_series', data, dict(out, **{'US:A': [0, 0, 1]})), ('wrong_domain', data, dict(out, **{'US:A': Signals(['d1','d2','d3'], [0,0,-1])}))]: try: validate(engine, test_data, test_out) except ValueError: failures.append(label) assert len(failures) == 5 engine.semantics = None try: validate(engine, data, out) except ValueError as error: assert str(error) == 'semantics' else: raise AssertionError('未声明信号语义必须被拒绝') print(json.dumps({'signals': {s: x.values for s, x in out.items()}, 'rejected': failures, 'undeclared_semantics_rejected': True, 'scope': 'portable contract only; not a pandas type test'}))