読者です 読者をやめる 読者になる 読者になる

無職の雑記

Garbage in, garbage out.

2016/07/07

3時起床。某体調不良に悩まされる。pythonのコードを書く。昼寝。某海に出かけて、帰りに「そば、そうめん、すりごま、豆乳、卵、納豆」を買って帰る。こんなに淡白なものばかり食べていて良いのだろうか。英語(「body artist」)を読む。「body artist」は読み始めて2ヶ月が経ったと思うけど、ようやく終わりが見えてきた(100ページしかないのだが)。正直、自分の英語力を圧倒的に上回っている本なので、読めば読むほど心が折れる。この本以外のところでは、1つの文章の半分が未知語である、なんてことは最近ではあまりない。小説を読むのは大変だ。

 ・・・

Web Scraping - It’s Your Civic Duty - Practical Business Python

ミネソタ州の予算の使い道データを、スクレイピングで取得しグラフ化してみる、という記事。勉強のため模倣。記事のコードはpython2系なので、3系の環境では微妙に動かなかったり、そもそもコードの意味がよくわからなかったりしたので、自分なりに試行錯誤。データの抽出・整形が、あまりにアドホック過ぎ、もう少し何とかならないのかと思うが、現状ではこれが限界。

# モジュールのインポート
import requests, bs4
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('ggplot')
%matplotlib inline # iPython内でグラフを表示させるためのおまじない

# ページの取得、BeautifulSoupオブジェクトの作成
url = 'https://www.revisor.mn.gov/laws/?year=2014&type=0&doctype=Chapter&id=294'
res = requests.get(url)
res.raise_for_status()

soup = bs4.BeautifulSoup(res.text, 'lxml')

# データの抽出、整形
x = soup.find_all('table')
x = x[1]
x = x.find_all('ins')

x = [i.contents[0] for i in x ]
x = [i for i in x if i != 'SUMMARY' if i != '$' if i != 'TOTAL' if i != '893,054,000']

expense = x[0:50]
funding = x[50:]

expense1 = expense[::2] # 偶数番目(項目)を抽出
expense2 = expense[::-2][::-1] # 奇数番目(数値)を抽出

funding1 = funding[::2]
funding2 = funding[::-2][::-1]

# 数値が文字列なので、数値に変換する関数
def convert_num(li):
    x = []
    for i in li:
        i = int(float(i.replace('(','-').replace(')','').replace(',','')))
        x.append(i)
    return x

expense2 = convert_num(expense2)
funding2 = convert_num(funding2)

# DataFrame の作成
expense_df = pd.DataFrame(expense2,expense1)
expense_df.rename(columns={0: 'Amount'}, inplace=True)
funding_df = pd.DataFrame(funding2,funding1)
funding_df.rename(columns={0: 'Amount'}, inplace=True)

# グラフが降順に表示されるよう、データを並べ替え
expense_df = expense_df.sort_values(by='Amount')
funding_df =funding_df.sort_values(by='Amount')

# 描画
expense_df.plot(kind='barh', figsize=[6, 10],title="2014 MN Capital Budget Spending")
funding_bar = funding_df.plot(kind='barh',title="2014 MN Capital Budget Funding")

f:id:unEmployed:20160707184808p:plain

f:id:unEmployed:20160707184814p:plain

広告を非表示にする