105 lines
3.5 KiB
Python
105 lines
3.5 KiB
Python
import pandas as pd
|
|
|
|
# Fungsi konversi yang sudah diperbaiki
|
|
def konversi_jawaban_fix(field_code, nilai):
|
|
"""Fungsi konversi yang sudah diperbaiki - 0 adalah jawaban valid"""
|
|
# HANYA treat empty string dan NaN sebagai NULL, BUKAN 0
|
|
if pd.isna(nilai) or nilai == '':
|
|
return None
|
|
|
|
if isinstance(nilai, str) and nilai.strip() in ['', 'nan', 'None']:
|
|
return None
|
|
|
|
original_nilai = nilai
|
|
if isinstance(nilai, str):
|
|
try:
|
|
nilai = int(nilai)
|
|
except ValueError:
|
|
pass
|
|
|
|
if isinstance(nilai, float):
|
|
if nilai != int(nilai):
|
|
return None
|
|
nilai = int(nilai)
|
|
|
|
nilai_key = nilai
|
|
if isinstance(nilai, (int, float)):
|
|
nilai_key = int(nilai)
|
|
|
|
KOMPETENSI_LEVEL = {1: 'Sangat Rendah', 2: 'Rendah', 3: 'Netral', 4: 'Tinggi', 5: 'Sangat Tinggi'}
|
|
METODE_LEVEL = {1: 'Sangat Besar', 2: 'Besar', 3: 'Cukup Besar', 4: 'Kurang', 5: 'Tidak Sama Sekali'}
|
|
YA_TIDAK = {0: 'Tidak', 1: 'Ya'}
|
|
|
|
# Kompetensi - 0 tidak valid (1-5 saja)
|
|
if field_code in ['F1761', 'F1762', 'F1763', 'F1764', 'F1765', 'F1766', 'F1767', 'F1768', 'F1769', 'F1770', 'F1771', 'F1772', 'F1773', 'F1774']:
|
|
if nilai_key == 0:
|
|
return None
|
|
return KOMPETENSI_LEVEL.get(nilai_key)
|
|
|
|
# Metode pembelajaran - 0 tidak valid (1-5 saja)
|
|
if field_code in ['F21', 'F22', 'F23', 'F24', 'F25', 'F26', 'F27']:
|
|
if nilai_key == 0:
|
|
return None
|
|
return METODE_LEVEL.get(nilai_key)
|
|
|
|
# Cara cari kerja - 0 dan 1 valid (Ya/Tidak)
|
|
if field_code in ['F401', 'F402', 'F403', 'F404', 'F405', 'F406', 'F407', 'F408', 'F409', 'F410', 'F411', 'F412', 'F413', 'F414', 'F415', 'F416']:
|
|
return YA_TIDAK.get(nilai_key)
|
|
|
|
# Alasan tidak sesuai - 0 dan 1 valid
|
|
if field_code in ['F1603', 'F1604', 'F1605', 'F1606', 'F1607', 'F1608', 'F1609', 'F1610', 'F1611', 'F1612', 'F1613']:
|
|
return YA_TIDAK.get(nilai_key)
|
|
|
|
# Bulan dapat kerja - 0-12 valid
|
|
if field_code in ['F502', 'F302', 'F303']:
|
|
return nilai_key
|
|
|
|
if isinstance(original_nilai, (int, float)):
|
|
return original_nilai
|
|
return original_nilai
|
|
|
|
# TEST
|
|
print('=== TEST FUNGSI KONVERSI (FIXED) ===')
|
|
print()
|
|
|
|
test_cases = [
|
|
# Field yang 0 adalah NULL (kompetensi, metode)
|
|
('F1761', 0, 'Kompetensi: 0 = NULL'),
|
|
('F1761', 4, 'Kompetensi: 4 = Tinggi'),
|
|
('F21', 0, 'Metode: 0 = NULL'),
|
|
('F21', 3, 'Metode: 3 = Cukup Besar'),
|
|
|
|
# Field yang 0 adalah valid (Ya/Tidak)
|
|
('F401', 0, 'Cari kerja: 0 = Tidak'),
|
|
('F401', 1, 'Cari kerja: 1 = Ya'),
|
|
('F404', 0, 'Internet: 0 = Tidak'),
|
|
('F404', 1, 'Internet: 1 = Ya'),
|
|
|
|
# Field yang 0 adalah valid (bulan)
|
|
('F502', 0, 'Bulan dapat kerja: 0 bulan'),
|
|
('F502', 6, 'Bulan dapat kerja: 6 bulan'),
|
|
('F302', 0, 'Bulan sebelum: 0 bulan'),
|
|
('F302', 3, 'Bulan sebelum: 3 bulan'),
|
|
|
|
# Text fields
|
|
('F5b', 'PT Tokopedia', 'Nama perusahaan: text'),
|
|
]
|
|
|
|
all_passed = True
|
|
for field_code, nilai, description in test_cases:
|
|
result = konversi_jawaban_fix(field_code, nilai)
|
|
expected_null = 'NULL' in description
|
|
is_correct = (result is None and expected_null) or (result is not None and not expected_null)
|
|
status = '[OK]' if is_correct else '[FAIL]'
|
|
if not is_correct:
|
|
all_passed = False
|
|
print(f'{status} {description}')
|
|
print(f' Input: {repr(nilai)} -> Output: {repr(result)}')
|
|
print()
|
|
|
|
print('='*50)
|
|
if all_passed:
|
|
print('SEMUA TEST LULUS!')
|
|
else:
|
|
print('ADA TEST YANG GAGAL!')
|