ChatGPTにデコレーターを利用した処理時間計測Pythonコードを書いてもらった

ChatGPTにデコレーターを利用した処理時間計測Pythonコードを書いてもらいました。

 

指示分(プロンプト):

デコレーターを用いてpythonコードの実行時間を計測したいです。計測するコードへの変更は極力抑えたいので、デコレーターを外部化する形にしてください。サンプルコードを提示してください。

 

回答:

デコレーターを外部モジュールに定義し、必要なコードに適用することができます。以下は、外部モジュールとしてデコレーターを定義する方法の例です。

timer.pyというファイルを作成し、以下のようにtimerデコレーターを定義します。


import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"実行時間: {end_time - start_time}秒")
        return result
    return wrapper
    

このファイルをインポートして、デコレーターを適用するコードに@timerをつけます。


from timer import timer

@timer
def my_function():
    # ここに計測したいコードを記述します
    pass

# my_functionを呼び出すと、実行時間が出力されます
my_function()
    

この方法を使用すると、デコレーターのコードを別ファイルに分離することができます。また、timer.pyファイルを必要なプロジェクトのディレクトリに配置することで、複数のプロジェクトで再利用できるようになります。

結果:

以下のように成功しました。



ChatGPTに最大公約数と最小公倍数を求めるPythonコードを書いてもらった

ChatGPTに最大公約数と最小公倍数を求めるPythonコードを書いてもらいました。

世界最古のアルゴリズムとして知られている「ユークリッドの互除法」を使う有名な問題です。

 

指示文(プロンプト):

任意の2つの自然数の最大公約数と最小公倍数を求めるpythonコードを示してください。2つの自然数は変数として定義できるようにしてください。計算結果をprintするようにしてください。

 

回答:

以下は、ユークリッドの互除法を使った2つの自然数の最大公約数と最小公倍数を求めるPythonコードです。変数として定義された2つの自然数は、それぞれ「a」と「b」として扱われます。


def gcd(a, b):
    """
    2つの自然数aとbの最大公約数を返す。
    """
    while b != 0:
        a, b = b, a % b
    return a

def lcm(a, b):
    """
    2つの自然数aとbの最小公倍数を返す。
    """
    return a * b // gcd(a, b)

# 2つの自然数を変数として定義する
num1 = 36
num2 = 48

# 最大公約数を求め、結果を出力する
result_gcd = gcd(num1, num2)
print(f"{num1}と{num2}の最大公約数は{result_gcd}です。")

# 最小公倍数を求め、結果を出力する
result_lcm = lcm(num1, num2)
print(f"{num1}と{num2}の最小公倍数は{result_lcm}です。")
    

このコードでは、2つの自然数「num1」と「num2」を変数として定義し、それぞれ36と48に設定されています。最大公約数を計算するために、関数gcdを呼び出し、num1とnum2を引数として渡します。同様に、最小公倍数を計算するために、関数lcmを呼び出し、num1とnum2を引数として渡します。計算結果は、print文を使って出力されます。

結果:

自然数は 2832 と 3776 としました。最大公約数は944、最小公倍数は11328が正解です。以下のように成功しました。

 

ChatGPTにPDFからテキストを取り出すPythonコードを書いてもらった

ChatGPTにPDFからテキストを取り出すPythonコードを書いてもらいました。

大量のPDFから特定の情報だけを抽出してデータベース化したいシーンを想定です。

 

指示文(プロンプト):

PDFの中身を取得してテキストファイルに出力するPythonコードを提示してください。

回答:

PythonでPDFの中身を取得してテキストファイルに出力するコードは、PDFを操作するライブラリを利用する必要があります。PDFを操作するライブラリには、PDFMiner, PyPDF2, ReportLabなどがありますが、日本語テキストに対応しているのはPDFMinerです。

PDFMinerを使うには、まずインストールする必要があります。コマンドプロンプトやターミナルで以下のコマンドを実行してください。

pip install pdfminer.six

インストールが完了したら、以下のコードを参考にしてください。このコードは、sample.pdfというファイルからテキストを抽出して、output.txtというファイルに出力します。


# pdfminerモジュールをインポート
from pdfminer.high_level import extract_text

# テキストを抽出したいpdfファイルのパス
pdf_path = "sample.pdf"

# pdfファイルからテキストを抽出
text = extract_text(pdf_path)

# テキストを出力したいテキストファイルのパス
txt_path = "output.txt"

# テキストファイルにテキストを書き込む
with open(txt_path, "w", encoding="utf-8") as f:
    f.write(text)
    
結果:

以下のように成功しました。テスト用に、トヨタのIR資料のPDFを拝借しました。

四半期報告書 2022年12月第3四半期 (global.toyota)

出力後のテキスト:

 

ChatGPTに、複数のフォルダに格納されているExcelファイルを読み込んで指定データを集約して出力するPythonコードを書いてもらった

ChatGPTに、複数のフォルダに格納されているExcelファイルを読み込んで指定データを集約して出力するPythonコードを書いてもらいました。

数千~数万のエクセルファイルから特定の列の値だけを取り出して、合計したり、リストにして取り出したい時などを想定してます。

例 : 

.
├── data
│   ├── list1.xlsx
│   ├── list2.xlsx
│   └── sub
│       └── list3.xlsx
└── excel_marge.py

上記のようなフォルダとファイルの構成で、excel_marge.py を実行すると、dataフォルダ以下のexcelすべてを読み込んで集約する、というものです。list3.xlsxだけは、dataフォルダから、もう一階層下のsubフォルダにあります。

 

指示文(プロンプト):

指定したフォルダ内にあるすべてのexcelファイルから、指定した情報を取得して最後にcsvにまとめて出力するPythonコードを書いてください。サブフォルダも対象としてください。取得する情報は、シート名と列名を指定できるようにしてください。

回答:

以下は、指定されたフォルダとサブフォルダ内にあるすべてのExcelファイルから指定した情報を取得し、最後にまとめて出力するPythonコードの例です。取得する情報は、シート名と列名を指定できるようにしています。


import os
import pandas as pd

def get_data_from_excel(folder_path, sheet_name, column_name):

    data = []
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            if file.endswith('.xlsx') or file.endswith('.xls'):
                file_path = os.path.join(root, file)
                try:
                    df = pd.read_excel(file_path, sheet_name=sheet_name)
                except ValueError:
                    print(f'Warning: Sheet "{sheet_name}" not found in file "{file_path}"')
                    continue
                if column_name not in df.columns:
                    print(f'Warning: Column "{column_name}" not found in file "{file_path}"')
                    continue
                data.append(df[column_name])
    if len(data) == 0:
        raise ValueError('No data found in the specified folder.')
    return pd.concat(data)


# 使用例
folder_path = '/****/data'
sheet_name = 'sheet1'
column_name = 'number_a'
result_df = get_data_from_excel(folder_path, sheet_name, column_name)
result_df.to_csv('result.csv', index=False)

    

上記のコードでは、osモジュールを使用して指定されたフォルダ内にあるExcelファイルを探索し、pandasモジュールを使用してデータを読み取ります。取得した情報は、指定された列名が含まれる場合に限り、リストに追加されます。最後に、すべての情報が含まれるDataFrameが作成され、CSVファイルに出力されます。

パラメーターは以下の通りです。
folder_path (str): フォルダのパス。
sheet_name (str): 取得するシート名。
column_name (str): 取得する列名。

結果:

以下のように成功しました。テスト用に用意した3つのエクセルファイルのシート名「sheet1」のカラム「number_a」をすべて集約したcsvが生成されてます。

 

ChatGPTにパワーポイントからテキストと画像を取り出すPythonコードを書いてもらった

ChatGPTにパワーポイントからテキストと画像を取り出すPythonコードを書いてもらいました。PythonからPowerPointを操作するには「python-pptx」という外部ライブラリを使うのが定番なので、事前にインストール済みです。

 

指示文(プロンプト):

パワーポイントの内容にあるテキストと画像を取り出すPythonコードを書いて下さい。複数のスライドに画像がある場合は、保存する画像ファイル名をimage_[連番]というようにしてください。パワポから取り出した画像をすぐ確認したいので、display()関数でjupyter norebookの同じセル内に表示するようしてください。画像の表示サイズは幅300ピクセル、縦200ピクセルに縮小するようにしてください。

 

回答:

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE_TYPE
from IPython.display import display, Image

# PowerPointファイルを読み込む
prs = Presentation('test2.pptx')

# スライドごとにループする
for i, slide in enumerate(prs.slides):
    # スライド内のすべてのオブジェクトにループする
    for shape in slide.shapes:
        # 形状が画像であるかどうかを確認する
        if shape.shape_type == MSO_SHAPE_TYPE.PICTURE:
            image = shape.image
            # 画像を縮小して表示する
            display(Image(data=image.blob, width=300, height=200))
        # 形状がテキストボックスであるかどうかを確認する
        elif shape.has_text_frame:
            text_frame = shape.text_frame
            # テキストフレームのテキストを抽出する
            text = text_frame.text
            print(text)    
結果:

以下のように成功しました。プロンプトの最後の指示は、jupyter norebookで確認したいので追加したものです。普通のpythonプログラムとして実行する場合は不要ですね。

テスト用のパワポgoogleドライブで作成している様子:

テスト用のパワポを読み込んだ結果画面:

ChatGPTにUbuntuでインターネット速度計測する方法を教えてもらった

ChatGPTにUbuntuでインターネット速度計測する方法を教えてもらいました。

よく使うのはグーグルのSpeed test ですが、ブラウザを開かずターミナルから計測する方法と、Pythonで計測する方法です。

 

指示文(プロンプト):

UbuntuコマンドラインもしくはPythonから、インターネット接続の速度計測を行う方法を教えてください。

 

回答1:

Ubuntuコマンドラインから、インターネット接続の速度計測を行うには、speedtest-cliというツールを使用することができます。

以下の手順でインストールと使用方法を説明します。

 

1. speedtest-cliをインストールする

sudo apt-get install speedtest-cli

2. speedtest-cliを実行する

$ speedtest-cli

これにより、現在のインターネット接続速度が測定されます。結果には、ダウンロード速度、アップロード速度、およびピング(応答時間)が表示されます。

回答2:

もう1つの方法は、Pythonを使用してインターネット接続速度を測定することです。これには、speedtest-cliライブラリをインストールする必要があります。

以下の手順でインストールと使用方法を説明します。

1. speedtest-cliライブラリをインストールする

pip install speedtest-cli

2. Pythonスクリプトを作成する


import speedtest

st = speedtest.Speedtest()
download_speed = st.download() / 10**6  # Mbps
upload_speed = st.upload() / 10**6  # Mbps
ping = st.results.ping  # ms

print(f"Download speed: {download_speed:.2f} Mbps")
print(f"Upload speed: {upload_speed:.2f} Mbps")
print(f"Ping: {ping:.2f} ms")

これにより、現在のインターネット接続速度が測定されます。結果には、ダウンロード速度、アップロード速度、およびピング(応答時間)が表示されます。

結果:

以下のように成功しました。ココマンドは「speedtest-cli」でも「speedtest」としても通りますね。

コマンドでの結果:


Pythonでの結果:

ChatGPTにタイムラプス動画用のコンバータ(静止画←→動画)を作ってもらった

ChatGPTにタイムラプス動画用のコンバータ(静止画←→動画)を作ってもらいました。

複数の静止画から動画を生成する場合と、逆に動画から静止画を連番で取り出すコードの2種類です。

 

指示文(プロンプト)1:

複数の静止画像からタイムラプス動画を生成するpythonプログラムを提示してください。MoviePyを利用してください。動画のサイズ(縦、横)、フレームレートも指定できるようにしてください。読み込む静止画像のフォルダも指定できるようにしてください。

 

回答:

以下は、指定されたフォルダ内の静止画像からタイムラプス動画を生成するPythonプログラムです。必要に応じて動画のサイズやフレームレートを指定できます。


from moviepy.editor import ImageSequenceClip

def create_timelapse(image_folder, output_path, size=(640, 360), fps=24):
    # Load the images from the folder
    image_files = sorted(os.listdir(image_folder))
    images = [os.path.join(image_folder, f) for f in image_files if f.endswith(".png")]

    # Create the image sequence clip
    clip = ImageSequenceClip(images, fps=fps)

    # Resize the clip to the specified size
    clip = clip.resize(size)

    # Write the clip to a video file
    clip.write_videofile(output_path)

# Example usage:
image_folder = "path/to/image/folder"
output_path = "path/to/output/video.mp4"
size = (640, 360)
fps = 24
create_timelapse(image_folder, output_path, size, fps)

    

このプログラムでは、ImageSequenceClipを使用して静止画像のシーケンスを読み込みます。その後、resizeメソッドを使用して動画のサイズを変更し、write_videofileメソッドを使用して出力ファイルに書き込みます。

結果:

下記のように成功しました。素材は下記のサイトから借りてます。
タイムラプスモードで夜明けから夕暮れまで · 無料の動画素材 (pexels.com)

 

 

指示文(プロンプト)2:

動画から連続した静止画像を生成するpythonプログラムを提示してください。MoviePyを利用してください。動画のサイズ(縦、横)、フレームレートも指定できるようにしてください。

 

回答:

以下は、MoviePyを使用して動画から静止画像を生成するPythonプログラムの例です。このプログラムは、指定された動画ファイルから指定された数のフレームを取得し、それらのフレームを静止画像として保存します。


from moviepy.editor import VideoFileClip
from PIL import Image

def extract_frames(video_path, num_frames, output_path, size=(640, 360), fps=24):
    # Load the video clip
    clip = VideoFileClip(video_path)

    # Resize the clip to the specified size
    clip = clip.resize(size)

    # Set the frame rate of the clip
    clip = clip.set_fps(fps)

    # Iterate over the frames and extract them
    for i, frame in enumerate(clip.iter_frames()):
        if i >= num_frames:
            break
        output_file = f"{output_path}/frame_{i:05d}.png"
        frame_image = Image.fromarray(frame)
        frame_image.save(output_file)

    # Close the clip
    clip.close()

# Example usage:
video_path = "path/to/video.mp4"
num_frames = 10
output_path = "path/to/output/folder"
size = (640, 360)
fps = 24
extract_frames(video_path, num_frames, output_path, size, fps)
    

このプログラムでは、VideoFileClipを使用して指定された動画ファイルを読み込み、resizeおよびset_fpsを使用して、指定されたサイズとフレームレートにリサイズおよび変換します。その後、iter_framesを使用してフレームに反復処理し、Image.fromarrayを使用してNumPy配列をPIL画像に変換し、saveを使用して静止画像として保存します。
このプログラムを使用する場合は、video_path、num_frames、output_path、size、fpsを指定する必要があります。 video_pathは、変換する動画ファイルのパスを指定します。num_framesは、取得するフレーム数を指定します。 output_pathは、生成された静止画像を保存するフォルダのパスを指定します。sizeは、出力画像のサイズを指定します。 fpsは、出力画像のフレームレートを指定します。

結果:

成功しました。元となる動画を指定してパラメータを調整して実行すると、以下のように大量の静止画が得られます。

フレーム単位でコマをカットしたり追加をしたかったので。動画編集ソフトを使えば良いだけなのですが。。。