残高推移のロジックをGPTに作らせる

Chat GPTへのお願いの仕方(プロンプトエンジニアリング)がうまくなるため、投げ込んだお願い事をメモしていってます。

目的

残高推移の集計を作らせるようなお願いをしました。
残高推移とは、「1月に10万円借り、毎月1万円ずつ返済。4月に追加で2万円借りた」といった場合、「1月:9万円、2月:8万円、3月:7万円、7月:8万円」みたいなデータです。

ポイント
ロジックを文章で伝えないといけないので、そこが難しかったです。
最初うまく作ってくれずに、ちょこちょこ修正して3回目でバチっとしたものを作ってくれました。最初は5・6のチェック依頼がなく、次に5のチェック依頼を着けたし、最後に6の念押し文を入れ込んだらうまくいきました。
が、ChatGPTがPythonを実行できるわけでもなく、このチェック文があってもなくても理論的には結果は変わらないはず。
ひょっとしたら、5・6の文章を付け足さずに同じ文章を何度か投げ込んだらうまくいったのかも。

また、「うまくいってるかどうか」の判断は人間がしなければならないので、“全然Python分かりません”状態だとちょっと厳しいかな?と思いました。

Chat GPTに投げかけた言葉

以下にある「与えられた表」をもとに、「作成する表」を作成するPythonプログラムを作ってください。
ロジックは以下の通りで組み立ててください。

ロジック : """
1. 「与えられた表」を読み込む
2. IDごとに購入日の最小値を割り出し、その最小日から現在日までの毎日のリストを作る。
  例: ID=Aの最小購入日が2023/5/1、ID=Bの最小購入日が2023/5/3であれば、Aは5/1~5/4の4レコード、Bは5/3~5/4の2レコードで、合計6レコードができる。
3. 毎日のリストに、当日購入数をマージする
4. 残COINを計算する。残COINの計算式は、「残COIN=前日の残COIN+当日購入数-1」。
  なお、最初のレコードは"前日の残COIN"を0として計算する。
  また、残COINが0未満になったときは0にする。
5. 作成した表が、以下の「作成する表」と一致しているかを答え合わせする。もし相違している箇所があれば、プログラムを見直す。
6. 「作成する表」と完全一致するまでプログラムの見直しを行う。
"""

与えられた表 : """
|ID|購入日|coin|
|A|2023/04/15|10|
|A|2023/04/20|5|
|A|2023/05/04|3|
|B|2023/04/20|3|
|B|2023/05/03|3|
"""

作成する表 : """
(大きいので割愛)
"""

エラーが出たので追加質問。

エラーが出ます。修正部分だけ教えて。
エラー箇所:result = result.append({"ID": id, "date": day, "当日購入数": purchase_count, "残COIN": remaining_coin}, ignore_index=True)
エラー内容:'DataFrame' object has no attribute 'append'

これでカンペキ動作!


作ってくれたプログラム

import pandas as pd
from datetime import datetime, timedelta
from io import StringIO

# 与えられた表
data = """
ID,購入日,coin
A,2023/04/15,10
A,2023/04/20,5
A,2023/05/04,3
B,2023/04/20,3
B,2023/05/03,3
"""

# 文字列からDataFrameを作成
df = pd.read_csv(StringIO(data), parse_dates=["購入日"])

# IDごとに最小購入日を計算
min_dates = df.groupby("ID")["購入日"].min().reset_index()

# 現在日
current_date = datetime(2023, 5, 4)

# 結果を格納するDataFrame
result = pd.DataFrame(columns=["ID", "date", "当日購入数", "残COIN"])

# IDごとに処理
for _, row in min_dates.iterrows():
    id = row["ID"]
    min_date = row["購入日"]
    day = min_date

    # 残COIN初期化
    remaining_coin = 0

    # 最小購入日から現在日まで処理
    while day <= current_date:
        # 当日購入数を取得
        purchase_count = df.loc[(df["ID"] == id) & (df["購入日"] == day), "coin"].sum()

        # 残COINを計算
        remaining_coin = max(remaining_coin + purchase_count - 1, 0)

        # 結果に追加
        result = pd.concat([
                        result
                    ,   pd.DataFrame({
                                "ID"        : [id]
                            ,   "date"      : [day]
                            ,   "当日購入数" : [purchase_count]
                            ,   "残COIN"    : [remaining_coin]
                        })
                ], ignore_index=True
        )

        # 次の日に進む
        day += timedelta(days=1)

# 結果を表示
print(result)


今回は自分で書いたほうが早かったかも。
ロジックを作ってもらう際の指示出しがもっとうまくなれば、GPT君も正確に教えてくれるんだろうなぁ。


この記事が気に入ったらサポートをしてみませんか?