예제 #1
0
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")
예제 #2
0
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")
예제 #3
0
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")
예제 #4
0
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')