serviceKey를 받았을때 만약 %3D%3D로 끝난다면 online tool을 이용해서 decode 작업이 필요하다 decode가 완료되었다면 아마도 나의 서비스 키는 ==로 끝날 것이다. 변경된 서비스 키를 다시 넣어서 요청하면 정상적으로 응답이 온다.

파이썬에서 파일을 저장할때 encoding을 설정해주지 않으면 윈도우 환경에서는 파일을 열었을때 괴상한 문자가 나온다.
물론 linux 계열인 mac에서도 encoding을 잘못 설정하면 괴상한 문자가 나오기는 당연!

Encoding

  • encoding은 os마다 다르다. 윈도우에서는 cp949
  • linux에서는 utf8을 사용
  • 아래 코드에서 encoding을 설정하는곳이 있는데
  • 위처럼 윈도우에서 파일을 열어볼 예정이라면 encoding=cp949를 넘겨줘야 한다.
  • linux 계열에서 파일을 열어볼 예정이라면 encoding을 설정할 필요가 없다.
  • 설정할 필요가 없는 이유는 ? pandas to_csv()를 보면 defulat: utf-8이기 때문이다.

부동산 데이터를 살펴보다 보니 층 데이터에 NaN이 있는게 아닌가.. 이게 어떤 값인지... 웃긴건 분당동 전체 112612개중에 달랑 3개만 NaN의 값이다.

date    건축년도    년    법정동    보증금액    아파트    월    월세금액    일    전용면적    지번    지역코드    층
124    201906    1992.0    2019.0    수내동    64,000    양지마을(5단지)(한양515-529)    6.0    0    29.0    84.9    24    41135.0    NaN
126    201906    1992.0    2019.0    수내동    64,000    양지마을(5단지)(한양515-529)    6.0    0    29.0    84.9    24    41135.0    NaN
128    201906    1992.0    2019.0    수내동    64,000    양지마을(5단지)(한양515-529)    6.0    0    29.0    84.9    24    41135.0    NaN

데이터의 신뢰도를 위해서 국토부에서 동일한 기간의 데이터를 받아봤더니 NaN의 값은 층 0층이다.

1516    경기도 성남분당구 수내동    24    0024    0000    양지마을(5단지)(한양515-529)    전세    84.9    201906    29    64,000    0    0    1992    내정로165번길 35
1517    경기도 성남분당구 수내동    24    0024    0000    양지마을(5단지)(한양515-529)    전세    84.9    201906    29    64,000    0    0    1992    내정로165번길 35
1518    경기도 성남분당구 수내동    24    0024    0000    양지마을(5단지)(한양515-529)    전세    84.9    201906    29    64,000    0    0    1992    내정로165번길 35

응? 0층이 어디에 있지.. 네이버 부동산 매물을 보아도 양지마을(5단지)에는 0층이 없다.

서울특별시 2019년에 동별 매매건수 TOP20은 어디일까?

공공데이터포털에서 2019년 아파트 실거래 매매 데이터를 서울특별시 지역코드를 다운받고, 각각 동별로 얼마나 거래가 있는지 확인을 해봤다. df에는 2019년 서울특별시 아파트 실거래 매매데이터가 들어있다.

dong_df = df.groupby("법정동").count()[['date']]
dong_df.columns = ['거래수']
dong_df = dong_df.sort_values('거래수', ascending=False)

ax = dong_df['거래수'][:20].plot(kind='bar'
                         ,title='서울특별시 2019년 동별 매매건수 TOP20'
                         ,figsize=(10,6)
                         ,grid=True)
ax.set_xlabel("법정동")
ax.set_ylabel("거래수")

법정동코드 별로 카운트를 하고, 거래수의 랭킹으로 정렬을 했다. 2019년에 서울특별시에서 매매건수가 많은 동은 어디일까? 결과는 아래 차트와 같다. 

 

상계동 1956
신정동 1190
중계동 1101
잠실동 955
봉천동 948
구로동 923
목동 917
창동 863
서초동 752
공릉동 751
월계동 745
화곡동 717
시흥동 692
대치동 603
신월동 585
신림동 575
신내동 535
개봉동 529
미아동 528
정릉동 521

상계동, 신정동, 중계동 순으로 가장 많은 아파트 매매가 이루어지고 있다. 거래수가 행정동의 아파트 가격에 영향을 줄 수 있을까? 

  • embedding 벡터를 합치기 위해서는 np.zeros()를 통해 초기화를 진행하고
  • 초기화된 embed에 누적해서 벡터의 값을 더해주고
  • 마지막으로 합치는 벡터의 개수로 나눠준다.
def agg_embed(terms):
  embed = np.zeros(128) 
  for term in terms: 
      embed += np.array(term['embedding'])
  embed /= len(terms)
  return embed

sentence embedding을 얻었다면, 두개의 유사도를 계산하기 위해서는 cosine similarity를 이용해서 계산을 해야한다.

pandas에서 udf를 통해 계산하는 방법은 아래와 같다.
keywordcontext에는 문자열이 들어가면 된다.

ex: keyword: 안녕, context: 잘가요. 멀리 안가요


import numpy as np
from scipy import spatial

def sim(x, y): 
  embed1 = get_embed(x)  
  embed2 = get_embed(y) 
  return 1 - spatial.distance.cosine(embed1, embed2)

def sim_udf(x): 
  sim_value = sim(x['keyword'], x['context'])  
  return sim_value 


df['cosim'] = df.apply(sim_udf, axis=1)

python에서 Counter를 이용하면 list로 받은 값들의 개수를 계산한 해서 아래와 같이 결과를 받을 수 있다.

from collections import Counter
Counter(['apple','red','apple','red','red','pear'])
Counter({'red': 3, 'apple': 2, 'pear': 1})
  • 파이썬에서 한글, 영문, 숫자가 포함된 문자열에서 한글만 추출하는 방법에 대해서 설명한다.
  • python을 이용해서 한글처리를 하다보면 ㅋㅋㅋ, ㅎㅎㅎ와 같은 모음, 자음이 따로 있는 경우가 있는데 보통은 의미가 없다. 감정을 나타내는 문제에서는 의미가 있으려나...
  • 모/자음만 있는 한글을 추려내는 방법은 정규식을 사용하면 쉽게 추출, 제거 할 수 있다.

정규식에서 일치되는 부분을 리스트로 저장

import re

text = "ㅋㅋㅋ 안녕하세요"
# 정규식에서 일치되는 부분을 리스트 형태로 저장
re.compile('[ㄱ-ㅎ]+').findall(text) # 출력 ['ㅋㅋㅋ']

import re

text = "ㅋㅋㅋ 안녕하ㅏ세요"
# 정규식에서 일치되는 부분을 리스트 형태로 저장
re.compile('[ㄱ-ㅎ|ㅏ-ㅣ]+').findall(text) # 출력 ['ㅋㅋㅋ', 'ㅏ']

import re

text = "ㅋㅋㅋ 안녕하세요"
# 정규식에서 일치되는 부분을 리스트 형태로 저장
re.compile('[가-힣]+').findall(text) # 출력 ['안녕하세요']

정규식에서 일치되는 부분을 제외하고 추출

import re

text = "ㅋㅋㅋ 안녕하세요"
# 한글과 띄어쓰기을 제외하고 모든 글자 (자음, 모음만 있는경우 제외)
re.compile('[ |가-힣]+').sub('', text) # 출력 'ㅋㅋㅋ'


text = "하이 ㅋㅋㅋ 안녕하ㅏ세요"
# 정규식에서 일치되는 부분을  제외하고 저장
re.compile('[ |ㄱ-ㅎ|ㅏ-ㅣ]+').sub('',text) # 출력 '안녕하세요'

주의해야할 점

  • 주의해야 할 점은 두개의 결과가 리스트str으로 반환된다는 점이다.
  • 아래 예제를 통해서 내가 언제 어떤 상황에서 어떻게 처리해야할지 판단하면 된다.
import re

text = "ㅋㅋㅋ 안녕하ㅏ세요"
# 정규식에서 일치되는 부분을 리스트 형태로 저장
re.compile('[가-힣]+').findall(text) # 출력 ['안녕하', '세요']
text = "하이 ㅋㅋㅋ 안녕하ㅏ세요"
# 정규식에서 일치되는 부분을  제외하고 저장
re.compile('[ |ㄱ-ㅎ|ㅏ-ㅣ]+').sub('',text) # 출력 '안녕하세요'

+ Recent posts