ローマ数字に変換する (2)#

Wikipediaのデータを活用する#

pandasのライブラリ関数 read_html() を使ってWikipediaの表を読み込む:

%%ai vioras
Webスクレイピングして表をPandasのデータフレームに読み込む

PythonでWebスクレイピングを行い、その結果をPandasのデータフレームに読み込むには、たとえばrequestsBeautifulSoup、そして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進数の各位の数字を取得し、それぞれ対応するローマ数字に変換します。そして、結果を結合してローマ数字として出力します。