판다스의 멋진 기능중의 하나

 

stack

unstack

groupby

 

def excel_accumulate_page(self):
    dc = self.dc
    df = dc.request_accumulate_data_by_site(self.siteCode, self.month)
    # columns = ['ㄴㄴ', 'ㄴㄴ', 'ㄴㄴ', 'ㄴㄴㄴㄴ']
    df = df.astype({'ㄴㄴ': float, 'ㄴㄴ': float})

    df['구분'] = df['업체명'].apply(lambda x: 'ㄴ' if 'ㄴ' in x else 'ㄴ')
    if 'ㄴ' not in df['ㄴ'].unique():
        df_temp = pd.DataFrame([['ㄴ', '', self.month, 0, 0]], columns=['ㄴ', 'ㄴ', 'ㄴ', 'ㄴ', 'ㄴ'])
        df = pd.concat([df, df_temp])
    if 'ㄴ' not in df['ㄴ'].unique():
        df_temp = pd.DataFrame([['ㄴ', 'ㄴ(주)', self.month, 0, 0]], columns=['ㄴ', 'ㄴ', 'ㄴ', 'ㄴ', 'ㄴ'])
        df = pd.concat([df, df_temp])

    # 자료가 없는 달의 컬럼 생성
    M0 = self.month
    M1 = (datetime.strptime(M0, '%Y-%m') - relativedelta(months=1)).strftime('%Y-%m')
    M2 = (datetime.strptime(M0, '%Y-%m') - relativedelta(months=2)).strftime('%Y-%m')
    M3 = (datetime.strptime(M0, '%Y-%m') - relativedelta(months=3)).strftime('%Y-%m')

    for m in [M0, M1, M2, M3]:
        if m not in df['분석월'].unique():
            df_temp = df.drop_duplicates('업체명').copy()
            df_temp.loc[:, '분석월'] = m
            df_temp.loc[:, 'ㄴ'] = 0
            df_temp.loc[:, 'ㄴ'] = 0
            df = pd.concat([df, df_temp])

    df = df[['ㄴ', 'ㄴ', 'ㄴ', 'ㄴ', 'ㄴ']]
    df = df.sort_values(['ㄴ', 'ㄴ', 'ㄴ'], ascending=[True, True, True])
    df = df.set_index(['ㄴ', 'ㄴ', 'ㄴ'])
    df = df.stack(-1)
    df = df.unstack(-2)
    df = df.fillna(0)

    temp = [d for k, d in df.groupby(level=0)]
    df_hd, df_subcon = temp

    # ㄴ 누계
    df_hd_cumsum = df_hd.sum(level=-1).cumsum(axis=1)
    df_hd_cumsum = df_hd_cumsum.rename({'ㄴ': ('ㄴ', '누 계', 'ㄴ'), 'ㄴ': ('ㄴ', '누 계', 'ㄴ')})
    df_hd = pd.concat([df_hd, df_hd_cumsum])

    # ㄴ 소계 및 누계
    df_subcon_sum = df_subcon.sum(level=-1)
    df_subcon_sum = df_subcon_sum.rename({'ㄴ': ('ㄴ', '소 계', 'ㄴ'), 'ㄴ': ('ㄴ', '소 계', 'ㄴ')})
    df_subcon_cumsum = df_subcon.sum(level=-1).cumsum(axis=1)
    df_subcon_cumsum = df_subcon_cumsum.rename({'ㄴ': ('ㄴ', '누 계', 'ㄴ'), 'ㄴ': ('ㄴ', '누 계', 'ㄴ')})
    df_subcon = pd.concat([df_subcon, df_subcon_sum])
    df_subcon = pd.concat([df_subcon, df_subcon_cumsum])

    # 합치기
    df_result = pd.concat([df_hd, df_subcon])

    # 전체 합계 및 누계
    df_sum = df.sum(level=-1)
    df_sum = df_sum.rename({'ㄴ': ('ㄴ', '', 'ㄴ'), 'ㄴ': ('ㄴ', '', 'ㄴ')})
    df_cumsum = df.sum(level=-1).cumsum(axis=1)
    df_cumsum = df_cumsum.rename({'ㄴ': ('ㄴ', '', 'ㄴ'), 'ㄴ': ('ㄴ', '', 'ㄴ')})
    df_result = pd.concat([df_result, df_sum])
    df_result = pd.concat([df_result, df_cumsum])

    # 비고 삽입
    df_result.loc[:, '비 고'] = ''
    return df_result

#
# import requests
# from bs4 import BeautifulSoup
#
# f = open("Daum_News.csv", "w", encoding="UTF=8")
# f.write("title,summary\n")
#
# for i in range(1,4):
#     raw = requests.get("https://search.daum.net/search?w=news&q=이스라엘&DA=PGD&spacing=0&p="+str(i))
#     html = BeautifulSoup(raw.text, 'html.parser')
#     news = html.select("ul.list_info>li")
#
#     for ns in news:
#         title = ns.select_one("div.mg_tit").text.strip().replace(",",".")
#         summary = ns.select_one("p.desc").text.strip().replace(",",".")
#         f.write(title + "," + summary + "\n")
#
# f.close()

import requests
from bs4 import BeautifulSoup
import openpyxl

key = input("검색어를 입력하십시오. : ")

try:
    wb = openpyxl.load_workbook("daumNews.xlsx")
    sheet1 = wb.create_sheet(key)
    sheet1.append(["title", "summary"])
    print("기존에 있는 파일에 새 시트로 입력하였습니다.")

except:
    wb = openpyxl.Workbook()
    sheet1 = wb.active
    sheet1.append(["title", "summary"])
    sheet1.title = key
    print("새 파일을 작성하였습니다.")

for i in range(1,4):
    raw = requests.get("https://search.daum.net/search?w=news&q="+key+"&DA=PGD&spacing=0&p="+str(i))
    html = BeautifulSoup(raw.text, "html.parser")
    news = html.select("div.cont_inner")

    for ns in news:
        title = ns.select_one("div.wrap_tit").text.strip()
        summary = ns.select_one("p.desc").text.strip()
        sheet1.append([title, summary])

wb.save("daumNews.xlsx")

하나씩 해보는 재미가 쏠쏠합니다. 

초보적인 수준에 불과하겠지만,

복사하고 붙여 넣기보다는 직접 한 글자, 한 글자 입력해 보면서 하는 것이 더 좋은 것 같군요.

 

패키지 혹은 라이브러리의 쓰임새가 무궁무진하겠군요.

이제 겨우 requests, BeautifulSoup, openpyxl 세 가지 써봤습니다.

 

뭐, 걸음마 하는 수준이니까요. 계속 걸어가 보렵니다. 

 

PS. py파일명을 패키지와 같은 이름으로 했다가 한 시간을 허비했습니다. 계속 오류가 나더군요.

이런 것은 몸으로 배워야 하나 봅니다. 

파일명, 변수명은 중복되지 않도록 두 단어 이상 붙일 것.

 

'코딩' 카테고리의 다른 글

Toy Project - 캘린더, 지도, 모임  (0) 2021.06.23
나총무 - 내가총무다  (0) 2021.06.23
python - 데이터 수집기 예제  (0) 2021.05.15
python - Scraping 도전중  (0) 2021.05.12
python 기초 - 쉬운게 없다.  (0) 2021.05.10

 

쉬운 것이 어디 있겠냐마는

 

그래도 시간 가는 줄 모르고 계속 뒤지고 공부할 수 있었다는 것이 유일한 위안.

 

5시에 퇴근 합시다~!

 

계속 보면 진이 빠질 듯. 천천히 갑니다.

 

언젠가는 이 글을 보겠지요. 

 

21년 5월 10일

'코딩' 카테고리의 다른 글

나총무 - 내가총무다  (0) 2021.06.23
python - 데이터수집기, 엑셀 저장  (0) 2021.05.16
python - 데이터 수집기 예제  (0) 2021.05.15
python - Scraping 도전중  (0) 2021.05.12
Udacity - Intro to Computer Science  (0) 2021.04.30

+ Recent posts