o
    Gyh%7                     @   s0  d dl mZ d dlZd dlZd dlmZ d dlZd dlZd dl	Z
e  dddddd	Zed
 eded  eded  ede  dd Zg dZg dZdd ZdedefddZdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&ejdejfd'd(Zd)d* Zd+d, Zd-d. Zd/d0 ZdS )1    )get_close_matchesN)load_dotenv	bridge_dbpostgresMaruta82	localhost5433)dbnameuserpasswordhostportu   환경변수 로딩 상태:z	DB_NAME: DB_NAMEz	DB_PORT: DB_PORTu   실제 사용 설정: c                   C   s   t jdi tS )N )psycopg2connect	DB_CONFIGr   r   r   ;/home/skpark/git/infrasmart_work/infrasmart/utils/common.pyget_db_connection   s   r   )mu   균열(0.3mm)u   균열(0.2mm)   균열   철근노출   파손u   침식u   세굴u   균열부백태u   균열부 백태u   균열/백태u   균열(0.2mm이하)u   균열(0.2mm이상)u   균열(0.3mm미만)u   균열(0.3mm이상)u   박리u   들뜸u   박락u   재료분리u	   층분리u   백태u   누수흔적u   누수오염u   표면오염u   누수u   신축하부누수u   박리/백태u   표면박리u   골재노출u   소성변형u   요철u   패임r   u   플레이트부식u   난간변형u   난간파손u   난간탈락   난간대탈락   방음벽파손u   난간지주파손u   지주파손u   교명주파손u   교명주기초파손u   교명판탈락u   설명판탈락u   토사퇴적u   토사퇴적/식생u   이물질퇴적u   폐콘크리트퇴적u   폐콘크리트적치u   볼트풀림u   볼트탈락u   마감캡탈락u   마감불량u   잡철근노출u   잡철물노출u   이물질삽입u   유송잡물적치u   볼트부식r   u   난간부식u   점검로부식u   침식/세굴u   포장파손u   포장패임   포장균열u   연석균열u   연석박리u   연석박락   연석파손u   배수구막힘r   u   부식u   도장박리u   도장박락u   배수관이음부누수u   배수관탈락u   길이부족   주의관찰   청소u   배수관길이부족u   방호울타리파손u   방호울타리탈락u   방호울타리변형r   u   방음벽탈락u   방음벽변형u   방음판파손u   방음판탈락u   방음판변형u   차광망파손u   차광망탈락u   차광망변형u   낙석방지망파손u   낙석방지망탈락u   낙석방지망변형u   낙석방지책파손u   낙석방지책탈락u   낙석방지책변형u   중분대파손u   중분대탈락u   중분대변형u   중앙분리대파손u   중앙분리대탈락u   중앙분리대변형u   경계석파손u   경계석탈락u   경계석변형u   경계석균열u   경계석박리)	   바닥판	   슬래브   거더   주형	   가로보	   세로보u   교대u   교각u   기초   교량받침   신축이음   교면포장	   포장부   난간   연석	   방호벽u   배수시설   점검시설	   점검로c                 C   s,   dd | D }t |dd d}dd |D S )Nc                 S   s   g | ]}|t |fqS r   )normalize_component.0compr   r   r   
<listcomp>=   s    z#sort_components.<locals>.<listcomp>c                 S   s"   | d t v rt | d S tt S )N   )COMPONENT_ORDERindexlen)xr   r   r   <lambda>?   s   " z!sort_components.<locals>.<lambda>)keyc                 S      g | ]}|d  qS r   r   r/   r   r   r   r2   @       )sorted)
componentsnormalized_componentssorted_componentsr   r   r   sort_components<   s
   rA   descreturnc                 C   s   t | dd} tdd| S )N  u   [^ㄱ-ㅎ가-힣a-zA-Z0-9()])normalize_damagereplaceresubrB   r   r   r   remove_special_charactersB   s   rK   c                 C   s   |   } d| v sd| v rdS d| v sd| v rdS d| v s d| v r"dS d| v s*d| v r,dS d	| v s\d
| v s\d| v s\d| v s\d| v s\d| v s\d| v s\d| v s\d| v s\d| v s\d| v s\d| v r^dS d| v sfd| v rhdS d| v spd| v rrdS | S )Nr   r    r!   r"   r#   r$   r'   r(   r)   r*   r+   u   방호울타리u	   방음벽u	   방음판u	   차광망u   낙석방지망u   낙석방지책u	   중분대u   중앙분리대u	   경계석u   난간/연석r,   r-      받침r%   )strip)	componentr   r   r   r.   H   s    `r.   c                 C   sV   t dd| } t dd| } t dd| } | tv r| S t| tddd	}|r)|d
 S | S )Nz\s+rE   z\( *(z *\))r3   g?)ncutoffr   )rH   rI   DAMAGE_KEYWORDSr   )rB   matchr   r   r   rF   \   s   rF   c                    s  t    }t fdddD } ddddddddd	dd
d td r3dS td r;dS d v r^td }|r\t|d}|dkrTdS |dkrZdS dS dS |rrtd|rhdS td|rpdS dS td rtd rdS td rdS td rdS td rd S td! rdS td" rd#S td$ rd%S td& rd'S td( rd)S dS )*Nc                 3       | ]}| v V  qd S Nr   r0   keywordrJ   r   r   	<genexpr>j       z"classify_repair.<locals>.<genexpr>)r'   u   포장r*   r&   r   u	   보수부rE   u   받침콘크리트u   받침몰탈rL   u	   전단키r*   uQ   균열\(0\.3mm\)|균열\(0\.3mm이상\)|균열\(0\.3㎜\)|균열\(0\.3㎜이상\)u   주입보수u]   균열\(0\.3mm미만\)|균열\(0\.2mm이하\)|균열\(0\.2㎜이하\)|균열\(0\.3㎜미만\)u   표면처리r   z(\d+(\.\d+)?)mmr3   g      ?u   충진보수g333333?u   균열|망상균열u   실링보수u   파손|패임|들뜸u   부분재포장r   u   신축이음|이음장치u	   후타재u'   본체파손|본체탈락|탈락|파손r   u   단면보수(방청)u@   박리|들뜸|박락|재료분리|파손|침식|세굴|층분리u   단면보수uK   백태|누수흔적|오염|망상균열|흔적|균열부백태|누수오염u4   부식|도장박리|도장박락|도장|플레이트u   도장보수u   탈락|망실|미설치u	   재설치u   막힘|퇴적|적치r   u   배수관탈락|길이부족u   배수관 재설치)rK   anyrG   rH   searchfloatgroup)rB   original_descis_pavementrT   
crack_sizer   rJ   r   classify_repairf   sV   
rb   c                 C   sP   | du s| j r	| S |  }|jD ]}|| jdkr%|| tj ||< q|S )u   
    DataFrame 내부의 모든 문자열 데이터를 trim 처리합니다.
    
    Args:
        df (pd.DataFrame): 처리할 DataFrame
        
    Returns:
        pd.DataFrame: trim 처리된 DataFrame
    Nobject)emptycopycolumnsdtypeastypestrrM   )df
df_trimmedcolumnr   r   r   trim_dataframe_data   s   

rm   c                 C   s   | du s| j r	| S |  }d|jv r tj|d ddd|d< d|jv r3tj|d ddd|d< d|jv rA|d t|d< |S )u   
    DataFrame의 숫자 컬럼들을 정리하고 trim 처리합니다.
    
    Args:
        df (pd.DataFrame): 처리할 DataFrame
        
    Returns:
        pd.DataFrame: 처리된 DataFrame
    Nu   손상물량coerce)errorsr   u   개소u   부재위치)rd   re   rf   pd
to_numericfillnarh   ri   )rj   df_processedr   r   r   trim_dataframe_numeric_columns   s   



rt   c                 C   s0   | du s| j r	| S t| }t|}|d}|S )u   
    DataFrame의 모든 데이터를 정리하고 trim 처리합니다.
    
    Args:
        df (pd.DataFrame): 처리할 DataFrame
        
    Returns:
        pd.DataFrame: 정리된 DataFrame
    NrE   )rd   rm   rt   rr   )rj   
df_cleanedr   r   r   clean_dataframe_data   s   

rv   rj   c                 C   s<   t | } 	 | jdgdjD ]}| | tj | |< q| S )Nrc   )include)trim_dataframe_str_columnsselect_dtypesrf   rh   ri   rM   )rj   colr   r   r   rx      s
   rx   c                 C   s:   t  }| }|d| f dd | D }|  |S )u=   meta_keyword 테이블에서 meta_id로 keyword 목록 조회z@SELECT keyword FROM meta_keyword WHERE use_yn='Y' AND meta_id=%sc                 S   r:   r;   r   r0   rowr   r   r   r2      r<   z0get_meta_keywords_by_meta_id.<locals>.<listcomp>)r   cursorexecutefetchallclose)meta_idconncurkeywordsr   r   r   get_meta_keywords_by_meta_id   s   r   c                 C   sH   t  }| }|d| f | }td| dd |D }|  |S )NzASELECT keyword FROM damage_meta WHERE use_yn='Y' AND parent_id=%su   조회 결과:c                 S   r:   r;   r   r{   r   r   r   r2     r<   zget_meta.<locals>.<listcomp>)r   r}   r~   r   printr   )	parent_idr   r   rowsr   r   r   r   get_meta  s   
r   c           
         s   t  }| }|dd | }dd |D }dd |D }dd t||D } |v r1|  S | D ]\}}| v rA|  S q5td}	t fd	d
|	D rSdS td   dS )u   부재명을 API 키로 변환zHSELECT keyword, source FROM meta_keyword WHERE use_yn='Y' AND meta_id=%s)200075c                 S   r:   r;   r   r{   r   r   r   r2     r<   z1convert_component_name_to_key.<locals>.<listcomp>c                 S   r:   )r3   r   r{   r   r   r   r2     r<   c                 S   s   i | ]\}}||qS r   r   )r0   rX   sourcer   r   r   
<dictcomp>  s    z1convert_component_name_to_key.<locals>.<dictcomp>iQ c                 3   rU   rV   r   rW   component_namer   r   rY   Y  rZ   z0convert_component_name_to_key.<locals>.<genexpr>railingzUnknown component name: N)	r   r}   r~   r   zipitemsr   r[   r   )
r   r   r   r   r   sourcesmappingr9   valuerailing_keywordsr   r   r   convert_component_name_to_key  s$   4r   c                 C   s>   t  }| }|d| |f | }|  |r|d S dS )uN   
    meta_keyword 테이블에서 meta_id와 keyword로 source 값 조회
    zNSELECT source FROM meta_keyword WHERE use_yn='Y' AND meta_id=%s AND keyword=%sr   N)r   r}   r~   fetchoner   )r   rX   r   r   r|   r   r   r   !get_source_by_meta_id_and_keyword^  s   r   ) difflibr   rH   r   dotenvr   ospandasrp   numpynpr   r   getenvr   rS   r4   rA   ri   rK   r.   rF   rb   rm   rt   rv   	DataFramerx   r   r   r   r   r   r   r   r   <module>   sD    	
:L