1
1
2026-06-04 3ee8742df6bc2da18b159d9ea769f7dd44e062d3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Ë
HÝj¸ãó”—dZddlmZddlZddlZddlZddlmZddlm    Z    ddl
m Z d d„Z d d„Z dd    „Zdd
„Zed k(r ee««‚y)z<Small CSV profiling helper for Project F experiment dry-run.é)Ú annotationsN)ÚCounter)ÚPath)ÚAnycó—|jddd¬«5}tj|«}|js t    d«‚|Dcgc] }t |«‘Œ}}t |j«|fcddd«Scc}w#1swYyxYw)NÚrz    utf-8-sigÚ©ÚencodingÚnewlinezinput CSV has no header)ÚopenÚcsvÚ
DictReaderÚ
fieldnamesÚ
ValueErrorÚdictÚlist)Ú
input_pathÚfhÚreaderÚrowÚrowss     úcsv_profile_experiment.pyÚ
_read_rowsr s|€Ø    ‰˜ {¸BˆÔ    ?À2Ü—‘ Ó#ˆØ× Ò ÜÐ6Ó7Ð 7Ù%+Ó,¡V˜c”S•     VˆÐ,ܐF×%Ñ%Ó&¨Ð,÷
@Ñ    ?ùò-÷    
@Р   ?ús•1A?ÁA:ÁA?Á:A?Á?Bc    óJ‡    ‡
‡ —t|«\Š
}iŠ ‰
D]Š    tˆ    fd„|D««‰ ‰    <Œ|Dcgc]%}|jd«xsdj«‘Œ'}}|Dcgc]}|sŒ|‘Œ    }}t    |«t    t |««z
}i}d‰
vr2t ttd„|D««j«««}t|«xr|dk(xrtˆ
ˆ fd„dD««}t|«t    |«t    ‰
«‰
‰ |||d    œScc}wcc}w)
Nc3ój•K—|]*}|j‰«xsdj«rŒ'd–—Œ,y­w)r    éN©ÚgetÚstrip)Ú.0rÚcolumns  €rÚ    <genexpr>z build_profile.<locals>.<genexpr>s+øèø€Ð'a±T¨cÀ#Ç'Á'È&Ã/ÒBWÐUW×A^ÑA^ÕA`¬±Tùsƒ(3¬3Úidr    Úgroupc3ójK—|]+}|jd«xsdj«xsd–—Œ-y­w)r%r    ÚMISSINGNr)r!rs  rr#z build_profile.<locals>.<genexpr>"s3èø€Ð*iÑdhÐ]`¨C¯G©G°GÓ,<Ò,BÀ×+IÑ+IÓ+KÒ+XÈyÓ+XÑdhùs‚13rc3óR•K—|]}|‰vsŒ‰j|d«dk(–—Œ y­w)rN)r)r!r"ÚcolumnsÚmissing_by_columns  €€rr#z build_profile.<locals>.<genexpr>$s3øèø€ðBÙ<b°&ÐflÐpwÒfwÐ×јf aÓ(¨AÕ-Ñ<bùsƒ    '')r$r%ÚvalueÚ
event_date)rÚ    row_countÚ column_countr)r*Úduplicate_id_countÚ group_countsÚ quality_pass) rÚsumrr ÚlenÚsetrÚsortedrÚitemsÚboolÚallÚstr) rrrÚ    id_valuesr+Ú nonempty_idsr/r0r1r"r)r*s          @@@rÚ build_profiler<s.ú€Ü˜zÓ*M€GˆTØ(*ÐÛˆÜ$'Ó'a±TÓ'aÓ$aИ&Ò!ðñ;?Ó?¹$°3#—'‘'˜$“-Ò% 2×,Ñ,Õ.¸$€IÐ?Ù'0Ó:¡y˜e²E’E y€LÐ:ܘ\Ó*¬S´°\Ó1BÓ-CÑCÐà#%€Lؐ'ÑÜœF¤7Ñ*iÑdhÓ*iÓ#i×#oÑ#oÓ#qÓrÓsˆ 䘓:òÐ"4¸Ñ"9ò¼côBÙ<bóBó?€Lô
˜*“oܘ“YܘG› ØØ.Ø0Ø$Ø$ñ     ð    ùò@ùÚ:s¶*DÁ&D Á.D cóÄ—|jdd¬«|dz jtj|dd¬«dzd¬    «|d
z j    d dd ¬ «5}t j |ddg¬«}|j«|dj«D]\}}|j||dœ«Œ    ddd«dd dddddd d|d›d|d›d|d›dt|d «j«›d d!g}|d"j«D]\}}|jd#|›d$|›«Œ|d%z jdj|«dzd¬    «y#1swYŒ£xYw)&NT)ÚparentsÚexist_okz summary.jsonFé)Ú ensure_asciiÚindentÚ
zutf-8)r zcolumn_quality.csvÚwr    r
r"Ú missing_count)rr*)r"rEz# CSV Profile Readoutu(创建人员:csv_profile_experiment.pyuA文件职责:记录 RUN-F-DEV-001 çš„ CSV è´¨é‡ç»Ÿè®¡æ‘˜è¦ã€‚uP管理规范/模板:exp-doc/实验存储体系.md;exp-doc/实验设计.md。ua引用文件:summary.json;column_quality.csv;exp-data/raw/EXP-F-DEV-001/input_sample.csv。uF记录方式:实验结果包 readout;由 helper è¿è¡Œæ—¶ç”Ÿæˆã€‚z row_count: r-zcolumn_count: r.zduplicate_id_count: r/zquality_pass: r1z group_counts:r0z- z: z
readout.md)ÚmkdirÚ
write_textÚjsonÚdumpsr rÚ
DictWriterÚ writeheaderr6Úwriterowr9ÚlowerÚappendÚjoin)    ÚprofileÚ
output_dirrÚwriterr"rEÚreadoutr%Úcounts             rÚ write_outputsrU4sš€Ø×јT¨DÐÔ1à.Ñ ×,Ñ,Ü 
‰
7¨°qÔ9¸DÑ@Øð-ôð
Ð+Ñ
+×    1Ñ    1°#ÀÐQSР   1Ô    TÐXZÜ—‘ °¸/Ð/JÔKˆØ×ÑÔØ%,Ð-@Ñ%A×%GÑ%GÖ%IÑ !ˆFMØ O‰O vÀ ÑNÕ Oñ&J÷
Uð     Ø
Ø2ØKØZØkØPØ
Ø
g˜kÑ*Ð+Ð,Ø
˜ Ñ0Ð1Ð2Ø
˜wÐ';Ñ<Ð=Ð>Ø
œ˜W ^Ñ4Ó5×;Ñ;Ó=Ð>Ð?Ø
Øð€Gð   Ñ/×5Ñ5Ö7‰ ˆˆu؏‰˜˜E˜7 " U GÐ,Õ-ð8à,Ñ×*Ñ*¨4¯9©9°WÓ+=ÀÑ+DÈwÐ*ÕW÷1
UР   Tús ÁAEÅEcó—tjd¬«}|jddt¬«|jddt¬«|j    «}t |j «}t||j«y)Nz:Profile a CSV and write a small experiment result package.)Ú descriptionz--inputT)ÚrequiredÚtypez --output-dirr)    ÚargparseÚArgumentParserÚ add_argumentrÚ
parse_argsr<ÚinputrUrQ)ÚparserÚargsrPs   rÚmainraWsj€Ü × $Ñ $Ð1mÔ n€FØ
×ј    ¨D´tÐÔ<Ø
×ј°¼DÐÔAØ × Ñ Ó €Dä˜DŸJ™JÓ'€Gܐ'˜4Ÿ?™?Ô+Ø óÚ__main__)rrÚreturnz&tuple[list[str], list[dict[str, str]]])rrrdúdict[str, Any])rPrerQrrdÚNone)rdÚint)Ú__doc__Ú
__future__rrZrrHÚ collectionsrÚpathlibrÚtypingrrr<rUraÚ__name__Ú
SystemExit©rbrÚ<module>rpsOðÙBå"ãÛ
Û ÝÝÝó-óó< XóF ð ˆzÒÙ
‘T“VÓ
Ððrb