PyDocument (original) (raw)
Pythonで平方根を計算する方法をまとめました。モジュール、ライブラリを用いた計算方法、平方根を求める代表的なアルゴリズム「ニュートン法」「二分法」をPythonで実装する計算方法を解説していきます。
mathモジュールのsqrt関数を使った計算
Pythonで平方根を計算する最も一般的な方法は、mathモジュールのsqrt関数を使うことです。この関数は、非負の実数を引数として受け取り、その平方根を返します。
import math
number1 = 25 result1 = math.sqrt(number1) print(result1)
number2 = 2 result2 = math.sqrt(number2) print(result2)
NumPyのsqrt関数を使った計算
NumPyは数値計算に特化したライブラリです。以下の様に平方根を計算することができます。
import numpy as np
number = 25
result = np.sqrt(number)
print(result)
なお、NumPyのsqrt関数では配列などの複数の数値の平方根を一度に計算することができます。
import numpy as np
numbers = [2, 3, 5] results = np.sqrt(numbers) print(results)
配列を扱うことが多い場合は「NumPy」、ライブラリの導入に制限がある場合やシンプルな計算で済む場合は、「math」モジュールを使うのが良いかと思います。
べき乗の計算を使った計算
シンプルな計算方法として、平方根はある数を1/2乗することと等価ですので、下記のように計算することも可能です。
number = 2 result = number ** 0.5 print(result)
自分で実装する方法
モジュールやライブラリを利用せず、アルゴリズを実装して平方根を求めることが可能です。平方根の近似値を求める方法として代表的な2つの方法、**ニュートン法と二分法**について解説します。
ニュートン法を用いた実装
ニュートン法は、ある関数の根(つまり、関数の値が0となるxの値)を求めるための数値計算法です。平方根の計算にも応用できます。
ニュートン法の考え方
x1 = (x0 + a/x0) / 2
x2 = (x1 + a/x1) / 2
...
def sqrt_newton(a, eps=1e-10): """ ニュートン法を用いて平方根を求める関数
Args: a: 平方根を求める数 eps: 許容誤差
Returns: aの平方根の近似値 """
x = a / 2 while abs(x**2 - a) > eps: x = (x + a/x) / 2 return x
result = sqrt_newton(16) print(result)
予備校のノリで学ぶ大学数学 ツマるポイントを徹底解説 [ ヨビノリたくみ ]
二分法を用いた実装
二分法は、ある関数の根を求める別の数値計算法です。ニュートン法よりも安定しているという特徴があります。
考え方
- 平方根を求めたい数を
a
とする。 a
の平方根の範囲を[left, right]
とする。- 中点
mid
を計算し、mid**2
とa
を比較する。mid**2
がa
より大きければ、範囲を[left, mid]
に狭める。mid**2
がa
より小さければ、範囲を[mid, right]
に狭める。
- 十分に範囲が狭まれば、
mid
がa
の平方根の近似値となる。
Pythonコード
def sqrt_bisection(a, eps=1e-10): """ 二分法を用いて平方根を求める関数
Args: a: 平方根を求める数 eps: 許容誤差
Returns: aの平方根の近似値 """
left, right = 0, a while right - left > eps: mid = (left + right) / 2 if mid**2 > a: right = mid else: left = mid return mid
result = sqrt_bisection(16) print(result)
mathモジュールやNumPyのライブラリを用いる方法が一般的ですが、パフォーマンスや計算リソースの要件に応じて独自の実装が必要な場合は参考にしてください。
Streamlitは、PythonでインタラクティブなWebアプリケーションを簡単に作成できるフレームワークです。今回は、そのStreamlitを使って、シンプルなフォームを作成する方法を解説します。まず簡単に、Streamlitには下記のような特徴があります
- Pythonの知識さえあれば、Web開発の経験がなくても簡単にフロントエンドの画面を作ることができます。
- Streamlitはデータサイエンティストや機械学習との親和性が高く、作ったAIモデルやデータの分析結果を簡単にWebアプリケーションとして共有できます。
なお、Streamlitの読み方はそのまま、「ストリームリット」です。
開発環境の準備
- Streamlitのインストール: ターミナルまたはコマンドプロンプトで以下のコマンドを実行します。
pip install streamlit
シンプルなフォームの作成
インプットフォームにデータを入力し、ボタン押下で送信するシンプルなフォームのページを作成します。まずはコードです。
import streamlit as st
st.title('シンプルなフォーム')
name = st.text_input('お名前を入力してください')
if st.button('送信'): st.write('こんにちは、', name, 'さん!')
コードの解説
- ライブラリのインポート:
streamlit
ライブラリをst
という名前でインポートします。 - タイトルの設定:
st.title()
関数を使って、ページのタイトルを設定します。 - テキスト入力:
st.text_input()
関数でテキスト入力欄を作成します。引数には、入力欄のラベルとなる文字列を指定します。 - ボタン:
st.button()
関数でボタンを作成します。ボタンをクリックすると、if
文内の処理が実行されます。 - 入力値の表示:
st.write()
関数で、入力された名前を表示します。
実行方法
streamlit run app.py
ブラウザが自動的に開き、作成したフォームが表示されます。
さらに機能を追加する
以下3つの、フォームでよくある実装を紹介します。
- 選択メニュー:
st.selectbox()
で選択肢から一つを選ぶメニューを作成できます。 - チェックボックス:
st.checkbox()
でチェックボックスを作成できます。 - スライダー:
st.slider()
で数値を選択するスライダーを作成できます。
favorite_color = st.selectbox('好きな色は?', ['赤', '青', '緑'])
agree = st.checkbox('同意します')
age = st.slider('年齢', min_value=18, max_value=100, value=25)
まとめ
Streamlitを使えば、Pythonのコードを少し書くだけで、簡単にインタラクティブなWebアプリケーションを作成できます。今回の例では、最もシンプルなフォームを作成しましたが、Streamlitには他にも様々な機能が用意されています。より複雑なアプリケーションの作成には、公式ドキュメントを参考にしてください。
Streamlit公式ドキュメント: https://docs.streamlit.io/
[PR] Streamlitの学習に有効なUdemyのオンラインコースを紹介します。
Python×APIで動かして学ぶ AI活用プログラミング [ 下山輝昌 ]
PDFドキュメントの中には、画像としてスキャンされたテキストが含まれていることがあります。その場合、テキストを抽出するためにはOCR(光学文字認識)技術を使用する必要があります。本記事では、Pythonを使用してPDFからテキストを抽出するためのOCR処理を実装する方法を解説します。
必要なライブラリのインストール
OCR処理を実行するために必要なPythonライブラリは以下のようなものです。
PyMuPDF
(fitz
): PDFを扱うためのライブラリPillow
: 画像処理ライブラリpytesseract
: Tesseract OCRエンジンへのPythonインターフェースpdf2image
: PDFページを画像に変換するライブラリ
インストールしていないものがあればpipでインストールします。一括で全てインストールする場合は、下記のコマンドを実行してください。
pip install PyMuPDF Pillow pytesseract pdf2image
Tesseract OCRのインストール
今回OCRの処理には「Tesseract」というOCRエンジンを利用します。 以下のリンクを参考に利用するOSに合わせてインストールしてください。
インストール後、Tesseractの実行ファイルがパスに含まれていることを確認します。インストールした「Tesseract」には、後ほどpytesseract
のライブラリを使用してアクセスします。
退屈なことはPythonにやらせよう 第2版 ノンプログラマーにもできる自動化処理プログラミング [ AI Sweigart ]
PDFから画像への変換
まず、PDFの各ページを画像として保存します。これにはpdf2image
ライブラリを使用します。
from pdf2image import convert_from_path
pdf_path = 'sample.pdf'
images = convert_from_path(pdf_path)
for i, image in enumerate(images): image.save(f'page_{i + 1}.png', 'PNG')
【ふるさと納税】\レビューキャンペーン/HHKB Professional HYBRID Type-S 日本語配列/墨※着日指定不可
画像からテキストを抽出する
次に、保存した画像に対してOCR処理を行い、テキストを抽出します。pytesseract
ライブラリを使用して、画像内のテキストを認識します。
import pytesseract from PIL import Image
text = ""
for i, image in enumerate(images):
page_text = pytesseract.image_to_string(image, lang='jpn')
text += f"--- Page {i + 1} ---\n"
text += page_text + "\n"
print(text)
上記のコードでは、各ページの画像をOCR処理し、抽出されたテキストをまとめて出力します。
実行結果
このスクリプトを実行すると、指定したPDFの各ページからテキストが抽出され、コンソールに出力されます。text
変数には、全ページのテキストが格納されているため、必要に応じてファイルに保存することも可能です。
with open('output.txt', 'w', encoding='utf-8') as f: f.write(text)
まとめ
Pythonを使用してPDFのOCR処理を行うことで、スキャンされたドキュメントから簡単にテキストを抽出することができます。pytesseract
とpdf2image
を組み合わせることで、PDFの各ページを画像として処理し、その中のテキストを認識することが可能です。 実際のプロジェクトでは、処理するPDFの解像度や言語に応じて、OCRエンジンの設定を調整することも検討すると良いでしょう。
これで、Pythonを使ったPDFのOCR処理に関する基本的な実装方法を解説しました。ぜひ、実際のプロジェクトに活用してみてください。
面倒なことはChatGPTにやらせよう (KS情報科学専門書) [ カレーちゃん ]
Pythonで会議の録画などの動画データからテキストを書き起こして、要約する方法について解説します。以下では、具体的な手順とサンプルコードを通じてその方法を解説します。この方法を利用して、TeamsやZoomの会議録画から議事録の作成を省力化することも可能です。
実装する手順の説明
下記の4ステップで実装します。
- 動画データの取得 : 動画ファイルをPythonで読み込みます。
- 音声の抽出 : 動画から音声トラックを抽出します。
- 音声からテキストへの変換 : 抽出した音声データをテキストに変換します。
- テキストの要約 : 変換したテキストを要約します。
処理の実装
上記の4ステップを順に実装していきます。
事前の環境準備
初めに必要なライブラリをインストールします。今回はmoviepy
、pydub
、speech_recognition
、gensim
のライブラリを利用します。以下のコマンドでそれらを一括でインストールできます。インストール済みの場合はスキップして下さい。
pip install moviepy pydub SpeechRecognition gensim
動画データの取得
moviepy
ライブラリを使って動画ファイルを読み込みます。example_video.mp4
は読み込む動画ファイルのパスです。実際のファイル名、ファイルパスに置き換えて下さい。VideoFileClip
関数を使って動画をオブジェクトとして読み込みます。
import moviepy.editor as mp
video_path = "example_video.mp4" video = mp.VideoFileClip(video_path)
音声の抽出
moviepy
ライブラリを使用して動画から音声トラックを抽出します。まず、動画オブジェクトから音声部分を取得し、write_audiofile
メソッドを使用して音声を指定したファイルに書き出します。
import moviepy.editor as mp from pydub import AudioSegment
video_path = "example_video.mp4" video = mp.VideoFileClip(video_path)
audio_path = "temp_audio.wav" video.audio.write_audiofile(audio_path)
音声からテキストへの変換
音声ファイルをGoogleの音声認識APIを使ってテキストに変換します。まず、pydub
ライブラリを使用して音声ファイルを読み込み、一時的なファイルとして書き出します。次に、speech_recognition
ライブラリを使用して音声ファイルを読み込み、Googleの音声認識APIを使ってテキストに変換します。
import moviepy.editor as mp from pydub import AudioSegment import speech_recognition as sr
audio_path = "temp_audio.wav" audio = AudioSegment.from_wav(audio_path) audio.export("temp_audio.flac", format="flac")
recognizer = sr.Recognizer() with sr.AudioFile("temp_audio.flac") as source: audio_data = recognizer.record(source) text = recognizer.recognize_google(audio_data, language="ja")
recognizer.recognize_google()
のlanguage
パラメータには音声の言語を指定します。今回の実装では日本語のja
を指定しています。もし英語の場合はlanguageを書き換え、text = recognizer.recognize_google(audio_data, language="en")
と実装します。
退屈なことはPythonにやらせよう 第2版 ノンプログラマーにもできる自動化処理プログラミング [ AI Sweigart ]
テキストの要約と結果の出力
このブロックでは、gensim
ライブラリを使ってテキストを要約します。最後に確認のため、結果をコンソールに出力します。また、結果をテキストファイルにも出力しています。テキストファイルは "summary.txt"
という名前で保存しています。コンソールで結果を確認する必要がない場合、結果が長すぎる場合はprint()
の処理をコメントアウトして下さい。
from gensim.summarization import summarize
summary = summarize(text, ratio=0.5)
print("書き起こしテキスト:") print(text) print("\n要約:") print(summary)
with open("summary.txt", "w") as file: file.write(summary)
gensim.summarization
モジュールの要約率は、要約結果の長さを制御するパラメータです。この要約率は、0から1の間の値で指定されます。要約率が大きいほど、元のテキストの長さに対して要約結果の長さが大きくなります。要約率のデフォルト値は0.2ですが、結果を見ながら要約の詳細さや長さに応じて、値を調整します。
完成したコード
上記のステップで作成したコードを総合すると下記のようになります。
import moviepy.editor as mp from pydub import AudioSegment import speech_recognition as sr from gensim.summarization import summarize
video_path = "example_video.mp4" video = mp.VideoFileClip(video_path)
audio_path = "temp_audio.wav" video.audio.write_audiofile(audio_path)
audio = AudioSegment.from_wav(audio_path) audio.export("temp_audio.flac", format="flac") recognizer = sr.Recognizer() with sr.AudioFile("temp_audio.flac") as source: audio_data = recognizer.record(source) text = recognizer.recognize_google(audio_data, language="ja")
summary = summarize(text, ratio=0.5)
print("書き起こしテキスト:") print(text) print("\n要約:") print(summary)
with open("summary.txt", "w") as file: file.write(summary)
以上が、Pythonで動画の書き起こしを行い、結果を要約するプログラムの作成方法です。最後にPython、プログラミングの学習に役立つUdemyのオンライン学習を紹介します。
[PR]
Excelファイルを扱う際、膨大なデータが複数のシートに収められていることがよくあります。しかし、特定のデータを必要とする場合やデータとして扱いやすくしたい場合には、シート毎に分割して保存する必要があります。Pythonを使えば、この作業を自動化することが可能です。以下では、Pythonを用いてExcelファイルをシート毎に分割して、保存する方法を説明します。
1. 必要なライブラリのインストール
まず、openpyxl
というPythonのライブラリをインストールします。これはExcelファイルを扱うためのライブラリです。
pip install openpyxl
2. Pythonコードの作成
次に、以下のPythonコードを使ってExcelファイルをシート毎に分割して保存します。
from openpyxl import load_workbook
def split_excel_sheets(input_file): wb = load_workbook(input_file) for sheet in wb.sheetnames: new_wb = Workbook() new_wb.active.title = sheet new_sheet = new_wb.active source = wb[sheet] for row in source.iter_rows(): new_sheet.append([cell.value for cell in row]) new_wb.save(f"{sheet}.xlsx")
if name == "main":
input_file = "input.xlsx"
split_excel_sheets(input_file)
このコードでは、load_workbook()
関数を使ってExcelファイルを読み込み、sheetnames
属性を使って各シートの名前を取得します。その後、各シートごとに新しいExcelファイルを作成し、元のシートのデータをそのまま新しいExcelファイルに書き込みます。
コードを実行する際は、input_file
の部分を実際のExcelファイルの名前に変更します。Excelファイルはスクリプトと同じディレクトリに保存しておきます。その後、スクリプトを実行すると、各シートが個別のExcelファイルとして保存されます。
コードの説明
2.1. ライブラリのインポート
openpyxl
からload_workbook
関数をインポートしています。これはExcelファイルを読み込むための関数です。
from openpyxl import load_workbook
2.2. 関数の定義
split_excel_sheets
という関数を定義しています。この関数は、引数としてExcelファイルのパスを受け取ります。
def split_excel_sheets(input_file):
2.3. Excelファイルの読み込みとシートの分割
load_workbook
関数を使って、指定されたExcelファイルを読み込みます。読み込んだExcelファイルの情報はwb
変数に格納されます。
wb = load_workbook(input_file)
wb.sheetnames
を使って、Excelファイル内の全てのシート名に対してループを行います。
for sheet in wb.sheetnames:
新しいExcelファイルを作成するためのWorkbook()
クラスを使って、new_wb
変数に新しいワークブックオブジェクトを作成します。
new_wb = Workbook()
新しいワークブックのアクティブなシートのタイトルを、元のExcelファイルから取得したシート名に設定します。
new_wb.active.title = sheet
new_wb
のアクティブなシートをnew_sheet
という変数に格納します。
new_sheet = new_wb.active
元のExcelファイルから指定されたシートのデータを取得し、source
変数に格納します。
source = wb[sheet]
source
から1行ずつデータを取り出し、new_sheet
に追加しています。ここではイテレータを使ってシートの全行を順に取得し、新しいシートに行を追加しています。
for row in source.iter_rows(): new_sheet.append([cell.value for cell in row])
新しいワークブックを元のシート名をファイル名として保存します。これにより、各シートが個別のExcelファイルとして保存されます。
new_wb.save(f"{sheet}.xlsx")
2.4. メインプログラムの実行
スクリプトが直接実行される場合にのみ、split_excel_sheets
関数を呼び出して処理を実行します。入力ファイル名は"input.xlsx"として指定されていますが、必要に応じて変更できます。
if name == "main":
input_file = "input.xlsx"
split_excel_sheets(input_file)
まとめ
以上がPythonを使ってExcelファイルをシート毎に分割して保存する方法です。この方法を使えば、データ分析や機械学習の前処理段階で、必要な部分だけを抽出したり処理したりすることが可能です。特に、Excelファイルに大量のデータが含まれている場合、シート毎に分割することでデータをより管理しやすくなります。特定のシートだけを処理したい場合や、シート毎に異なる処理を行いたい場合に便利です。
[PR]
Pythonを使用してPDFファイルを1ページ毎に分割する方法を紹介します。紹介する方法では、PDFファイルから個々のページを抽出し、それぞれを別々のPDFファイルとして保存します。以下に、具体的な手順とPythonコードを示します。
1. 準備
必要なライブラリPyPDF2
をインストールします。PyPDF2
は、PDFファイルの操作に必要な機能を提供します。
pip install PyPDF2
2. コードの作成
以下の様なPythonスクリプトにより、PDFファイルを1ページ毎に分割します。
import PyPDF2 import os
def split_pdf(input_pdf, output_folder):
with open(input_pdf, 'rb') as file:
pdf_reader = PyPDF2.PdfFileReader(file)
for page_num in range(pdf_reader.numPages):
pdf_writer = PyPDF2.PdfFileWriter()
pdf_writer.addPage(pdf_reader.getPage(page_num))
output_pdf = os.path.join(output_folder, f"page_{page_num + 1}.pdf")
with open(output_pdf, 'wb') as output_file:
pdf_writer.write(output_file)
split_pdf("input.pdf", "output_folder")
コードの解説
def split_pdf(input_path, output_path):
この行では、split_pdf
という関数を定義しています。この関数は、PDFファイルを入力として受け取り、それを1ページ毎に分割して新しいPDFファイルとして出力します。input_path
は入力PDFファイルのパス、output_path
は出力PDFファイルの接頭辞です。
with open(input_path, 'rb') as file:
この行では、open()
関数を使って入力PDFファイルをバイナリ読み込みモード ('rb'
) で開いています。as file
の部分は、ファイルを扱うためのファイルオブジェクトを file
という名前で参照することを意味します。
reader = PyPDF2.PdfFileReader(file)
この行では、PdfFileReader()
を使用して、開いたPDFファイルを読み込むための reader
オブジェクトを作成しています。
for page_num in range(reader.numPages):
この行では、reader.numPages
で取得したページ数分のループを行います。各ページを個別に処理するための準備です。
writer = PyPDF2.PdfFileWriter()
この行では、新しいPDFファイルを作成するための PdfFileWriter()
オブジェクトを作成しています。
writer.addPage(reader.getPage(page_num))
この行では、reader.getPage(page_num)
で取得したページを、writer
オブジェクトに追加しています。これにより、新しいPDFファイルにページが追加されます。
output_pdf = f"{output_path}page{page_num + 1}.pdf"
この行では、出力PDFファイルの名前を生成しています。各ページごとに異なる名前が付けられます。{page_num + 1}
は、1から始まるページ番号を意味します。
with open(output_pdf, 'wb') as output_file:
この行では、出力PDFファイルをバイナリ書き込みモード ('wb'
) で開いています。
writer.write(output_file)
この行では、writer
オブジェクトに追加されたページを出力ファイルに書き込みます。
以上で、PDFファイルを1ページ毎に分割して保存するコードの完成です。
3. 実行
上記スクリプトを実行し、指定したPDFファイルを1ページ毎に分割します。input.pdf
を適切なPDFファイル名に置き換え、output_folder
には分割されたページが保存されるフォルダを指定してください。
実行
input_pdf = "input_file.pdf" # 元のPDFファイルのパス output_folder = "output_folder" # 分割したPDFファイルの保存先のパス split_pdf(input_pdf, output_folder)
まとめ
以上、PythonでPDFファイルを1ページ毎に分割し保存する方法を紹介しました。この処理は非構造化データの前処理としても有用です。大規模な文書全体を一度に処理するのではなく、小さなチャンクに分割することで、処理の効率が向上します。特に、メモリや計算リソースが限られている場合に役立ちます。この方法は生成AIのRAGの構成でベクトル化するPDF文書をチャンキング(1ページ毎にチャンク)する際などにも利用できます。
[PR]
Pythonのプログラミングにおいて、よく遭遇するエラーの1つが「TypeError」です。このエラーは一般的に、異なるデータ型同士の演算や操作を行おうとしたときに発生します。ここでは、Pythonの「TypeError」エラーが発生する一般的な原因とその解決方法について解説します。
Pythonにおける型の考え方
Pythonは動的型付け言語です。つまり、変数の宣言時に型を指定する必要がなく、値に応じて動的に型が決定されます。このため、同じ変数に異なる型の値を代入することが可能です。変数の型宣言が不要であり、実装が簡潔で柔軟性が高くなる一方、注意をしないと実行時に型エラー(TypeError)が発生しやすい傾向があります。一方Javaなどの厳格な静的型付けの言語では、コンパイル時に型の整合性がチェックされるため、このような型エラーが発生しにくい傾向があります。
不適切なデータ型の演算
よくあるミスの1つは、異なるデータ型の変数やオブジェクトを演算しようとすることです。
num = 10 text = "Hello" result = num + text
このように数値と文字列を足し算しようとすると以下のようなTypeErrorが発生します。
Traceback (most recent call last): File "example.py", line 3, in result = num + text # TypeError: unsupported operand type(s) for +: 'int' and 'str' TypeError: unsupported operand type(s) for +: 'int' and 'str'
エラーの内容は、「+演算子に対して整数型 (int
) と文字列型 (str
) のオペランドの組み合わせがサポートされていない」というものです。整数型と文字列型のデータ型は異なるため、直接的に足し算することができません。このエラーは、異なるデータ型同士の演算を試みた場合に発生します。
この場合、num
とtext
は異なるデータ型なので、+
演算子で足し算を行うことができません。解決するには、データ型を揃えるか、適切な方法で変換する必要があります。 例えば、例のように文字列と整数を結合するためには、整数を文字列に変換し、「」という文字列として扱う方法があります。修正するには、str()
を使って整数型のnum
を文字列型に変換し、それらを結合します。以下は修正したコードです。
num = 10 text = "Hello" result = str(num) + text print(result)
このように修正することで「10」は文字列として扱われ、出力は「10Hello」となります。
リストや辞書の誤った操作
リストや辞書などのコレクションを操作する際に、適切なメソッドや操作子を使わないとTypeErrorが発生することがあります。
my_list = [1, 2, 3, 4, 5] index = "2" value = my_list[index]
この例では、index
が文字列型であるため、リストの要素を取得する際に下記のようなエラーが発生します。
Traceback (most recent call last): File "example.py", line 3, in value = my_list[index] # TypeError: list indices must be integers or slices, not str TypeError: list indices must be integers or slices, not str
エラーの内容は、「リストのインデックスは整数またはスライスでなければならない」というものです。リストの要素にアクセスする際に、文字列型 (str
) のインデックスを使おうとしたためにエラーが発生しました。リストのインデックスは整数でなければならないため、文字列型を使うことはできません。正しいインデックスの型を使うか、適切な方法で変換する必要があります。 このエラーを修正するためには、シンプルにインデックスとして整数値を利用すれば問題ありません。文字列型の "2"
ではなく、整数型の 2
を使用します。修正したコードは以下のようになります。
my_list = [1, 2, 3, 4, 5] index = 2 value = my_list[index] print(value)
これにより、リスト my_list
のインデックス 2
の要素が取得され、value
に格納されます。
関数の引数の型不一致
関数を呼び出す際に、その関数が想定している型と異なる型の引数を渡すとTypeErrorが発生します。
def add_numbers(a, b): return a + b
result = add_numbers("10", 20)
このコードを実行すると、以下のようなエラーが表示されます。
Traceback (most recent call last): File "example.py", line 4, in result = add_numbers("10", 20) # TypeError: can only concatenate str (not "int") to str File "example.py", line 2, in add_numbers return a + b TypeError: can only concatenate str (not "int") to str
エラーの内容は、「文字列型 (str
) に整数型 (int
) を連結できません」というものです。関数 add_numbers
の引数 a
は文字列型であり、引数 b
は整数型であるため、これらを直接的に連結することはできません。このエラーを修正するには、関数 add_numbers
の引数 a
と b
のデータ型を一致させる必要があります。具体的には、引数 a
のデータ型を整数型に変換するか、引数 b
のデータ型を文字列型に変換します。
この関数のケースでは、add_numbers()
という名前から整数型の足し算を想定して関数と考えられますので、単にadd_numbers(10, 20)
と実行すれば問題ありません。
型エラーを防ぐ工夫: 型ヒントの利用
Pythonは動的型付け言語であり、関数の利用時に型エラーに注意する必要があります。特に複数人で開発を行う際には、他の人が作った関数がどの型の引数を要求しているのか分かりづらい場合があります。このようなケースで、Pythonでは関数の引数に対して型の制約を設定することができます。これはPython 3.5以降で導入された型ヒントと呼ばれる機能です。具体的には、引数の型をアノテーションすることで、関数の引数の型を制限できます。
以下は、上記のadd_numbers
関数に対して引数の型を制限する方法です。
def add_numbers(a: int, b: int) -> int: return a + b
result = add_numbers(10, 20) print(result)
このように、関数の引数 a
と b
の型を int
としてアノテーションすることで、コードを読む人が関数やメソッドの引数や戻り値の型を把握しやすくなります。特に大規模なプロジェクトや複雑なコードベースでは、これが非常に重要です。型ヒントによって、コードの理解やメンテナンスが容易になります。
また、IDEやエディタの静的解析ツールや型チェッカーがエラーを検出できるようになるため、開発中に型エラーを早期に発見しやすくなります。これにより、型の不整合によるエラーを事前に防ぐことができます。
ただし、型ヒントは実行時には無視されるため、実際には型の強制は行われません。したがって、型ヒントは主にドキュメントやコードの読みやすさ、静的解析ツールや型チェッカーのサポートのために使用されます。
[PR] 学習・データ分析のオンライン学習
Pythonを使ってコードを書いている際に遭遇することが多いエラーの一つに、「SyntaxError: invalid syntax(構文エラー: 無効な構文)」があります。このエラーは、Pythonが提供されたコードを理解できない場合に発生します。この記事では、このSyntaxError(シンタックスエラー)の原因と解決方法について詳しく解説します。
PythonのSyntaxError(構文エラー)とは
"Syntax"は、ある言語や形式体系における文法規則や構文規則を指します。言語や形式体系がどのように構造化されるべきかを定義し、それに基づいて文や式がどのように書かれるべきかを決める規則のことです。
PythonのSyntaxErrorは、Pythonのコードが構文的に正しくない場合に発生するエラーです。つまり、Pythonの文法規則に違反している部分がある場合に表示されます。たとえば、括弧が閉じられていない、コロンが不足している、インデントが正しくないなどの場合にSyntaxErrorが発生します。
よくあるミスと確認ポイント
カッコやクォートの閉じ忘れ
よくあるのは、カッコやクォートの不足や過剰などのSyntaxErrorです。たとえば、次のような場合にエラーが発生します。この場合、ダブルクォート(")が閉じられていないためエラーが発生します。
print("Hello World)
カッコの開きと閉じが一致しない場合にも、構文エラーが発生します。
if x > 5: print("xは5より大きい"
閉じ忘れ(不足)だけでなく、カッコやクォートが余分にある状態でもSyntaxErrorが発生します。
if x > 5: print("xは5より大きい"))
予約語や関数名の誤り
Pythonの予約語や関数名を誤って使用するとエラーが発生します。たとえば、以下のコードではclass
という関数を定義していますが、class
はpythonの予約後として既に定義されていますのでエラーが発生します。
def class(): pass
また、予約後の他に組み込み関数や標準ライブラリの関数名を誤って変数名として使用すると、構文エラーが発生します。以下の場合はprint()
が組み込み関数ですのでエラーが発生します。
def print(message): print("Message:", message)
文字エンコーディングの問題
コード内に非ASCII文字や特殊文字が含まれている場合、ファイルの文字エンコーディングが正しく設定されていないとエラーが発生する場合があります。
print("こんにちは")
この場合、ファイルの冒頭に正しい文字エンコーディングを示すコメントが必要になる場合があります。Pythonの新しいバージョンでは、通常、文字コード宣言 (# -*- coding: utf-8 -*-
) は必須ではありません。特にPython 3では、UTF-8がデフォルトのソースコードエンコーディングとして扱われるため、通常はコード内にこの宣言を含める必要はありません。
ただし、一部の環境やツールセットでは、UTF-8以外のエンコーディングがデフォルトとして設定されている場合があります。そのような場合、日本語などの非ASCII文字を含むコードを正しく処理するために、# -*- coding: utf-8 -*-
の宣言が必要になることがあります。また、古いPython 2.x系のコードや、特定の特殊な環境で作業する場合には、文字コード宣言を使用する必要がある場合があります。
Pythonバージョンの非互換性
使用しているPythonのバージョンによって、サポートされている構文が異なる場合があります。特に、Python 2とPython 3では一部の構文が異なるため、コードが正しく解釈されない可能性があります。
print "Hello World"
print("Hello World")
上記の例では、Python 2では構文エラーが発生します。
コメントアウトの問題
コメントアウトの記述が正しくない場合、コードが正しく解釈されないことがあります。特に、コメントアウト内に特殊な文字列や不適切な記号が含まれている場合に問題が発生します。
上記の例では、シングルクォートがエスケープされていないため、エラーが発生します。このようにエスケープして書きましょう。
改行文字の扱い
改行文字の扱いが不適切な場合にも、エラーが発生することがあります。特に、コードの最後に余分な改行文字が含まれている場合に問題が発生します。
print("Hello World")\n
上記の例では、\n
が余分な改行文字と見なされ、エラーが発生します。Pythonでは、プリントされた後に自動的に改行が挿入されるため、明示的に改行文字を追加する必要はありません。しかし、 改行を明示したい場合は、print()
関数にend
パラメータを使用して改行文字を指定します。以下はその方法です。
print("Hello World", end="\n")
end
パラメータには、デフォルトで\n
が設定されています。そのため、明示的に指定しなくても改行が挿入されます。しかし、改行以外の文字を末尾に追加したい場合には、end
パラメータを使用して追加の文字列を指定します。
不正な演算子の使用
不正な演算子の使用も構文エラーを引き起こす可能性があります。
x = 10 if x = 10: print("x is 10")
上記の例では、等号を比較演算子として使用しているため、構文エラーが発生します。 この問題を修正するには、等号の代わりに比較演算子を使用する必要があります。
x = 10 if x == 10: print("x is 10")
修正されたコードでは、if
文の中で代入演算子の=
ではなく、比較演算子の==
を使用しています。これにより、条件文が正しく評価され、構文エラーが解消されます。
[参考] インデントのエラー(IndentationError)
SyntaxErrorではありませんが、よくある構文エラーとしてインデントのエラー(IndentationError)があります。Pythonではインデント(字下げ)がコードのブロック構造を示すため、適切なインデントが必要です。インデントが不足していたり、過剰であったりするとエラーが発生します。
インデントの不一致
def my_function(): print("This is my function")
このコードでは、関数の本体(print
文)が適切なインデントで始まっていません。そのため、Pythonはインデントが不適切だというエラーを示します。エラーメッセージは次のようになります:
File "example.py", line 2 print("This is my function") ^ IndentationError: expected an indented block
インデントの混在
インデントにタブとスペースの混在がある場合にも、構文エラーが発生する可能性があります。
def my_function(): print("Hello") print("World")
SyntaxErrorを発生させないために
SyntaxErrorを防ぐためには、適切なインデント、改行を意識した視認性の高いコードを書くことを普段から心がけることが重要です。また、多くのエディタやIDEは、構文エラーを見つけるための機能を備えています。これらの機能を活用して、エラーをコードを書いている段階で、特定し修正することができます。
[PR]
Pythonのデータ分析ライブラリであるPandasは、多くのデータサイエンティストやエンジニアにとって欠かせないツールです。ここでは、Pandasを効果的に活用するためのチートシートを作成しましたので紹介します。体が覚えるまでブックマークして利用してみて下さい。
データの読み込みと表示
色々なファイルやデータソースからデータを読み込む
CSVファイルからデータを読み込む
import pandas as pd
df = pd.read_csv('data.csv')
Microsoft Excelファイル(.xlsや.xlsx)を読み込み
df = pd.read_excel('data.xlsx')
JSON形式のファイルを読み込み
df = pd.read_json('data.json')
SQLクエリの結果をデータフレームとして読み込み(例: SQLite)
import sqlite3 conn = sqlite3.connect('database.db') query = "SELECT * FROM table_name" df = pd.read_sql(query, conn)
HTMLファイルからテーブル要素を抽出してデータフレームとして読み込み
dfs = pd.read_html('data.html') df = dfs[0]
クリップボードからデータを読み込み
Excelなどの表形式のデータをコピーしておいて、Pythonコード内で読み込むことができます。
df = pd.read_clipboard()
読み込みの際の条件を指定する
sep/delimiter : 列を区切るための文字列や正規表現を指定
df = pd.read_csv('data.csv', sep='\t')
header : ヘッダーがあるかどうかを指定
df = pd.read_csv('data.csv', header=0)
df = pd.read_csv('data.csv', header=None)
names : 読み込む列名を指定
df = pd.read_csv('data.csv', names=['col1', 'col2', 'col3'])
index_col : 行のインデックスにする列を指定
df = pd.read_csv('data.csv', index_col='ID')
usecols : 読み込む列を指定
df = pd.read_csv('data.csv', usecols=['col1', 'col2'])
dtype : 列ごとのデータ型を指定
df = pd.read_csv('data.csv', dtype={'col1': int, 'col2': str})
parse_dates : 日付をパースする列のリストまたは辞書を指定
df = pd.read_csv('data.csv', parse_dates=['date_column'])
encoding : ファイルのエンコーディングを指定
df = pd.read_csv('data.csv', encoding='utf-8')
skiprows/skipfooter : 読み込み時にスキップする行数を指定
df = pd.read_csv('data.csv', skiprows=3)
df = pd.read_csv('data.csv', skipfooter=2)
na_values : 欠損値として扱う値を指定
df = pd.read_csv('data.csv', na_values=['NA', 'N/A', '-'])
データの表示
基本的なデータの表示方法
import pandas as pd
df = pd.read_csv('data.csv')
print(df.head())
print(df.head(10))
print(df.tail(10))
print(df.sample(n=5))
print(df['column_name'])
print(df[df['column_name'] > value])
属性(アトリビュート)を利用した表示方法
iloc
とloc
は、Pandasのデータフレームやシリーズからデータを選択するための属性(attribute)です。これらを使用することで、行や列をインデックスやラベルを使って選択することができます。
iloc
: 行と列のインデックスを使用してデータにアクセスloc
: 行と列のラベルを使用してデータにアクセス
print(df.iloc[0:5, 0:3])
print(df.loc[:, ['column1', 'column2']])
pandasデータ処理ドリル Pythonによるデータサイエンスの腕試し [ 株式会社ビープラウド ]
データの基本統計量の確認
データの統計量の概要を確認する
info()
とdescribe()
は、Pandasのデータフレームやシリーズに対して使用できる基本的な統計情報を提供するメソッドです。
info()
info()
メソッドは、データフレームやシリーズの基本的な情報を要約して表示します。
- データ型(dtype): 各列のデータ型を表示します。
- 非欠損値の数(Non-Null Count): 各列において欠損値ではない要素の数を表示します。
- 列の名前: データフレームの各列の名前を表示します。
- 行数: データフレームの行数を表示します。
info()
メソッドは、各列に含まれるデータの型や欠損値の有無、データの行数など、データセット全体の概要を素早く把握するのに役立ちます。
describe()
describe()
メソッドは、データの要約統計量を提供します。
- count: 非欠損値の数を表示します。
- mean: 平均値を表示します。
- std: 標準偏差を表示します。
- min: 最小値を表示します。
- 25%、50%、75%: データの四分位数を表示します。25%は第一四分位数(Q1)、50%は中央値(第二四分位数、中央値)、75%は第三四分位数(Q3)です。
- max: 最大値を表示します。
describe()
メソッドは、データの分布や範囲に関する情報を提供します。これにより、データの特徴を把握し、データセット全体の傾向や異常値を素早く確認することができます。
print(df.info())
print(df.describe())
特定の統計量を表示
mean() : 列の平均値を計算
df.mean()
median() : 列の中央値を計算
df.median()
std() : 列の標準偏差を計算
df.std()
var() : 列の分散を計算
df.var()
sum() : 列の合計を計算
df.sum()
count() : 各列の非欠損値の数を計算
df.count()
min() : 列の最小値を計算
df.min()
max() : 列の最大値を計算
df.max()
quantile() : 列のパーセンタイルを計算 / q
パラメータにパーセンタイルを指定(0〜1の範囲)
df.quantile(q=0.25)
corr() : 列間の相関係数を計算
df.corr()
cov() : 列間の共分散を計算
df.cov()
データの選択とフィルタリング
特定の列の選択
selected_columns = ['column1', 'column2'] print(df[selected_columns])
ブールインデックスング
ブールインデックスングを使用して、条件に合致する行を選択します。
selected_rows = df[df['column'] > value]
query()メソッド
query()
メソッドを使用して、SQLライクな構文を使用してデータをフィルタリングできます。
selected_rows = df.query('column > @value')
locおよびilocアクセサ
loc
およびiloc
アクセサを使用して、ラベルまたは位置を使用して行や列を選択します。
selected_data = df.loc[row_labels, column_labels]
selected_data = df.iloc[row_indices, column_indices]
atおよびiatアクセサ
at
およびiat
アクセサを使用して、ラベルまたは位置を使用して単一の要素を選択します。
value = df.at[row_label, column_label]
value = df.iat[row_index, column_index]
データのソートとグルーピング
データソート
sort_values()
メソッドを使用して、特定の列または複数の列に基づいてデータをソートします。デフォルトでは昇順にソートされますが、ascending=False
を指定することで降順にソートすることもできます。
sorted_data = df.sort_values(by='column_name')
sorted_data = df.sort_values(by=['column1', 'column2'])
sorted_data = df.sort_values(by='column_name', ascending=False)
インデックスソート
sort_index()
メソッドを使用して、行や列のインデックスに基づいてデータをソートします。デフォルトでは昇順にソートされますが、ascending=False
を指定することで降順にソートすることもできます。
sorted_data = df.sort_index()
sorted_data = df.sort_index(axis=1)
sorted_data = df.sort_index(ascending=False)
グループ化
groupby()
メソッドを使用して、特定の列の値に基づいてデータをグループ化します。その後、グループごとに集計や操作を行うことができます。
grouped_data = df.groupby('column_name').mean()
grouped_data = df.groupby(['column1', 'column2']).sum()
欠損値の処理
欠損値を指定した値で置き換え
fillna()
メソッドを使用して、欠損値を指定した値で置き換えることができます。
df.fillna(value, inplace=True)
欠損値を含む行や列を削除
dropna()
メソッドを使用して、欠損値を含む行や列を削除することができます。
df.dropna(inplace=True)
df.dropna(axis=1, inplace=True)
欠損値を近くの値を使用して補間
interpolate()
メソッドを使用して、欠損値を近くの値を使用して補間することができます。
df.interpolate(inplace=True)
前方または後方の値で補完
ffill()
メソッド(forward fill)とbfill()
メソッド(backward fill)を使用して、欠損値をそれぞれ前方または後方の値で補完することができます。
df.ffill(inplace=True)
df.bfill(inplace=True)
データの結合
シンプルな列の結合
df['new_column'] = df['column1'] + df['column2']
複数のデータフレームを結合
merge()
メソッドを使用して、複数のデータフレームを結合します。
merged_df = pd.merge(df1, df2, on='common_column')
merged_df = pd.merge(df1, df2, left_on='column1', right_on='column2')
merged_df = pd.merge(df1, df2, left_index=True, right_index=True)
データフレームを縦または横に連結
concat()
関数を使用して、データフレームを縦または横に連結することができます。axis
パラメータを使用して、連結の方向を指定します。
concatenated_df = pd.concat([df1, df2], axis=0)
concatenated_df = pd.concat([df1, df2], axis=1)
インデックスに基づいて結合
join()
メソッドを使用して、インデックスに基づいてデータフレームを結合することができます。
joined_df = df1.join(df2, how='inner')
別のデータフレームを行として追加
append()
メソッドを使用して、データフレームに別のデータフレームを行として追加することができます。
appended_df = df1.append(df2)
時系列データの結合
merge_asof()
メソッドを使用して、時系列データの結合を行うことができます。このメソッドは、2つのデータフレームを時系列に基づいて結合し、最も近い時刻に合わせて結合します。
merged_df = pd.merge_asof(df1, df2, on='time_column')
以上がPandasのチートシートです。定期的にメンテナンスしたいと思いますので、他によく使う手法がありましたら是非教えて下さい。
最後にPythonの学習に利用できるUdemy のサイトを紹介します。ぜひ活用ください。
[PR]
APIの動きをテストする際にPostmanなどのGUIツールがよく利用されますが、Pythonを利用して短いコードで簡単にAPIをテストすることが可能です。この記事では、Pythonを使ってAPIを簡単にテストする方法を解説します。様々な具体的なケースとそれに応じた具体的なコードを提示します。
事前準備: ライブラリのインストール
最初に、APIテストに使用するライブラリをインストールします。Pythonにはrequests
やunittest
など、APIテストに便利なライブラリが多数ありますが、ここではrequests
を使用します。
pip install requests
基本的なGETリクエストのテスト
最初に、GETリクエストを送信してAPIの応答を確認する一番基本的な基本的な方法を示します。url
にテストしたいAPIのURLを指定します。requests
のget
メソッドを利用してリクエストを送信します。帰ってきたレスポンスはJSON形式で表示します。一時的なテストでは「ステータスコードの確認」はなくても問題ありません。
import requests
url = 'https://api.example.com/data' response = requests.get(url)
assert response.status_code == 200
print(response.json())
Python×APIで動かして学ぶ AI活用プログラミング [ 下山輝昌 ]
パラメータ付きGETリクエストのテスト
パラメータを含むGETリクエストを送信する場合、次のようにします。先ほどの基本的なGETのリクエストに加え、get
メソッドで渡したいパラメータを送信します。
import requests
url = 'https://api.example.com/data' params = {'param1': 'value1', 'param2': 'value2'} response = requests.get(url, params=params)
assert response.status_code == 200
print(response.json())
POSTリクエストのテスト
POSTリクエストを送信してデータをAPIに送信し、応答を確認します。GETのサイト基本的な流れは同じです。post
メソッドを利用してリクエストを送信します。ステータスコードの確認を行う際は一般的に201になることに留意します。
import requests
url = 'https://api.example.com/data' data = {'key': 'value'} response = requests.post(url, json=data)
assert response.status_code == 201
print(response.json())
APIデザイン・パターン (Compass Booksシリーズ) [ JJ Geewax ]
この他のTips
上記な基本的なAPIをテストに工夫を加えることでより多様なケースに対応することができます。以下に幾つかのTipsを紹介します。
セッションの再利用
requests.Session
オブジェクトを使用してセッションを開始し、同じセッションを再利用することで、複数のリクエストでの接続コストを削減し、パフォーマンスを向上させることができます。
import requests
session = requests.Session()
response1 = session.get('https://api.example.com/data1') response2 = session.get('https://api.example.com/data2')
タイムアウトの設定
timeout
パラメータを使用して、リクエストのタイムアウト時間を設定することができます。これにより、サーバーが応答しない場合や接続が遅い場合に、無限にブロックされることを防ぐことができます。
import requests
response = requests.get('https://api.example.com/data', timeout=5)
エラーハンドリング
リクエストが失敗した場合のエラーハンドリングを行うことが重要です。response.raise_for_status()
メソッドを使用すると、リクエストが失敗した場合にHTTPErrorを発生させることができます。
import requests
try:
response = requests.get('https://api.example.com/data')
response.raise_for_status()
except requests.exceptions.HTTPError as err:
print(err)
まとめ
Pythonを使ってAPIをテストする基本的な方法を理解しました。様々なシナリオに応じて、これらの例をカスタマイズして利用してください。PythonではGUIツールに比べて柔軟に条件を設定することが可能です。また、繰り返し使い、慣れれば、GUIツールよりも手早くテストすることが可能です。
[PR]