파이썬 for문 연도별 반복 데이터프레임생성

조회수 6991회

input으로 값을 입력받아서 연도별로 for문을 돌린 값이 데이터프레임에 저장되게 하고 싶습니다.

2019년부터 10년간 반복하려하고

2019년에 중년주택금액 --> 2009에서 2013평균 / 젊은주택가치-->2014에서 2019평균 / 중년주택가치-->두값 나눈것

2018년은 2008~2012평균 / 2013~2018평균 / 두값 나눈것

이런식으로 1년식 줄어든 값을 계산하고 싶습니다.

path = r'C:\Users\admin\Desktop\Python\법정동코드_전체자료.xlsx'
code_df=pd.read_excel(path)

x=input('찾으실 주소를 입력하세요:') #한글로 입력하여 그에 대입하는 코드 찾음

code_select_df = code_df[code_df['폐지여부'] == '존재']

cod_sample_df = code_select_df[code_select_df['법정동명'] == x]

cod_sample_df['법정동코드']

cod = cod_sample_df['법정동코드']

x=str(cod.iloc[0])

x=x[0:5]  #긴 법정동코드 중 5자리만 필요

y=int(input('기준연도를 입력하세요:')) 


df_base= pd.DataFrame(columns=['연도','중년주택가치','젊은주택가격','중년주택가격'])

for j in range(0,10):

    k=y-j


    price_df=get_year_realprice('x','str(k)')
    #중년주택 가치 산출 연도 입력


    temp=price_df['전용면적']
    price_df['전용면적']=pd.to_numeric(temp)

    temp = price_df['거래금액'].apply(lambda x: x.replace(',', '') )
    price_df['거래금액'] = pd.to_numeric(temp)

    price_df['평당단가'] = price_df['거래금액'] / price_df['전용면적'] / 3.3

    temp=price_df['건축년도']
    price_df['건축년도']=pd.to_numeric(temp)


    price_new_df = price_df[price_df['건축년도'] >=int(k)-4]
    #젋은 주택 기준 = 준공 후 5년이내 

    price_select_df = price_df[price_df['건축년도'] >= int(k)-9]
    price_old_df = price_select_df[price_select_df['건축년도']<= int(k)-5]
    #중년 주택 기준 = 준공 후 6~10년 이내

    old_price = np.mean(price_old_df['평당단가'])
    new_price = np.mean(price_new_df['평당단가'])
    mah_value=(old_price/new_price)

    df_base=df_base.append(pd.DataFrame([[str(k), mah_value, new_price, old_price]],columns=['연도','중년주택가치','젊은주택가격','중년주택가격']),ignore_index=True)
df_base

get_year_realprice는 위에 정의를 해놨는데 이 부분을 잘 작동하는것으로 나타납니다. (이미 존재하는 코드라 바로 가져다씀)

def get_realprice(code, date):

    url = 'http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade'
    key = 'NfQ7K6WgSudMMtb8YT5AC3%2FrDhHvg%2BZupj%2Fy4fze4XxJ61XctYdvZEc5wNFrqargp5yLGQwRw7RY16eCAebIbg%3D%3D'

    real_url = url +'?'+ 'LAWD_CD={}&DEAL_YMD={}&serviceKey={}'.format(code, date, key)


    data = requests.get(real_url)
    data_bs = bs4.BeautifulSoup(data.text, 'lxml-xml')
    item_list = data_bs.find_all('item')

    거래금액리스트 = []
    건축년도리스트 = []
    년리스트 = []
    월리스트 = []
    일리스트 = []
    법정동리스트 = []
    아파트리스트 = []
    전용면적리스트 = []
    층리스트 = []
    지번리스트 = []
    지역코드리스트 = []

    for item in item_list:
        거래금액리스트.append(item.find('거래금액').text)
        건축년도리스트.append(item.find('건축년도').text)
        년리스트.append(item.find('년').text)
        월리스트.append(item.find('월').text)
        일리스트.append(item.find('일').text)
        법정동리스트.append(item.find('법정동').text)
        아파트리스트.append(item.find('아파트').text)
        전용면적리스트.append(item.find('전용면적').text)
        층리스트.append(item.find('층').text)
        지번리스트.append(item.find('지번').text)
        지역코드리스트.append(item.find('지역코드').text)

    result_df = pd.DataFrame({'거래금액':거래금액리스트,
                 '건축년도':건축년도리스트,'년':년리스트, '월':월리스트, '일':일리스트,
                 '법정동':법정동리스트, '아파트':아파트리스트,'전용면적':전용면적리스트,
                 '층':층리스트, '지번':지번리스트, '지역코드':지역코드리스트})
    return result_df
def get_year_realprice(code, year):

    year_list = []
    for i in range(1, 13):
        if i < 10:
            temp_date = year + '0' + str(i)
        else:
            temp_date = year + str(i)

        year_list.append(get_realprice(code, temp_date))

    year_df = pd.concat(year_list)
    year_df = year_df.reset_index()
    del year_df['index']
    del year_df['법정동']
    del year_df['아파트']
    del year_df['층']
    del year_df['지번']
    del year_df['일']
    del year_df['지역코드']

    return year_df

도와주시면 정말 감사하겠습니다!

  • 적은 대로 하면 되는 것 아니에요? 문제가 무엇인지요? 정영훈 2019.12.5 10:29
  • 연도는 데이터프레임에 들어가는데 가격 값이 NaN이 뜹니다ㅠㅠ 알 수 없는 사용자 2019.12.5 11:33
  • raw 데이터를 올려주세요. 가격컬럼은 소스상에 노출도 안되어 있는데요? NaN 이라는 것은 Not a Number 라는 의미로 결측치(Null)를 나타내는 거에요. 정영훈 2019.12.5 12:06
  • 다시 수정했습니다! open api에서 데이터를 긁어왔고 법정동 코드는 code.go.kr에서 전체 법정동코드를 다운받았습니다 알 수 없는 사용자 2019.12.5 12:48
  • 중년가격 젊은가격 중년가치가 칼럼으로 되어있고 2019, 2018, 2017 ... 이 row로 추가되도록 하고싶습니다ㅠㅠ 알 수 없는 사용자 2019.12.5 12:50

2 답변

  • 잘 되는 것 같습니다.

    k는 int 이니 int(k) 부분만 수정하면 될 것 같으나 오류는 아니니 실행에 문제는 없고...그런데 질문이 무엇인건지...

    • 2019

      연도  중년주택가치  젊은주택가격  중년주택가격
      0   2019    0.518687    413.246439  214.345396
      1   2018    0.688188    287.400592  197.785632
      2   2017    0.810316    230.767602  186.994569
      3   2016    0.922552    182.836190  168.675836
      4   2015    1.099251    145.339986  159.765101
      5   2014    1.165235    133.570693  155.641223
      6   2013    0.856553    158.622049  135.868213
      7   2012    1.022391    133.735333  136.729819
      8   2011    1.108385    135.849155  150.573229
      9   2010    0.990234    150.722783  149.250750
      
    • 2018

      연도  중년주택가치  젊은주택가격  중년주택가격
      0   2018    0.688188    287.400592  197.785632
      1   2017    0.810316    230.767602  186.994569
      2   2016    0.922552    182.836190  168.675836
      3   2015    1.099251    145.339986  159.765101
      4   2014    1.165235    133.570693  155.641223
      5   2013    0.856553    158.622049  135.868213
      6   2012    1.022391    133.735333  136.729819
      7   2011    1.108385    135.849155  150.573229
      8   2010    0.990234    150.722783  149.250750
      9   2009    0.999133    147.929649  147.801344
      
  • pycharm 이나 visual studio code 사용하신다면, old_price = ... 라인에 중단점 설정하고서, debug 모드로 실행해서 한줄씩 따라가보면 답 나올 것 같은데요.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)