from pathlib import Path
import pandas as pd
import numpy as np
from pyquery import PyQuery as pq
import re
BASE_PATH = Path('../勞動部')
OUT_PATH = BASE_PATH / 'parsed'
html_list = [p for p in BASE_PATH.iterdir() if p.suffix == '.htm']
html_list
[PosixPath('../勞動部/勞動部101年.htm'), PosixPath('../勞動部/勞動部102年.htm')]
dom = pq(html_list[0].open().read())
dfs = pd.read_html(dom.html(), header=0, infer_types=False)
/Users/liang/.virtualenvs/sci_sys/lib/python3.4/site-packages/pandas/io/html.py:829: FutureWarning: infer_types will have no effect in 0.14 warnings.warn("infer_types will have no effect in 0.14", FutureWarning)
df = dfs[0]
shifted_ix = df.loc[df['單位'] == 'nan'].index
df.ix[shifted_ix, 1:] = df.ix[shifted_ix, :-1].values
df.loc[shifted_ix, '季'] = np.NaN
df = df.ffill()
df['媒體'] = df.apply(
lambda r: '{}:{}'.format(r['媒體型態'], r['刊播媒體']),
axis=1
)
new_index = df.columns.values
new_index[1] = '主題'
new_index[4] = '時間'
new_index[6] = '金額'
new_index[7] = '執行單位'
df.columns = new_index
df['備註']= df.apply(
lambda r: '露出次數:{}\n季:{}'.format(r[5], r[0]),
axis=1
)
parse_budget = re.compile('(.*)」?總經費(.*):\s*([0-9,]*)\s*(.*)', re.UNICODE).match
def norm_budget(row):
new_row = row.copy()
v = row['金額']
if v.isnumeric():
# 正常的金額
# print(v, 'is a valid number')
new_row['金額'] = int(v)
return new_row
match = parse_budget(v)
if match:
prj, prj_note, budget, desc = match.groups()
prj += prj_note
# special case
if '報紙宣導案' in prj:
prj = '「報紙宣導案」'
if prj in all_prj:
# 已經出現過的專案
# print(prj, 'appeared, budget set to 0')
new_row['金額'] = 0
new_row['備註'] += ('\n專案:' + prj + desc)
return new_row
else:
budget = int(budget.replace(',', ''))
# print('add', prj, 'with', budget)
all_prj.add(prj)
new_row['金額'] = budget
new_row['備註'] += ('\n專案:' + prj + desc)
return new_row
else:
print(v, 'is sth strange')
return new_row
all_prj = set()
df = df.apply(norm_budget, axis=1)
廠商免費加值服務 is sth strange
df['行政部會'] = '勞動部'
df['民國年'] = '101'
df = df[['主題', '媒體', '民國年', '時間', '金額', '執行單位', '行政部會', '備註']]
out_stem = str(OUT_PATH / '{}'.format(html_list[0].stem))
df.to_csv(out_stem + '.csv', index=False)
df.to_excel(out_stem + '.xlsx', index=False)
dom = pq(html_list[1].open().read())
df = pd.read_html(dom.html(), header=0, infer_types=False)[0]
shifted_ix = df.loc[df['單位'] == 'nan'].index
df.ix[shifted_ix, 1:] = df.ix[shifted_ix, :-1].values
df.loc[shifted_ix, '季'] = np.NaN
# row 1 is special case
df.ix[1, 2:6] = df.ix[1, 1:5].values
df.iloc[1, 6] = np.NaN
df = df.ffill()
df.head()
季 | 廣告主要內容 | 媒體型態 | 刊播媒體 | 刊播時間 | 露出 次數 | 單位 | |
---|---|---|---|---|---|---|---|
0 | 第二 季 | 職災勞工保護資源體系 | 平面媒體 | 聯合報、自由時報 | 102年4月26日 | 2 | 福利處、安衛處、勞保處、條件處、勞資處、勞保局、職訓局 |
1 | 第二 季 | 網路媒體 | 網路媒體 | 聯合新聞網 | 102年4月29日 | 1 | 福利處、安衛處、勞保處、條件處、勞資處、勞保局、職訓局 |
2 | 第二 季 | 育嬰留職停薪津貼 | 廣播媒體 | 人人電台、天南電台、新竹勞工之聲、山海屯電台、嘉義之聲、港都電台、南方之音、屏東之聲、下港之... | 102年5月 | 374 | 勞保處 |
3 | 第二 季 | 撥打「職災勞工諮詢專線0800-001-850」 | 廣播媒體 | 台北之音、新農電台、中台灣廣播、濁水溪電台、高屏廣播、潮州之聲、豐蓮電台 | 102年5月至6月 | 200 | 福利處 |
4 | 第二 季 | 局限空間災害預防 | 廣播媒體 | ICRT、全景廣播、新竹勞工之聲、奇峰電台、望春風廣播、嘉樂廣播、中部調頻、快樂電台、風聲電... | 102年5月 | 251 | 檢查處 |
5 rows × 7 columns
df['媒體'] = df.apply(
lambda r: '{}:{}'.format(r['媒體型態'], r['刊播媒體']),
axis=1
)
new_index = df.columns.values
new_index[1] = '主題'
new_index[4] = '時間'
new_index[6] = '金額'
new_index[7] = '執行單位'
df.columns = new_index
df['備註']= df.apply(
lambda r: '露出次數:{}\n季:{}'.format(r[5], r[0]),
axis=1
)
all_prj = set()
df = df.apply(norm_budget, axis=1)
福利處、安衛處、勞保處、條件處、勞資處、勞保局、職訓局 is sth strange 福利處、安衛處、勞保處、條件處、勞資處、勞保局、職訓局 is sth strange 福利處、安衛處、勞保處、條件處、勞資處、勞保局、職訓局 is sth strange 勞保處 is sth strange 福利處 is sth strange 檢查處 is sth strange 勞保處 is sth strange 條件處、勞資處、檢查處、勞保處、勞保局 is sth strange 條件處、安衛處、勞保局、職訓局 is sth strange
df.head()
季 | 主題 | 媒體型態 | 刊播媒體 | 時間 | 露出 次數 | 金額 | 執行單位 | 備註 | |
---|---|---|---|---|---|---|---|---|---|
0 | 第二 季 | 職災勞工保護資源體系 | 平面媒體 | 聯合報、自由時報 | 102年4月26日 | 2 | 福利處、安衛處、勞保處、條件處、勞資處、勞保局、職訓局 | 平面媒體:聯合報、自由時報 | 露出次數:2\n季:第二 季 |
1 | 第二 季 | 網路媒體 | 網路媒體 | 聯合新聞網 | 102年4月29日 | 1 | 福利處、安衛處、勞保處、條件處、勞資處、勞保局、職訓局 | 網路媒體:聯合新聞網 | 露出次數:1\n季:第二 季 |
2 | 第二 季 | 育嬰留職停薪津貼 | 廣播媒體 | 人人電台、天南電台、新竹勞工之聲、山海屯電台、嘉義之聲、港都電台、南方之音、屏東之聲、下港之... | 102年5月 | 374 | 勞保處 | 廣播媒體:人人電台、天南電台、新竹勞工之聲、山海屯電台、嘉義之聲、港都電台、南方之音、屏東之... | 露出次數:374\n季:第二 季 |
3 | 第二 季 | 撥打「職災勞工諮詢專線0800-001-850」 | 廣播媒體 | 台北之音、新農電台、中台灣廣播、濁水溪電台、高屏廣播、潮州之聲、豐蓮電台 | 102年5月至6月 | 200 | 福利處 | 廣播媒體:台北之音、新農電台、中台灣廣播、濁水溪電台、高屏廣播、潮州之聲、豐蓮電台 | 露出次數:200\n季:第二 季 |
4 | 第二 季 | 局限空間災害預防 | 廣播媒體 | ICRT、全景廣播、新竹勞工之聲、奇峰電台、望春風廣播、嘉樂廣播、中部調頻、快樂電台、風聲電... | 102年5月 | 251 | 檢查處 | 廣播媒體:ICRT、全景廣播、新竹勞工之聲、奇峰電台、望春風廣播、嘉樂廣播、中部調頻、快樂電... | 露出次數:251\n季:第二 季 |
5 rows × 9 columns