본문 바로가기

TIL(2024y)/Pandas (w OpenCV)

24.05.21 pandas 기반 map 호출

서울시 경찰서 API 에서 특정 data 추리기(pandas)

  • import 가 필요한 methods

  • numpy
    - 고성능 수치 계산을 위한 라이브러리로, 다차원 배열 객체와 다양한 수학 함수들을 제공
    - 데이터 처리 및 연산, 배열 생성 및 조작
  • pandas
    - 데이터 분석을 위한 라이브러리로, 데이터 구조(DataFrame)와 데이터 분석 도구를 제공
    - 데이터 로드, 정리, 조작 및 분석
    - e.g. 경찰서 api로부터 받은 data를 dataframe으로 변환하여 분석 및 시각화 준비에 사용
  • matplotlib
    - 데이터 시각화를 위한 라이브러리로, 다양한 종류의 그래프와 차트를 그릴 수 있음
    - 데이터 시각화, 그래프 생성
    - 데이터 분석결과를 그래프로 시각화할 때 사용
  • matplotlib.pyplot
    - Matplotlib의 서브 모듈로, MATLAB과 유사한 방식으로 그래프를 그릴 수 있게 함
    - 간단한 플롯 작성, 그래프의 꾸미기 및 표시
    - 그래프를 만들고 커스터마이즈 할 때 사용
  • json
    - API로부터 받은 JSON 형식의 데이터를 파싱 및 조작
    - e.g. 경찰서 api로부터 받은 json data를 python data 구조로 변환하는데 사용
  • folium
    - 지리적 데이터를 시각화하기 위한 라이브러리
    - 지도 시각화, 위치 정보 표시, 인터랙티브 지도 생성
    - e.g. 지도 위에 경찰서 위치를 마커로 표시하거나, 기타 지리적 데이터를 시각화할 때 사용
  • pd.read_csv( ) 로 excel file 불러오기

- excel file을 불러올 때 숫자에 ,가 있을 경우 int로 인식되지 않기에 thousand =","를 이용하여 int로 변환

- index_col= 0 : read.csv() 함수로 csv 파일을 읽을 때 특정 열을 dataframe의 index로 지정하는 것 

 e.g. 첫번째 열(0번째 열)을 index로 사용하겠다는 의미 

    • 특정 feature만 보기

- crime.columns: crime data 중 columns 만 보겠다
- columns[ : ]: colum 내에서도 slicing 

  • "동"이  들어있는 과서명만 추출하기 

  - crime.index: index는 행을 식별하는 label (만약 index가 아닌 전체 crime을 입력하려면 crime을 지정할 때 index_col=0을 지워야함.
  - .append( ): python에서 리스트끝에 새로운 요소를 추가할 때 쓰는 method
     e.g. a.append(5) = a의 맨 끝에 5를 추가 
  - for문: crime df의 index를 하나씩 순회하는데 
  - if문: district에 "동"이라는 문자열이 포함되어있다면 해당 구 이름을 "police_dong" 리스트에 추가하라는 뜻 

  - for 문이 길기때문에 대체하는 코드
    police_dong =  [ i for i in crime.index if "동" in i] 

  • crime['절도 발생'].mean() : '절도 발생' 수의 평균 값
  • crime.sum(): crime의 index별 sum 값 --> 티폴트 값 1
  • crime.sum(axis=0) #세로=0, 가로=1(axis=1)
  • crime[total] = df에 [ ]추가 e.g. crime['total'] = crime.sum(axis=1) 

서울시 경찰서 API정보를 map에 표시하기 

  • json file 불러오기

    - with open('파일위치/파일명', 'r') as f: 
            data = json.load(f)

  • police_name과 해당 address 만 추려내기 (df에서 특정행만 뽑기)
    - for i in data: 
           print(i['police_name'], "-->", i['formatted_address'])
  • json정보를 dataframe으로 만들기
 # 빈 리스트 'police_info_list'를 초기화. 나중에 각 경찰서의 정보를 담을 것
police_info_list = []                                             
 # 'data' 리스트의 각 요소를 순회하는 반복문
for i in data:       
 # 빈 딕셔너리 'inner_dict'를 초기화. 나중에 각 경철서의 정보를 임시로 저장                                                                        
    inner_dict = {}                                              
#'i'의 'police_name'키에 해당하는 값을 'inner_dict'의 'police_name'키에 저장
    inner_dict["police_name"] = i["police_name"]
    inner_dict["address"] = i["formatted_address"]
    inner_dict["lat"] = i["geometry"]["location"]["lat"]
    inner_dict["lng"] = i["geometry"]["location"]["lng"]
# i의 "formatted_address" 값을 공백을 기준으로 나누고, 그 결과 리스트의 세 번째 요소를 inner_dict의 "gu" 키에 저장
    inner_dict["gu"] = i["formatted_address"].split(" ")[2]
 # inner_dict를 police_info_list에 추가
    police_info_list.append(inner_dict)

 

  • 관서명만 바꾸기 (dataframe의 특정 정보 바꾸기)

  • dataframe의 data merge (crime: 범죄정보있는 excel/ df: 경찰서 정보있는 json file을 각각 df 변환한 data)

   - 'crime' dataframe과 'df_police' dataframe을 내부결합(inner_join)하여 새로운 dataframe인 crime_police_inner를 생성
   - left: 왼쪽에 위차한 df로 'crime' df에 해당
   - right: 오른쪽에 위차한 df로 'df_police'에 해당
   - how: 결합방법 지정. inner는 내부결합을 수행 (두 df 사이에 공통된 키/열을 기반으로 행을 결합하며, 공통된 키가 없으

     면 제외) outer는 외부결합으로 두 df의 모든 행을 포함. 
   - on: 결합 기준이 되는 열을 지정.  None은 공통된 열을 기반으로 결합. 일반적으로 이 옵션을 사용하여 명시적으로 결합

     할 열을 지정함.

지도 시각화

  • folium.Map(location=[경도, 위도], zoon_start= )
  • dataframe에 있는 위도/경도/관할서 등의 정보를 선언하기 

  • lat = crime_police_outer.loc[0]["lat"]: crime_police_outer 데이터프레임의 첫 번째 행에서 "lat" (위도) 값을 가져와 lat 변수에 저장
  • lng = crime_police_outer.loc[0]["lng"]: crime_police_outer 데이터프레임의 첫 번째 행에서 "lng" (경도) 값을 가져와 lng 변수에 저장
  • police_name = crime_police_outer.loc[0]["police_name"]: crime_police_outer 데이터프레임의 첫 번째 행에서 "police_name" 값을 가져와 police_name 변수에 저장.
  • occurs_total = crime_police_outer.loc[0]["occurs_total"]: crime_police_outer 데이터프레임의 첫 번째 행에서 "occurs_total" 값을 가져와 occurs_total 변수에 저장
  • folium.Marker(location = [lat, lng], icon=folium.Icon(color='blue',icon='star'), popup=police_name).add_to(map): 위도와 경도(lat, lng) 위치에 파란색 별 아이콘을 가진 마커를 추가. 마커를 클릭하면 police_name이 팝업으로 표시됨
  • folium.Circle(location = [lat, lng], radius = occurs_total/2, fill=True).add_to(map): 같은 위치(lat, lng)에 반경이 occurs_total의 절반인 원을 추가. 
  • iterrow()를 이용하여 경찰서의 marker를 표시 

 

 QUIZ

  • 서울지도에 서울시 경찰서와 체포수에 대한 정보 나타내기

 

 

P.S. Data or 정부/기업에서 해결이 필요한 문제들을 올려놓는 site 

 

https://dacon.io/

 

데이터사이언티스트 AI 컴피티션

10만 AI 팀이 협업하는 데이터 사이언스 플랫폼. AI 경진대회와 대상 맞춤 온/오프라인 교육, 문제 기반 학습 서비스를 제공합니다.

dacon.io

https://www.kaggle.com/

 

Kaggle: Your Machine Learning and Data Science Community

Kaggle is the world’s largest data science community with powerful tools and resources to help you achieve your data science goals.

www.kaggle.com