ローマ数字に変換する (2)#
Wikipediaのデータを活用する#
pandasのライブラリ関数 read_html()
を使ってWikipediaの表を読み込む:
%%ai vioras
Webスクレイピングして表をPandasのデータフレームに読み込む
PythonでWebスクレイピングを行い、その結果をPandasのデータフレームに読み込むには、たとえばrequests
、BeautifulSoup
、そしてpandas
といったライブラリを使用します。
以下に、HTMLページからテーブルをスクレイピングし、それをPandasのデータフレームに読み込む基本的なコードを示します:
import requests
from bs4 import BeautifulSoup
import pandas as pd
# WebページのURL
url = "https://example.com"
# ページのHTMLを取得
response = requests.get(url)
# BeautifulSoupオブジェクトを作成
soup = BeautifulSoup(response.text, 'html.parser')
# HTML内のテーブルを見つける
table = soup.find('table')
# テーブルをデータフレームに変換
df = pd.read_html(str(table))[0]
print(df)
このコードでは、まずrequests.get()
を使ってWebページのHTMLを取得します。次に、BeautifulSoup
を使ってHTMLを解析します。
そして、find('table')
を使ってHTML内のテーブルを見つけます。このとき、テーブルがページ内に複数ある場合は、最初に見つかったテーブルが選択されます。特定のテーブルを選択するには、より詳細なセレクタを使用する必要があります。
最後に、pd.read_html()
を使ってHTMLテーブルをデータフレームに変換します。この関数はHTML文字列を引数に取り、その中のすべてのテーブルをデータフレームのリストとして返します。今回は1つのテーブルだけを扱っているので、リストの最初の要素([0]
)を選択します。
なお、このコードはあくまで一例であり、実際には取得するWebページやそのHTML構造により、適切なスクレイピング方法は異なります。また、Webスクレイピングは対象サイトの利用規約やロボット排除基準(robots.txt)に従う必要があります。
データフレーム#
import pandas as pd
tables = pd.read_html('https://en.wikipedia.org/wiki/Roman_numerals')
tables[1]
0 | |
---|---|
0 | Hindu–Arabic numerals Western Arabic Eastern A... |
1 | East Asian systems Contemporary Chinese Suzhou... |
2 | Other systems History Ancient Babylonian Post-... |
3 | By radix/base Common radices/bases 2 3 4 5 6 8... |
df1 = tables[2]
df1
0 | 1 | 2 | 3 | 4 | 5 | 6 | |
---|---|---|---|---|---|---|---|
0 | I | V | X | L | C | D | M |
1 | 1 | 5 | 10 | 50 | 100 | 500 | 1000 |
表を参照してローマ数字を変換するプログラムを書く:
index
(行番号) を設定し直す表形式のままでもプログラムは書けるが、JSON形式を経由して辞書形式に変換する
df2 = tables[3]
df2
Unnamed: 0 | Thousands | Hundreds | Tens | Units | |
---|---|---|---|---|---|
0 | 1 | M | C | X | I |
1 | 2 | MM | CC | XX | II |
2 | 3 | MMM | CCC | XXX | III |
3 | 4 | NaN | CD | XL | IV |
4 | 5 | NaN | D | L | V |
5 | 6 | NaN | DC | LX | VI |
6 | 7 | NaN | DCC | LXX | VII |
7 | 8 | NaN | DCCC | LXXX | VIII |
8 | 9 | NaN | CM | XC | IX |
df_new = df2.rename(columns={'Unnamed: 0':'index'}).set_index('index')
df_new
Thousands | Hundreds | Tens | Units | |
---|---|---|---|---|
index | ||||
1 | M | C | X | I |
2 | MM | CC | XX | II |
3 | MMM | CCC | XXX | III |
4 | NaN | CD | XL | IV |
5 | NaN | D | L | V |
6 | NaN | DC | LX | VI |
7 | NaN | DCC | LXX | VII |
8 | NaN | DCCC | LXXX | VIII |
9 | NaN | CM | XC | IX |
データフレームをJSON形式に変換し、さらに辞書に変換#
データフレームをJSON形式に変換#
df_new.to_json()
'{"Thousands":{"1":"M","2":"MM","3":"MMM","4":null,"5":null,"6":null,"7":null,"8":null,"9":null},"Hundreds":{"1":"C","2":"CC","3":"CCC","4":"CD","5":"D","6":"DC","7":"DCC","8":"DCCC","9":"CM"},"Tens":{"1":"X","2":"XX","3":"XXX","4":"XL","5":"L","6":"LX","7":"LXX","8":"LXXX","9":"XC"},"Units":{"1":"I","2":"II","3":"III","4":"IV","5":"V","6":"VI","7":"VII","8":"VIII","9":"IX"}}'
見やすく成形 (pretty-print)#
import json
df_json = json.loads((df_new.to_json()))
print(json.dumps(df_json, indent=4))
{
"Thousands": {
"1": "M",
"2": "MM",
"3": "MMM",
"4": null,
"5": null,
"6": null,
"7": null,
"8": null,
"9": null
},
"Hundreds": {
"1": "C",
"2": "CC",
"3": "CCC",
"4": "CD",
"5": "D",
"6": "DC",
"7": "DCC",
"8": "DCCC",
"9": "CM"
},
"Tens": {
"1": "X",
"2": "XX",
"3": "XXX",
"4": "XL",
"5": "L",
"6": "LX",
"7": "LXX",
"8": "LXXX",
"9": "XC"
},
"Units": {
"1": "I",
"2": "II",
"3": "III",
"4": "IV",
"5": "V",
"6": "VI",
"7": "VII",
"8": "VIII",
"9": "IX"
}
}
JSON形式を辞書に変換する#
df_new.to_json()
'{"Thousands":{"1":"M","2":"MM","3":"MMM","4":null,"5":null,"6":null,"7":null,"8":null,"9":null},"Hundreds":{"1":"C","2":"CC","3":"CCC","4":"CD","5":"D","6":"DC","7":"DCC","8":"DCCC","9":"CM"},"Tens":{"1":"X","2":"XX","3":"XXX","4":"XL","5":"L","6":"LX","7":"LXX","8":"LXXX","9":"XC"},"Units":{"1":"I","2":"II","3":"III","4":"IV","5":"V","6":"VI","7":"VII","8":"VIII","9":"IX"}}'
%%ai vioras
次の表を10進数をローマ数字に変換するときに使うPythonの辞書に変換してください
{_}
提供されたJSONデータから、各位(千の位、百の位、十の位、一の位)のローマ数字の表現を示す4つのPython辞書を作成することができます。以下にそのPythonコードを示します:
# 提供されたJSONデータ
data = {
"Thousands": {"1":"M","2":"MM","3":"MMM","4":None,"5":None,"6":None,"7":None,"8":None,"9":None},
"Hundreds": {"1":"C","2":"CC","3":"CCC","4":"CD","5":"D","6":"DC","7":"DCC","8":"DCCC","9":"CM"},
"Tens": {"1":"X","2":"XX","3":"XXX","4":"XL","5":"L","6":"LX","7":"LXX","8":"LXXX","9":"XC"},
"Units": {"1":"I","2":"II","3":"III","4":"IV","5":"V","6":"VI","7":"VII","8":"VIII","9":"IX"}
}
# 各位のローマ数字表現を示す辞書
thousands_dict = data["Thousands"]
hundreds_dict = data["Hundreds"]
tens_dict = data["Tens"]
units_dict = data["Units"]
print("Thousands:", thousands_dict)
print("Hundreds:", hundreds_dict)
print("Tens:", tens_dict)
print("Units:", units_dict)
このコードは提供されたJSONデータから4つのPython辞書を生成します。各辞書はそれぞれ千の位、百の位、十の位、一の位のローマ数字の表現をキーと値のペアとして格納します。
%%ai vioras
その辞書を使って10進数をローマ数字に変換するプログラムを作って下さい
提供された辞書を使用して、10進数をローマ数字に変換するPythonプログラムを作成します。以下にそのコードを示します:
# 提供されたJSONデータ
data = {
"Thousands": {"1":"M","2":"MM","3":"MMM","4":None,"5":None,"6":None,"7":None,"8":None,"9":None},
"Hundreds": {"1":"C","2":"CC","3":"CCC","4":"CD","5":"D","6":"DC","7":"DCC","8":"DCCC","9":"CM"},
"Tens": {"1":"X","2":"XX","3":"XXX","4":"XL","5":"L","6":"LX","7":"LXX","8":"LXXX","9":"XC"},
"Units": {"1":"I","2":"II","3":"III","4":"IV","5":"V","6":"VI","7":"VII","8":"VIII","9":"IX"}
}
# 各位のローマ数字表現を示す辞書
thousands_dict = data["Thousands"]
hundreds_dict = data["Hundreds"]
tens_dict = data["Tens"]
units_dict = data["Units"]
def decimal_to_roman(num):
# 各位の数字を取得
thousands = num // 1000
hundreds = num % 1000 // 100
tens = num % 100 // 10
units = num % 10
# 各位の数字を対応するローマ数字に変換
roman_thousands = thousands_dict.get(str(thousands), "")
roman_hundreds = hundreds_dict.get(str(hundreds), "")
roman_tens = tens_dict.get(str(tens), "")
roman_units = units_dict.get(str(units), "")
# ローマ数字を結合
roman_num = roman_thousands + roman_hundreds + roman_tens + roman_units
return roman_num
# テスト
print(decimal_to_roman(1987)) # MCMLXXXVII
このコードは、10進数の各位の数字を取得し、それぞれ対応するローマ数字に変換します。そして、結果を結合してローマ数字として出力します。