class CrimeModel: def __init__(self): self.dr = DataReader() def hook_process(self): print("-------------------3. CCTV 파일로 DF 생성") self.get_crime() def get_crime(self): self.dr.context = "./data/" self.dr.fname = "crime_in_seoul.csv" crime = self.dr.csv_dframe() print(crime) station_names = [] for name in crime["관서명"]: station_names.append("서울" + str(name[:-1] + "경찰서")) station_addrs = [] station_lats = [] #위도 station_lngs = [] #경도 gmaps = self.dr.create_gmaps() for name in station_names: t = gmaps.geocode(name, language="ko") station_addrs.append(t[0].get("formatted_address")) t_loc = t[0].get("geometry") #구글의 컬럼 명 그대로lat, lng -> api station_lats.append(t_loc["location"]["lat"]) station_lngs.append(t_loc["location"]["lng"]) print(name + "--------------->" + t[0].get("formatted_address")) gu_names = [] for name in station_addrs: t = name.split() #-1 : 뒤에서 한 글자 #:-1 : 0부터 맨 끝까지 gu_name = [gu for gu in t if gu[-1] == "구"][0] gu_names.append(gu_name) crime["구별"] = gu_names #구 와 경찰서 위치가 다른 경우 수작업 crime.loc[crime["관서명"] == "혜화서", ["구별"]] == "종로구" crime.loc[crime["관서명"] == "서부서", ["구별"]] == "은평구" crime.loc[crime["관서명"] == "강서서", ["구별"]] == "양천구" crime.loc[crime["관서명"] == "중앙서", ["구별"]] == "성북구" crime.loc[crime["관서명"] == "방배서", ["구별"]] == "서초구" crime.loc[crime["관서명"] == "수서서", ["구별"]] == "강남구" print(crime) crime.to_csv("./saved_data/crime_police.csv")
class CCTVModel: def __init__(self): self.dr = DataReader() def hook_process(self): print("-------1.cctv 파일 df 생성--------") self.get_cctv() def get_cctv(self): self.dr.context = "./data/" #setter의 메소드명과 일치해야 한다. #@fname.setter #def fname(self, fname): self.dr.fname = 'cctv_in_seoul.csv' cctv = self.dr.csv_dframe() #print(cctv) #print(cctv.columns) self.dr.fname = "population_in_seoul.xls" pop = self.dr.xls_to_dframe(2, "B,D,G,J,N") #print(pop) #print(pop.header()) #print(pop.columns) cctv.rename(columns={cctv.columns[0]: "구 별"}, inplace=True) pop.rename(columns={ pop.columns[0]: "구 별", pop.columns[1]: "인구수", pop.columns[2]: "한국인", pop.columns[3]: "외국인", pop.columns[4]: "고령인" }, inplace=True) #pop.drop([0], True) print(pop["구 별"].isnull()) pop.drop([26], inplace=True) pop["외국인비율"] = pop["외국인"] / pop["인구수"] * 100 pop["고령자비율"] = pop["고령인"] / pop["인구수"] * 100 #pop.drop([26], inplace=True) cctv.drop(["2013년도 이전", "2014년", "2015년", "2016년"], 1, inplace=True) cctv_pop = pd.merge(cctv, pop, on="구 별") #상관관계를 찾는것 #가설을 세운 후 증명하는 과정 cor1 = np.corrcoef(cctv_pop["고령자비율"], cctv_pop["소계"]) cor2 = np.corrcoef(cctv_pop["외국인비율"], cctv_pop["소계"]) #가공된 데이터 다시 저장 cctv_pop.to_csv("./saved_data/cctv_pop.csv")
class PoliceNormModel: def __init__(self): self.dr = DataReader() def hook(self): print("---------- 1.cctv 파일로 df 생성") self.create_crime_rate() def create_crime_rate(self): self.dr.context = "./saved_data" self.dr.fname = "/crime_police.csv" police_crime = self.dr.csv_dframe() police = pd.pivot_table(police_crime, index="구별", aggfunc=np.sum) print(police.columns) police["살인검거율"] = (police["살인 검거"] / police["살인 발생"]) * 100 police["강도검거율"] = (police["강도 검거"] / police["강도 발생"]) * 100 police["강간검거율"] = (police["강간 검거"] / police["강간 발생"]) * 100 police["절도검거율"] = (police["절도 검거"] / police["절도 발생"]) * 100 police["폭력검거율"] = (police["폭력 검거"] / police["폭력 발생"]) * 100 #axis=1 -> 컬럼 단위로 삭제(세로) police.drop(columns={"살인 검거", "강도 검거", "강간 검거", "절도 검거", "폭력 검거"}, axis=1) crime_rate_columns = ["살인검거율", "강도검거율", "강간검거율", "절도검거율", "폭력검거율"] for i in crime_rate_columns: police.loc[police[i] > 100, 1] = 100 #100%가 넘어가는 경우 에러가 발생 -> 방지하기 위한 로직 100으로 치환 police.rename(columns={ "살인 발생": "살인", "강도 발생": "강도", "강간 발생": "강간", "절도 발생": "절도", "폭력 발생": "폭력" }, inplace=True) crime_columns = ["살인", "강도", "강간", "절도", "폭력"] x = police[crime_rate_columns].values #scaler -> #return은 반드시 스칼라가 되어야 한다. min_max_scalar = preprocessing.MinMaxScaler() """ 스케일링은 선형변환을 적용하여 전체 자료의 분포를 평균 0, 분산 1이 되도록 만드는 과정 """ x_scaled = min_max_scalar.fit_transform(x.astype(float)) """ 정규화(normalization) 많은 양의 데이터를 처리함에 있어 여러 이유로 정규화. 즉, 데이터의 범위를 일치시키거나 분포를 유사하게 만들어 주는 등의 작업,. 평균값 정규화, 중간값 정규화... """ police_norm = pd.DataFrame(x_scaled, columns=crime_columns, index=police.index) police_norm[crime_rate_columns] = police[crime_rate_columns] self.dr.context = "./saved_data" self.dr.fname = "/cctv_pop.csv" cctv_pop = pd.read_csv(self.dr.new_file(), encoding="UTF-8", sep=",", index_col="구 별") police_norm["범죄"] = np.sum(police_norm[crime_rate_columns], axis=1) police_norm["검거"] = np.sum(police_norm[crime_columns], axis=1) print(police_norm.columns) police_norm.to_csv("./saved_data/police_nomr.csv", sep=",", encoding="UTF-8")
class CrimeMap: def __init__(self): self.dr = DataReader() def hook(self): self.create_seoul_crime_map() def create_seoul_crime_map(self): #생성한 객체의 변수에 값 할당 self.dr.context = "./saved_data/" self.dr.fname = "police_nomr.csv" police = self.dr.csv_dframe() print(police) self.dr.context = "./data/" self.dr.fname = 'geo_simple.json' seoul_geo = self.dr.json_load() self.dr.context = "./data/" self.dr.fname = "crime_in_seoul.csv" crime = self.dr.csv_dframe() station_names = [] for name in crime["관서명"]: station_names.append("서울" + str(name[:-1] + "경찰서")) station_addrs = [] station_lats = [] # 위도 station_lngs = [] # 경도 gmaps = self.dr.create_gmaps() for name in station_names: t = gmaps.geocode(name, language="ko") station_addrs.append(t[0].get("formatted_address")) t_loc = t[0].get("geometry") # 구글의 컬럼 명 그대로lat, lng -> api station_lats.append(t_loc["location"]["lat"]) station_lngs.append(t_loc["location"]["lng"]) print(name + "--------------->" + t[0].get("formatted_address")) # 기존 코드 self.dr.context = './data/' self.dr.fname = 'police_position.csv' police_pos = self.dr.csv_dframe() police_pos['lat'] = station_lats police_pos['lng'] = station_lngs print(police_pos) col = ['살인 검거', '강도 검거', '강간 검거', '절도 검거', ' 폭력 검거'] tmp = police_pos[col] / police_pos[col].max police_pos['검거'] = np.sum(tmp, axis=1) self.dr.fname = 'geo_simple.json' m = folium.Map(location=[37.5902, 126.982], zoom_start=12, title='Stamen Toner') # 속성값 m.choropleth( geo_data=seoul_geo, name="choropleth", data=tuple(zip(police['구별'], police['범죄'])), #columns=["State", "Unemployment"], key_on="feature.id", fill_color="PuRd", fill_opacity=0.7, line_opacity=0.2, lengend_name="CRIME RATE (%)") for i in police_pos.index: #동그란 이미지 추가 folium.CircleMarker([police_pos['lat'][i], police_pos['lng'][i]], radius=police_pos['검거'][i] * 10, fill_color='#0a0a32').add_to(m) #저장하기 m.save('./saved_data/Seoul_Crime_Map.html')