Package: vos-data-utils
vos-data-utilsvos-data-utils is a shared utility library essential for 'Value of Space' data worksNotable ChangesVersion 1.0.0 - 2024.01공간의가치 데이터 작업 공용 유틸리티 라이브러리 최초 배포구성원의 개별 라이브러리(vos-mjjo,nqnq) 기능 통합업데이트법정동 데이터 업데이트(행정구역 변경사항 반영)2024년 1월 1일: '경기도 부천시' 관련 행정구역 변경2024년 1월 18일: '전북특별자치도' 관련 행정구역 변경법정동 데이터 저장 규칙 업데이트 및 데이터 폴더 구조 업데이트다중 시점의 법정동 데이터 저장법정동 관련 모듈 클래스 인스턴스base_dt속성값 추가 및base_dt기준으로 적정시점 법정동 읽기 방식 적용모듈 클래스 인스턴스 생성시base_dt속성값 이전 시점중 최신 시점 법정동 데이터 선택 및 읽기genpnu 모듈 업데이트np.pnu 기반 모듈모듈 내 함수 리팩터링(refactoring)모듈 내 함수 타입힌트 강화 및 예외처리 추가유닛 테스트 코드(test_genpnu) 작성vid 모듈 업데이트np.pnu 기반 모듈모듈 내 함수 리팩터링(refactoring)유닛 테스트 코드(test_vid) 작성배포 관련 업데이트github action 배포시 파이썬 버전별 빌드(build), 테스트(test) 적용빌드 및 테스트 파이썬 버전: 3.7, 3.8, 3.9, 3.10, 3.11Version 1.0.1 - 2024.02업데이트법정동 데이터 업데이트(행정구역 변경사항 반영)2024년 2월 1일: '경상북도 영천군 호명읍' 관련 행정구역 변경날짜 빈도 dictionary 업데이트Installpipinstallvos-data-utilsUsageCordate(Correct Date)8자리의 날짜(YYYYMMDD) 형식으로 작성되어 있지 못하고 6자리(YYYYMMorYYMMDD, ...) 혹은 다른 자리수로 날짜와 오타 혹은 오기입으로 현재시점에서 부적절한 날짜가 제공되었을 경우, 이를 교정하여 8자리의 날짜(YYYYMMDD) 형식으로 전달하는 모듈해당 날짜 교정 모듈은건축물대장 날짜(착공연월,허가연월,준공연월)를 교정하기 위해 개발되었으며 건축물대장 날짜 특성상 현재 기준으로 미래 날짜는 존재할 수 없기 때문에 현재를 기준으로 과거 날짜로만 교정됨해당 날짜 교정 모듈에서 날짜를 교정하는 알고리즘은 2가지로첫번째는 연, 월, 일의 범위와 규칙을 이용하여현재 날짜까지 생성 가능한 모든 날짜 리스트와 최신 날짜로 교정하는 방법두번째는 미리 생성되어 있는 건축물대장 날짜 빈도 딕셔너리(data.date_dictionary.txt)에서 거리(날짜 문자열간의 차이 문자열 개수)와 빈도를 이용하여 가장 유사한 리스트와 최유사 날짜로 교정하는 방법으로 구성되어 있음Show instructionscordate.get_correct_array입력된 문자열을 이용해 날짜 생성 규칙에 따라 현재 날짜까지 생성 가능한 모든 날짜를 리스트로 리턴날짜 생성 규칙이란 연, 월, 일의 범위를 이용하는것으로 연도는 올해연도까지, 월은 1부터 12월까지, 일은 월별로 지정된 일까지를 의미하며YYYYMMDD형식의 날짜에서 연도는 4자리, 월, 일은 2자리로 표기하지만 자리수 범위는 각 [0:4],[0:2],[0:2] 차지함ExampleRunfromvdutilsimportcordatecordate.get_correct_array("99990101")cordate.get_correct_array("9990101")cordate.get_correct_array("990101")cordate.get_correct_array("199901")cordate.get_correct_array("019991")cordate.get_correct_array("19991")cordate.get_correct_array("1999")cordate.get_correct_array("9901")Output[]["19990101"]["19900101","19901001","19990101"]["01990901","19990101"]["01990901","19990101"]["01990901","19990101"]["01990109","00190909","01990901","19990101"]["19900101","00090901","19990101"]cordate.get_correct_one입력된 문자열을 이용해 날짜 생성 규칙에 따라 현재 날짜까지 생성 가능한 모든 날짜 리스트중 가장 최신날짜를 리턴날짜 생성 규칙이란 연,월,일의 범위를 이용하는것으로 연도는 올해연도까지, 월은 1부터 12월까지, 일은 월별로 지정된 일까지를 의미하며 YYYYMMDD 형식의 날짜에서 연도는 4자리, 월, 일은 2자리로 표기하지만 자리수 범위는 각 [0:4],[0:2],[0:2] 차지ExampleRunfromvdutilsimportcordatecordate.get_correct_one("99990101")cordate.get_correct_one("9990101")cordate.get_correct_one("990101")cordate.get_correct_one("199901")cordate.get_correct_one("019991")cordate.get_correct_one("19991")cordate.get_correct_one("1999")cordate.get_correct_one("9901")OutputNone"19990101""19990101""19990101""19990101""19990101""19990101""19990101"cordate.look_up_array건축물대장 날짜 빈도 딕셔너리(data.date_dictionary.txt) 로드 필요입력된 문자열을 이용해 data 건축물대장 날짜 빈도 딕셔너리(data.date_dictionary.txt) 에서 Symspellpy(max_distance=2) 알고리즘 적용하여 유사한 날짜 리스트 리턴유사도 가중은 거리, 빈도 순으로 거리가 가까운 순서로 빈도수가 많은 순서로 정렬ExampleRunfromvdutilsimportcordateCD=cordate.CorDate()CD.load_date_dictionary()# 라이브러리 배포 폴더에 있는 date_dictionary.txt 로드CD.look_up_array("99990101")Output[<symspellpy.suggest_item.SuggestItemat0x7fe5facdab60>,<symspellpy.suggest_item.SuggestItemat0x7fe5fad145e0>,<symspellpy.suggest_item.SuggestItemat0x7fe5fad15960>,<symspellpy.suggest_item.SuggestItemat0x7fe5fad14220>,<symspellpy.suggest_item.SuggestItemat0x7fe5fad164a0>,<symspellpy.suggest_item.SuggestItemat0x7fe5fad151e0>,<symspellpy.suggest_item.SuggestItemat0x7fe5fad155a0>,<symspellpy.suggest_item.SuggestItemat0x7fe5facf5870>,<symspellpy.suggest_item.SuggestItemat0x7fe5fad0c4c0>,<symspellpy.suggest_item.SuggestItemat0x7fe5fad0c520>,...]RunfromvdutilsimportcordateCD=cordate.CorDate()CD.load_date_dictionary()# 라이브러리 배포 폴더에 있는 date_dictionary.txt 로드suggestions=CD.look_up_array("99990101")forsugginsuggestions:# symspellpy.suggest_item 타입의 리스트는 반복문을 이용해 값을 확인 가능print(sugg)Output19990101,1,716# term, distance, count19980101,2,136119960101,2,135119970101,2,131719950101,2,128619940101,2,123619920101,2,87019930101,2,84319910101,2,81619990901,2,743...cordate.look_up_one건축물대장 날짜 빈도 딕셔너리(data.date_dictionary.txt) 로드 필요입력된 문자열을 이용해 data 건축물대장 날짜 빈도 딕셔너리(data.date_dictionary.txt) 에서 Symspellpy(max_distance=2) 알고리즘 적용하여 거리, 빈도 순으로 유사도 정렬된 날짜 리스트 중 첫번째 날짜(최유사)를 리턴ExampleRunfromvdutilsimportcordateCD=cordate.CorDate()CD.load_date_dictionary()# 라이브러리 배포 폴더에 있는 date_dictionary.txt 로드CD.look_up_one("99990101")Output<symspellpy.suggest_item.SuggestItemat0x7fe5fad0c190>RunfromvdutilsimportcordateCD=cordate.CorDate()CD.load_date_dictionary()# 라이브러리 배포 폴더에 있는 date_dictionary.txt 로드print(CD.look_up_one("99990101"))# symspellpy.suggest_item 타입의 값 출력문을 이용해 확인 가능Output19990101,1,158# term, distance, countcordate.look_up_array_cleancordate.look_up_array 와 동일하지만 symspellypy.suggest_item.SuggestItem 타입 리스트를 정렬을 유지한 날짜값만 추출하여 리스트 리턴ExampleRunfromvdutilsimportcordateCD=cordate.CorDate()CD.load_date_dictionary()# 라이브러리 배포 폴더에 있는 date_dictionary.txt 로드CD.look_up_array_clean("99990101")Output['19990101','19980101','19960101','19970101','19950101','19940101','19920101','19930101','19910101',...]cordate.look_up_one_cleancordate.look_up_one 과 동일하지만 symspellypy.suggest_item.SuggestItem 타입 리스트를 정렬을 유지한 날짜값만 추출하여 리스트 리턴ExampleRunfromvdutilsimportcordateCD=cordate.CorDate()CD.load_date_dictionary()# 라이브러리 배포 폴더에 있는 date_dictionary.txt 로드CD.look_up_one_clean("99990101")Output'19990101'ConvAddr(Convert Address)법정동 변경내역을 기반으로 과거 법정동명의 주소를 입력시에 현행 법정동으로 변환하여 전달하는 모듈입력되는 주소는 시도, 시군구, 읍면동, 동리, 번지 순으로 기재되는 지번 체계를 기반으로 하며 해당 법정동 교정 모듈에서는 법정동(시도, 시군구, 읍면동, 동리)와 번지 사이의 공백을 일부 교정하고 과거 법정동명으로 입력되었을 경우 현행 법정동명으로 교체함법정동명 교체 예시로는인천직할시->인천광역시,강원도->강원특별자치도,경북 군위군->대구 군위군등을 들 수 있으며 시도, 시군구, 읍면동, 동리 모든 변경사항에 적용됨Show instructionsconvaddr.correct_simple_spacing입력된 주소 문자열(한글로 이루어진 지번 체계 주소)의 2개 이상의 연속된 공백을 단일 공백으로 변환하여 리턴ExampleRunfromvdutilsimportconvaddrCA=convaddr.ConvAddr()print(CA.correct_simple_spacing(addr="서울시 강남구  삼성동 1"))Output서울시강남구삼성동1convaddr.correct_smallest_bjd_spacing입력된 주소 문자열(한글로 이루어진 지번 체계 주소)의 최소 단위 법정동명("가", "동", "로", "리")과 번지 사이의 공백이 없을경우 단일 공백을 추가하여 리턴ExampleRunfromvdutilsimportconvaddrCA=convaddr.ConvAddr()print(CA.correct_smallest_bjd_spacing(addr="서울시 강남구 삼성동1"))Output서울시강남구삼성동1convaddr.correct_changed_bjd입력된 주소 문자열(한글로 이루어진 지번 체계 주소)의 과거 법정동명이 존재하면 변경 후 법정동명으로 변환하여 리턴is_log == True 일 경우, 변경 전 후 법정동명을 출력ExampleRunfromvdutilsimportconvaddrCA=convaddr.ConvAddr()print(CA.correct_changed_bjd(addr="강원도 춘천시 서면 현암리 1-1",is_log=False))Output강원특별자치도춘천시서면현암리1-1RunfromvdutilsimportconvaddrCA=convaddr.ConvAddr()print(CA.correct_changed_bjd(addr="강원도 춘천시 서면 현암리 1-1",is_log=True))Output2024-01-1714:03:27|[INFO]|강원도춘천시서면현암리2024-01-1714:03:27|[INFO]|해당법정동명은변경되었습니다.변경전:[강원도춘천시서면현암리]변경후:[강원특별자치도춘천시서면현암리]강원특별자치도춘천시서면현암리convaddr.correct_bjd입력된 주소 문자열(한글로 이루어진 지번 체계 주소)의 correct_simple_spacing(법정동 사이 2개 이상의 연속된 공백을 단일 공백으로 변경하는 함수), correct_smallest_bjd_spacing(최소단위 법정동과 번지 사이 공백 수정하는 함수), correct_changed_bjd(과거 법정동명 현행 법정동명으로 교정하는 함수) 순차적으로 실행하여 교정된 현행 주소 문자열을 리턴is_log == True 일 경우, 변경 전 후 법정동명을 출력ExampleRunfromvdutilsimportconvaddrCA=convaddr.ConvAddr()print(CA.correct_bjd(addr="서울시 강남구 삼성동 1",is_log=False))Output서울시강남구삼성동1RunfromvdutilsimportconvaddrCA=convaddr.ConvAddr()print(CA.correct_bjd(addr="강원도춘천시 서면 현암리 1-1",is_log=False))print(CA.correct_bjd(addr="강원도 춘천 시 서면 현암리 1-1",is_log=False))print(CA.correct_bjd(addr="강원도 춘천시 서면 현암리",is_log=False))print(CA.correct_bjd(addr="강원도 춘천시 서면 현암리 1-1",is_log=False))print(CA.correct_bjd(addr="강원도 춘천시 서면 현암리1-1",is_log=False))print(CA.correct_bjd(addr="강원도   춘천시 서면 현암리 1-1",is_log=False))Output강원도춘천시서면현암리1-1# 시도, 시군구와 같이 최소단위 법정동의 띄어쓰기가 올바르지 않을 경우, 변환 불가강원도춘천시서면현암리1-1# 시도, 시군구와 같이 최소단위 법정동의 띄어쓰기가 올바르지 않을 경우, 변환 불가강원특별자치도춘천시서면현암리강원특별자치도춘천시서면현암리1-1강원특별자치도춘천시서면현암리1-1강원특별자치도춘천시서면현암리1-1BjdConnector관리중인 전체기간(1988-)의 법정동의 전체 및 단위(시도, 시군구, 읍면동, 동리) 법정동을 오브젝트(Object)화하고 이를 법정동 체계에 따라 단위 법정동(시도, 시군구, 읍면동, 동리)간의 관계와 변경내역을 기반으로 변경 전 후 법정동의 관계를 그래프(Graph)화하여 딕셔너리로 생성하는 모듈법정동의 전체 및 단위 오브젝트 예시로는서울특별시 강남구 삼성동의 경우,전체 법정동은서울특별시 강남구 삼성동단위 법정동은 시도 단위의서울특별시, 시군구 단위의강남구, 읍면동 단위의삼성동, 동리 단위는없음(Null)단위 법정동은 시도 단위 > 시군구 단위 > 읍면동 단위 > 동리 단위 순으로 포함관계, 부모자식관계이며 BjdConnectorGraph는 위와 같은 단위 법정동 관계들을 구조적으로 형성한 딕셔너리임해당 모듈에서 관리하는 인스턴스는 총 5개로 다음과 같음BjdObject: BjdConnector 의 metadata 로 법정동 타입과 코드, 명, 상하위 단위 법정동별 유무, 코드, 명, 생성일자 등이 관리되는 객체BjdConnector: 단위 법정동별 객체로 법정동 타입과 코드, 명, 상하위 단위 법정동 객체, 최소단위 법정동 유무 등이 관리되는 객체BjdConnectorGraph: 법정동 코드: BjdConnector 가 KeyValue 로 입력된 딕셔너리 형식의 객체로 각 BjdConnector 이 상위 법정동(top_bjd), 하위 법정동(bottom_bjd) 으로 연결되어 있는 구조FullBjdConnector: 전체 법정동별 객체로 현시점 존재유무, 생성일, 삭제일, 전체 법정동 코드, 명, 변경 전 법정동, 변경 후 법정동, 소속된 단위 법정동 BjdConnector, 코드, 명 등이 관리되는 객체FullBjdConnectorGraph: 법정동 코드: FullBjdConnector 가 KeyValue 로 입력된 딕셔너리 형식의 객체로 각 FullBjdConnector 의 변경 전 법정동(before) 변경 후 법정동(after) 으로 연결되어 있는 구조Show instructionsBjdConnectorGraph단위 법정동 커넥터 그래프(Graph) 클래스단위 법정동 커넥터 그래프(Graph) 는단위 법정동간의 관계를 정의한 그래프|-- 시도 (Node)
|   |
|   |-- 시군구 (Node)
|   |   |
|   |   |-- 읍면동 (Node)
|   |   |   |
|   |   |   |-- 동리 (Node)
|   |   |   |-- 동리 (Node)
|   |   |   |-- ...
|   |   |-- 읍면동 (Node)
|   |   |   |
|   |   |   |-- 동리 (Node)
|   |   |   |-- 동리 (Node)
|   |   |   |-- ...
|   |   |-- ...
|   |
|   |-- 시군구 (Node)
|   |   |
|   |   |-- 읍면동 (Node)
|   |   |-- 읍면동 (Node)
|   |   |-- ...
|   |-- ...
|-- ...단위 법정동 커넥터 그래프(Graph) 는 단위 법정동 커넥터(Connector)들을 생성하고 관계를 설정하여 각 단위 법정동 커넥터(Connector)의 값을 업데이트 함. 또한 결과물을 key, value{단위 법정동 코드: 단위 법정동 커넥터(Connector)} 형태의 딕셔너리(dictionary)bjd_connectors와 데이터프레임(pandas.DataFrame())bjd_current_df로 생성하고 편집하여 보유함ExampleRunfromvdutils.bjdconnectorimportBjdConnectorGraphBCG=BjdConnectorGraph()BCG.bjd_connectorsOutput{'1100000000': BjdConnector(),
'1111000000': BjdConnector(),
'1111010100': BjdConnector(),
'1111010200': BjdConnector(),
'1111010300': BjdConnector(),
'1111010400': BjdConnector(),
'1111010500': BjdConnector(),
'1111010600': BjdConnector(),
'1111010700': BjdConnector(),
'1111010800': BjdConnector(),
'1111010900': BjdConnector(),
...}BjdConnector단위 법정동 커넥터(Connector) 클래스단위 법정동 커넥터(Connector) 는 해당 단위 법정동의 오브젝트(Object)를 메타데이터(metadata)로 보유하며, 단위 법정동 코드(bjd_cd), 단위 법정동 명(bjd_nm), 단위 법정동 타입(typ), 상위 법정동 코드 리스트(top_bjd_cd), 상위 법정동 명 리스트(top_bjd_nm), 상위 법정동 커넥터(top_bjd), 하위 법정동 코드(bottom_bjd_cd), 하위 법정동 명(bottom_bjd_nm), 하위 법정동 커넥터(bottom_bjd) 등의 데이터를 포함하고 있음단위 법정동 커넥터 구조는 아래와 같음Class@dataclassclassBjdConnector():def__init__(self,bjd_cd:str,full_bjd_nm:str):self.typ:str=Noneself.bjd_cd:str=bjd_cdself.bjd_nm:str=Noneself.full_bjd_nm:str=full_bjd_nmself.metadata:BjdObject()=Noneself.top_bjd_typ:Optional[str]=Noneself.top_bjd_cd:List[str]=[]self.top_bjd_nm:List[str]=[]self.top_bjd:List[BjdConnector()]=[]self.bottom_bjd_cd:List[str]=[]self.bottom_bjd_nm:List[str]=[]self.bottom_bjd:List[BjdConnector()]=[]self.is_smallest:bool=Noneself._update_metadata()self._update_top_bjd()ExampleRunfromvdutils.bjdconnectorimportBjdConnectorGraphBCG=BjdConnectorGraph()BCG.bjd_connectors.get('1100000000')._print()Outputtyp: sido
bjd_cd: 1100000000
bjd_nm: 서울특별시
full_bjd_nm: 서울특별시
metadata: BjdObject()
top_bjd_typ: None
top_bjd_cd: []
top_bjd_nm: []
top_bjd: []
bottom_bjd_cd: ['1111000000', '1114000000', '1117000000', '1120000000', '1121500000', '1123000000', '1126000000', '1129000000', '1130500000', '1132000000', '1135000000', '1138000000', '1141000000', '1144000000', '1147000000', '1150000000', '1153000000', '1154500000', '1156000000', '1159000000', '1162000000', '1165000000', '1168000000', '1171000000', '1174000000']
bottom_bjd_nm: ['종로구', '중구', '용산구', '성동구', '광진구', '동대문구', '중랑구', '성북구', '강북구', '도봉구', '노원구', '은평구', '서대문구', '마포구', '양천구', '강서구', '구로구', '금천구', '영등포구', '동작구', '관악구', '서초구', '강남구', '송파구', '강동구']
bottom_bjd: [BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector()]
is_smallest: FalseBjdObject단위 법정동 오브젝트(Object) 클래스단위 법정동 오브젝트(Object) 는 해당 단위 법정동의 단위 법정동 코드(bjd_cd), 단위 법정동 명(bjd_nm), 단위 법정동 타입(typ) 등의 데이터를 포함하고 있음BjdConnector 의 메타데이터(metadata) 값으로 되어있음단위 법정동 오브젝트(Object) 구조는 아래와 같음Class@dataclassclassBjdObject():def__init__(self,bjd_cd:str,full_bjd_nm:str):self.bjd_cd:str=bjd_cdself.full_bjd_nm:str=full_bjd_nmself.typ:str=Noneself.sido:Optional[bool]=Noneself.sgg:Optional[bool]=Noneself.emd:Optional[bool]=Noneself.ri:Optional[bool]=Noneself.sido_nm:Optional[str]=Noneself.sgg_nm:Optional[str]=Noneself.emd_nm:Optional[str]=Noneself.ri_nm:Optional[str]=Noneself.sido_cd:Optional[str]=Noneself.sgg_cd:Optional[str]=Noneself.emd_cd:Optional[str]=Noneself.ri_cd:Optional[str]=Noneself.bjd_nm:str=Noneself._prepare()ExampleRunfromvdutils.bjdconnectorimportBjdConnectorGraphBCG=BjdConnectorGraph()BCG.bjd_connectors.get('1100000000').metadata._print()Outputbjd_cd: 1100000000
bjd_nm: 서울특별시
full_bjd_nm: 서울특별시
typ: sido
sido: True
sgg: None
emd: None
ri: None
sido_nm: 서울특별시
sgg_nm: None
emd_nm: None
ri_nm: None
sido_cd: 1100000000
sgg_cd: None
emd_cd: None
ri_cd: NoneFullBjdConnectorGraph법정동 커넥터 그래프(Graph) 클래스법정동 커넥터 그래프(Graph) 는 BjdConnectorGraph 에변경 전 후 관계를 추가한 그래프법정동 커넥터 그래프(Graph) 는 법정동 커넥터(Connector)들을 생성하고 관계를 설정하여 각 법정동 커넥터(Connector)의 값을 업데이트 함. 또한 결과물을 key, value{법정동 코드: 법정동 커넥터(Connector)} 형태의 딕셔너리(dictionary)full_bjd_connectors와 데이터프레임(pandas.DataFrame())bjd_df로 생성하고 편집하여 보유함ExampleRunfromvdutils.bjdconnectorimportFullBjdConnectorGraphFBCG=FullBjdConnectorGraph()FBCG.bjd_connectorsOutput{'1100000000': FullBjdConnector(),
'1111000000': FullBjdConnector(),
'1111010100': FullBjdConnector(),
'1111010200': FullBjdConnector(),
'1111010300': FullBjdConnector(),
'1111010400': FullBjdConnector(),
'1111010500': FullBjdConnector(),
'1111010600': FullBjdConnector(),
'1111010700': FullBjdConnector(),
'1111010800': FullBjdConnector(),
'1111010900': FullBjdConnector(),
...}FullBjdConnector법정동 커넥터(Connector) 클래스법정동 커넥터(Connector) 는 법정동 코드(full_bjd_cd), 법정동 명(full_bjd_nm), 현재 존재 여부(is_exist), 생성일(created_dt), 삭제일(deleted_dt), 변경 전 법정동 코드(before_bjd_cd), 변경 전 법정동 커넥터 리스트(before), 변경 후 법정동 커넥터 리스트(after), 각 단위 법정동별 BjdConnector(sido_bjd_connector,sgg_bjd_connector,emd_bjd_connector,ri_bjd_connector) 등의 데이터를 포함하고 있음변경 전 법정동 커넥터 리스트(before)와 변경 후 법정동 커넥터 리스트(after)가 리스트 타입인 이유는 여러 법정동의 일정 영역을 분리해서 새로운 법정동이 생성되거나 사라지는 등의 법정동의 관계가 일대일 관계가 일대다 혹은 다대일 관계와 같은 예외적인 경우도 존재하기 때문법정동 커넥터 구조는 아래와 같음Class@dataclassclassFullBjdConnector():def__init__(self,full_bjd_cd:str,full_bjd_nm:str,created_dt:str,deleted_dt:str,before_bjd_cd:str):self.full_bjd_cd:str=full_bjd_cdself.full_bjd_nm:str=full_bjd_nmself.is_exist:bool=Noneself.created_dt:Optional[str]=created_dtself.deleted_dt:Optional[str]=deleted_dtself.before_bjd_cd:Optional[str]=before_bjd_cdself.before:List[FullBjdConnector]=[]self.after:List[FullBjdConnector]=[]self.is_smallest:bool=Noneself.sido:Optional[bool]=Noneself.sgg:Optional[bool]=Noneself.emd:Optional[bool]=Noneself.ri:Optional[bool]=Noneself.sido_nm:Optional[str]=Noneself.sgg_nm:Optional[str]=Noneself.emd_nm:Optional[str]=Noneself.ri_nm:Optional[str]=Noneself.sido_cd:Optional[str]=Noneself.sgg_cd:Optional[str]=Noneself.emd_cd:Optional[str]=Noneself.ri_cd:Optional[str]=Noneself.sido_bjd_connector:Optional[BjdConnector]=Noneself.sgg_bjd_connector:Optional[BjdConnector]=Noneself.emd_bjd_connector:Optional[BjdConnector]=Noneself.ri_bjd_connector:Optional[BjdConnector]=Noneself.is_exist=self._get_is_exist()self._get_bjd_connectors()ExampleRunfromvdutils.bjdconnectorimportFullBjdConnectorGraphFBCG=FullBjdConnectorGraph()FBCG.full_bjd_connectors.get('5100000000')._print()Outputfull_bjd_cd: 5100000000
full_bjd_nm: 강원특별자치도
is_exist: True
created_dt: 2023-06-09
deleted_dt: None
before: [FullBjdConnector()]
after: []
is_smallest: None
sido: True
sgg: None
emd: None
ri: None
sido_nm: 강원특별자치도
sgg_nm: None
emd_nm: None
ri_nm: None
sido_cd: 5100000000
sgg_cd: None
emd_cd: None
ri_cd: None
sido_bjd_connector: BjdConnector()
sgg_bjd_connector: None
emd_bjd_connector: None
ri_bjd_connector: NoneRun# 5100000000 의 단위 법정동별 BjdConnector 또한 조회 가능하며 5100000000 의 경우, 시도 단위 법정동이므로 시도 단위 BjdConnector 를 조회하면 아래와 같은 출력을 확인가능 함FBCG.full_bjd_connectors.get('5100000000').sido_bjd_connector._print()Outputtyp: sido
bjd_cd: 5100000000
bjd_nm: 강원특별자치도
full_bjd_nm: 강원특별자치도
metadata: BjdObject()
top_bjd_typ: None
top_bjd_cd: []
top_bjd_nm: []
top_bjd: []
bottom_bjd_cd: ['5111000000', '5113000000', '5115000000', '5117000000', '5119000000', '5121000000', '5123000000', '5172000000', '5173000000', '5175000000', '5176000000', '5177000000', '5178000000', '5179000000', '5180000000', '5181000000', '5182000000', '5183000000']
bottom_bjd_nm: ['춘천시', '원주시', '강릉시', '동해시', '태백시', '속초시', '삼척시', '홍천군', '횡성군', '영월군', '평창군', '정선군', '철원군', '화천군', '양구군', '인제군', '고성군', '양양군']
bottom_bjd: [BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector()]
is_smallest: FalseRun# 5100000000 의 변경 전 법정동 데이터는 .before 를 통해서 조회 가능하며 해당 데이터는 리스트 타입이기 때문에 순서값을 지정해줘야 함# 다수의 법정동의 일부 영역에서 분리되어 생성된 예외적인 경우도 존재하나 일반적으로는 첫번째 값으로 조회가능 함FBCG.full_bjd_connectors.get('5100000000').before[0]._print()Outputfull_bjd_cd: 4200000000
full_bjd_nm: 강원도
is_exist: False
created_dt: 1988-04-23
deleted_dt: 2023-06-09
before: []
after: [FullBjdConnector()] # 변경 전 법정동 데이터이므로 after 에 변경 후 법정동 데이터가 존재
is_smallest: None
sido: True
sgg: None
emd: None
ri: None
sido_nm: 강원도
sgg_nm: None
emd_nm: None
ri_nm: None
sido_cd: 4200000000
sgg_cd: None
emd_cd: None
ri_cd: None
sido_bjd_connector: BjdConnector()
sgg_bjd_connector: None
emd_bjd_connector: None
ri_bjd_connector: NoneRun# 5100000000 의 변경 전 법정동 데이터의 단위 법정동별 BjdConnector 또한 조회 가능하며 5100000000 의 변경 전 법정동 데이터 경우도 시도 단위 법정동이므로 시도 단위 BjdConnector 를 조회하면 아래와 같은 출력을 확인가능 함FBCG.full_bjd_connectors.get('5100000000').before[0].sido_bjd_connector._print()Outputtyp: sido
bjd_cd: 4200000000
bjd_nm: 강원도
full_bjd_nm: 강원도
metadata: BjdObject()
top_bjd_typ: None
top_bjd_cd: []
top_bjd_nm: []
top_bjd: []
bottom_bjd_cd: ['4205000000', '4211000000', '4213000000', '4215000000', '4217000000', '4219000000', '4221000000', '4223000000', '4271000000', '4271500000', '4272000000', '4273000000', '4274000000', '4274500000', '4275000000', '4276000000', '4277000000', '4278000000', '4279000000', '4280000000', '4281000000', '4282000000', '4283000000', '4284000000', '4285000000']
bottom_bjd_nm: ['울진군', '춘천시', '원주시', '강릉시', '동해시', '태백시', '속초시', '삼척시', '춘성군', '춘천군', '홍천군', '횡성군', '원성군', '원주군', '영월군', '평창군', '정선군', '철원군', '화천군', '양구군', '인제군', '고성군', '양양군', '명주군', '삼척군']
bottom_bjd: [BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector(), BjdConnector()]
is_smallest: FalseGenPnu주소 문자열을 입력받아 공간의가치(ValueOfSpace)에서 사용중인 필지관리코드(pnu)로 반환하는 기능 및 이와 관련된 부분 기능들을 제공하는 모듈공간의가치(ValueOfSpace)에서 사용중인 필지관리코드(pnu)는 19자리의 숫자문자열로 10자리의 법정동코드와 1자리의 산코드, 8자리의 번지코드로 구성되어 있으며 해당 모듈은 현행시점의 존재하는 법정동 데이터를 기반으로 동작하나 해당 모듈 클래스 인스턴스base_dt속성값에 따라 시점은 다르게 적용가능 \base_dt속성값을 기준으로 보관중인 법정동 데이터 중 선정하며base_dt이전 시점 중 가장 빠른 시점으로 선정함즉,base_dt='20231231'이고 법정동 데이터가 20230101, 20230701, 20240118 와 같이 세 시점이 존재할 경우base_dt보다 이전이며 그 중 가장 빠른 20230701 을 선정하게 됨base_dt는BjdConnector,ConvAddr동일하게 적용됨Show instructionsgenpnu(GeneratePNU)초기 모듈 인스턴스 생성시base_dt(default=None)를 제공하지 않으면 보유중인 법정동 데이터 중 최신 시점으로 호출하며base_dt전달시에는 위의 base_dt 설명과 동일하게 동작하며 호출된 법정동 데이터 시점을 로그로 출력함ExampleRunfromvdutils.genpnuimportGenPnuGP=GenPnu()OutputYYYY-MM-DD HH:MM:SS | [INFO] | 적용 법정동 데이터 시점: 20240118Runfromvdutils.genpnuimportGenPnuGP=GenPnu(base_dt='20231231')OutputYYYY-MM-DD HH:MM:SS | [INFO] | 적용 법정동 데이터 시점: 20230701genpnu.get_bjd_cd입력된 문자열(한글 법정동명)의 법정동 코드로 리턴입력 문자열은 string 타입이어야 하며, 한글과 숫자, 공백으로만 이루어진 문자열이어야 함입력된 문자열의 타입과 형식 오류는 예외 처리되나 이 외의 경우 예외형식의 응답을 반환하며 error, msg 를 통해 예외유무를 확인할 수 있음ExampleRunfromvdutils.genpnuimportGenPnuGP=GenPnu()GP.get_bjd_cd(bjd_nm='서울특별시 강남구 삼성동')# 정상적인 법정동명 입력Output{'error': False,
'bjd_cd': '1168010500',
'deleted_dt': None,
'base_dt': '2024-01-18',
'msg': ''}Runfromvdutils.genpnuimportGenPnuGP=GenPnu()GP.get_bjd_cd(bjd_nm='부산광역시 강남구 삼성동')# 비정상적인 법정동명 입력Output{'error': True,
'bjd_cd': None,
'deleted_dt': None,
'base_dt': '2024-01-18',
'msg': "'부산광역시 강남구 삼성동' is not a valid legal district name"}genpnu.get_bjd_data입력된 문자열(법정동 코드)에 해당하는 법정동 데이터(각 단위 법정동명, 생성일자, 삭제일자)를 리턴입력 문자열은 string 타입이어야 하며, 법정동 코드 형식인 10자리의 숫자 문자열이어야 함입력된 문자열의 타입과 형식 오류는 예외 처리되나 이 외의 경우 예외형식의 응답을 반환하며 error, msg 를 통해 예외유무를 확인할 수 있음ExampleRunfromvdutils.genpnuimportGenPnuGP=GenPnu()GP.get_bjd_data(bjd_cd='1168010500')# 정상적인 법정동코드 입력Output{'error': False,
'sido_nm': '서울특별시',
'sgg_nm': '강남구',
'emd_nm': '삼성동',
'ri_nm': None,
'full_bjd_nm': '서울특별시 강남구 삼성동',
'created_dt': '1988-04-23',
'deleted_dt': None,
'base_dt': '2024-01-18',
'msg': ''}Runfromvdutils.genpnuimportGenPnuGP=GenPnu()GP.get_bjd_data(bjd_cd='1234567890')# 비정상적인 법정동코드 입력Output{'error': True,
'sido_nm': None,
'sgg_nm': None,
'emd_nm': None,
'ri_nm': None,
'full_bjd_nm': None,
'created_dt': None,
'deleted_dt': None,
'base_dt': '2024-01-18',
'msg': "'1234567890' is not a valid legal district code"}genpnu.generate_pnu입력된 문자열(법정동 코드, 지번)을 필지관리번호(pnu)로 변환하여 반환입력 문자열 중 법정동 코드는 string 타입이어야 하며, 법정동 코드 형식인 10자리의 숫자 문자열이어야 함입력 문자열 중 지번은 string 타입이어야 하며, '산'을 포함한 본번과 부번이 결합된 문자열이어야 하며 본번과 부번은 최대 4자리의 숫자 문자열이어야 함입력 문자열 중 지번에서 '산'과 번지 사이에 공백 유무는 상관없으며 지번의 올바른 형식은 다음과 같음산 0000-0000 (산0000-0000)산 0000 (산0000)0000-00000000입력된 문자열의 타입과 형식 오류는 예외 처리되나 이 외의 경우 예외형식의 응답을 반환하며 error, msg 를 통해 예외유무를 확인할 수 있음ExampleRunfromvdutils.genpnuimportGenPnuGP=GenPnu()GP.generate_pnu_from_bjd_nm(bjd_nm='1168010500',jibun='1-1')# 정상적인 법정동코드, 지번 입력Output{'error': False,
'pnu': '1168010500100010001',
'bjd_cd': '1168010500',
'mountain_cd': '1',
'bunji_cd': '00010001',
'bjd_datas': {'error': False,
'sido_nm': '서울특별시',
'sgg_nm': '강남구',
'emd_nm': '삼성동',
'ri_nm': None,
'full_bjd_nm': '서울특별시 강남구 삼성동',
'created_dt': '1988-04-23',
'deleted_dt': None,
'base_dt': '2024-01-18',
'msg': ''},
'bun': '1',
'ji': '1',
'msg': '',
'base_dt': '2024-01-18'}Runfromvdutils.genpnuimportGenPnuGP=GenPnu()GP.generate_pnu(bjd_cd='1234567890',jibun='1-1')# 존재하지 않는 법정동코드, 정상적인 지번 입력Output{'error': True,
'pnu': '1234567890100000000',
'bjd_cd': '1234567890',
'mountain_cd': '1',
'bunji_cd': '00000000',
'bjd_datas': {'error': True,
'sido_nm': None,
'sgg_nm': None,
'emd_nm': None,
'ri_nm': None,
'full_bjd_nm': None,
'created_dt': None,
'deleted_dt': None,
'base_dt': '2024-01-18',
'msg': "'1234567890' is not a valid legal district code"},
'bun': '0',
'ji': '0',
'msg': '블록지번',
'base_dt': '2024-01-18'}Runfromvdutils.genpnuimportGenPnuGP=GenPnu()GP.generate_pnu(bjd_cd='1168010500',jibun='')# 정상적인 법정동코드, 비정상적인 지번 입력Output{'error': True,
'pnu': '1168010500100000000',
'bjd_cd': '1168010500',
'mountain_cd': '1',
'bunji_cd': '00000000',
'bjd_datas': {'error': False,
'sido_nm': '서울특별시',
'sgg_nm': '강남구',
'emd_nm': '삼성동',
'ri_nm': None,
'full_bjd_nm': '서울특별시 강남구 삼성동',
'created_dt': '1988-04-23',
'deleted_dt': None,
'base_dt': '2024-01-18',
'msg': ''},
'bun': '0',
'ji': '0',
'msg': '블록지번',
'base_dt': '2024-01-18'}genpnu.generate_pnu_from_bjd_nm입력된 문자열(법정동 명, 지번)을 필지관리번호(pnu)로 변환하여 반환입력 문자열은 string 타입이어야 하며, 한글과 숫자, 공백으로만 이루어진 문자열이어야 함입력 문자열 중 지번은 string 타입이어야 하며, '산'을 포함한 본번과 부번이 결합된 문자열이어야 하며 본번과 부번은 최대 4자리의 숫자 문자열이어야 함. 본번과 부번은 '-' 으로 구분함입력 문자열 중 지번에서 '산'과 번지 사이에 공백 유무는 상관없으며 지번의 올바른 형식은 다음과 같음산 0000-0000 (산0000-0000)산 0000 (산0000)0000-00000000입력된 문자열의 타입과 형식 오류는 예외 처리되나 이 외의 경우 예외형식의 응답을 반환하며 error, msg 를 통해 예외유무를 확인할 수 있음ExampleRunfromvdutils.genpnuimportGenPnuGP=GenPnu()GP.generate_pnu_from_bjd_nm(bjd_nm='서울특별시 강남구 삼성동',jibun='산 1000-1000')# 정상적인 법정동명, 지번 입력Output{'error': False,
'pnu': '1168010500210001000',
'bjd_cd': '1168010500',
'mountain_cd': '2',
'bunji_cd': '10001000',
'bjd_datas': {'error': False,
'sido_nm': '서울특별시',
'sgg_nm': '강남구',
'emd_nm': '삼성동',
'ri_nm': None,
'full_bjd_nm': '서울특별시 강남구 삼성동',
'created_dt': '1988-04-23',
'deleted_dt': None,
'base_dt': '2024-01-18',
'msg': ''},
'bun': '1000',
'ji': '1000',
'msg': '',
'base_dt': '2024-01-18'}Runfromvdutils.genpnuimportGenPnuGP=GenPnu()GP.generate_pnu_from_bjd_nm(bjd_nm='부산광역시 강남구 삼성동',jibun='산 1000-1000')# 존재하지 않는 법정동명, 정상적인 지번 입력Output{'error': True,
'pnu': None,
'bjd_cd': None,
'mountain_cd': None,
'bunji_cd': None,
'bjd_datas': None,
'bun': None,
'ji': None,
'msg': "올바르지 않은 법정동명('부산광역시 강남구 삼성동' is not a valid legal district name)",
'base_dt': '2024-01-18'}Runfromvdutils.genpnuimportGenPnuGP=GenPnu()GP.generate_pnu_from_bjd_nm(bjd_nm='서울특별시 강남구 삼성동',jibun='')# 정상적인 법정동코드, 비정상적인 지번 입력Output{'error': True,
'pnu': '1168010500100000000',
'bjd_cd': '1168010500',
'mountain_cd': '1',
'bunji_cd': '00000000',
'bjd_datas': {'error': False,
'sido_nm': '서울특별시',
'sgg_nm': '강남구',
'emd_nm': '삼성동',
'ri_nm': None,
'full_bjd_nm': '서울특별시 강남구 삼성동',
'created_dt': '1988-04-23',
'deleted_dt': None,
'base_dt': '2024-01-18',
'msg': ''},
'bun': '0',
'ji': '0',
'msg': '블록지번',
'base_dt': '2024-01-18'}Vid공간의가치(ValueOfSpace) 거래사례코드(vid)를 생성하는 기능 및 이와 관련된 부분 기능들을 제공하는 모듈Show instructionsvid.generate_registration_vid주어진 입력값(pnu, contract_ymd, price, unit_ar, lot_ar, seller, buyer) 를 변환 새시값으로 생성하여 리턴각 입력값들의 타입정의 및 형식이 명확하지 않아, TypeError, ValueError 를 정의하지 않고 모든 오류에 대해 동일한 예외용 응답만을 반환ExampleRunfromvdutils.vidimportVidV=Vid()V.generate_registration_vid(pnu='1234567890123456789',contract_ymd='20240101',price='100',unit_ar='100.1',lot_ar=100.1,seller='seller,buyer='buyer',)Output['R_1234567890_581e28e445_0000',
'581e28e4457103048784572e858c5ed1297cf8747169a8454e98a19233036f55',
'1234567890123456789_20240101_100_100.1_100.1_seller_buyer']Runfromvdutils.vidimportVidV=Vid()V.generate_registration_vid(pnu='12345678901234567890',# 비정상적인 pnu 입력contract_ymd='20240101',price='100',unit_ar='100.1',lot_ar=100.1,seller='seller,buyer='buyer',)Output['R_pnu10dhead_hashstring_0000', None, None]Usage(Administrator Only)Bjd공공데이터 법정동 관련 API 를 수집하고 자체 관리중인 보조 데이터들을 이용하여 BjdConnector, ConvAddr 에 사용하는 법정동 관련 데이터프레임을 생성 및 편집하고 텍스트 형식으로 저장하는 모듈관리중인 법정동 데이터 파일 목록bjd.txt: 공공데이터에서 제공중인 전체기간(1988-)의 법정동 개요 데이터이며 과거법정동코드, 법정동코드, 삭제일자, 생성일자, 순위, 시도명, 시군구명, 읍면동명, 리명, 법정동명이 포함됨bjd_current.txt: 공공데이터에서 제공중인 전체기간(1988-)의 법정동 개요 데이터 중 삭제되거나 변경된 법정동을 제외한현행 법정동개요 데이터bjd_changed.txt: 공공데이터에서 제공중인 전체기간(1988-)의 법정동 변경사항 데이터이며 법정동코드변경후, 법정동명변경후, 생성일자변경후, 삭제일자변경후, 법정동코드변경전, 법정동명변경전, 생성일자변경전, 삭제일자변경전, 변경내역이 포함됨bjd_smallest.txt: 현행 법정동 개요 데이터 중 최소 단위 법정동명 데이터bjd_frequency_dictionary.txt: 현행 법정동 개요 데이터의 단위 법정동명별 빈도수 딕셔너리공공데이터 법정동 관련 API 수집은 관리자가 보유중인 api-key 를 이용하여 법정동 변경사항 및 업데이트 필요한 시점에 재수집 및 재새성하여 배포하며, 배포 시점의 법정동 데이터 파일은 /data 를 통해 확인가능