はじめに
生成AIはコードまで書いてくれるのでよく利用していますが、たまにバグありコードを平気で出してくることがあります。
そんな時は、自分でデバッグするのですが、その一例を紹介します。
私の質問
pandas で、Trueの数が連続でN回以上続いた場合にTrueとなるSeriesを返す関数を作ってください。
生成AIの回答
もちろんです!連続してTrueがN回以上続いた場合にTrueとなるSeriesを返す関数を作成しましょう。以下のステップで進めます。
1.連続するTrueの数をカウントする関数を作成します。
2.その関数を用いて、連続するTrueの数がN回以上の場合にTrueとなるSeriesを生成します。
まずは、連続するTrueの数をカウントする関数を作成します。以下のコードをご覧ください。
import pandas as pd
# 生成AIが書いてくれたコード
def detect_consecutive_true(df, column_name, N):
"""
DataFrame内の指定された列で、TrueがN回以上連続している場合を検出します。
Args:
df (pd.DataFrame): 対象のDataFrame
column_name (str): 検出対象の列名
N (int): 連続している最小回数
Returns:
pd.Series: TrueがN回以上連続している場合はTrue、それ以外はFalseのSeries
"""
consecutive_counts = df[column_name].groupby(df[column_name].ne(df[column_name].shift()).cumsum()).transform('size')
return consecutive_counts >= N
# 例: DataFrameを作成してテスト
data = {'value': [True, True, False, True, True, True, False, True, True]}
df = pd.DataFrame(data)
df['result'] = detect_consecutive_true(df, 'value', N=3)
print(df)
value result
0 True False
1 True False
2 False False
3 True True
4 True True
5 True True
6 False False
7 True False
8 True False
これを実行してみると、確かに、3個以上Trueが連続している個所はTrue、それ以外はFalseを返してくれました。
生成AIコードの検証
しかし、Falseが連続している場合にもTrueを返してくることが判明しました。
data = {'value': [False, False, False, False, False, False, False, False, False]}
df = pd.DataFrame(data)
df['result'] = detect_consecutive_true(df, 'value', N=3)
print(df)
value result
0 False True
1 False True
2 False True
3 False True
4 False True
5 False True
6 False True
7 False True
8 False True
そのため、もう一度、生成AIに聞いてみました。
私の質問(2回目)
全部Falseを入力すると、Trueが返ってきます。デバッグしてください。
生成AIの回答(2回目)
申し訳ありません。デバッグいたします。
と回答しつつ、同じコードを提出してきました。
仕方がないので、私がデバッグしました。
デバッグ
consecutive_counts は、TrueでもFalseでもカウントしてしまっていたので、
consecutive_counts *= (df[column_name]*1)
とすることで、Trueのときだけカウントされるようにしました。
(たった1文、もっと言えば、たった1回の掛け算)
# 生成AIが書いてくれたコード+私のデバッグした結果を反映
def my_detect_consecutive_true(df, column_name, N):
"""
DataFrame内の指定された列で、TrueがN回以上連続している場合を検出します。
Args:
df (pd.DataFrame): 対象のDataFrame
column_name (str): 検出対象の列名
N (int): 連続している最小回数
Returns:
pd.Series: TrueがN回以上連続している場合はTrue、それ以外はFalseのSeries
"""
consecutive_counts = df[column_name].groupby(df[column_name].ne(df[column_name].shift()).cumsum()).transform('size')*(df[column_name]*1)
consecutive_counts *= (df[column_name]*1) # ←追加したコード
return consecutive_counts >= N
df['result'] = my_detect_consecutive_true(df, 'value', N=3)
print(df)
value result
0 False False
1 False False
2 False False
3 False False
4 False False
5 False False
6 False False
7 False False
8 False False
これで、連続Falseの場合、Falseが返るようになりました。
また、もともと生成AIが例として出していたデータフレームでも、正しい値を回答しました。
data = {'value': [True, True, False, True, True, True, False, True, True]}
df = pd.DataFrame(data)
df['result'] = my_detect_consecutive_true(df, 'value', N=3)
print(df)
value result
0 True False
1 True False
2 False False
3 True True
4 True True
5 True True
6 False False
7 True False
8 True False
さいごに
「pandas で、Trueの数が連続でN回以上続いた場合にTrueとなるSeriesを返す関数」はググってもズバリの回答が得られなかったので、生成AIが似たようなコードを無理矢理ひっぱってきたのだと思います。
- 私の要件:Trueが連続した数
- 生成AIの回答:TrueでもFalseでもなんでもよいので、連続した数
として回答したようです。わからんもんは、わからんと正直に答えてほしいのですが、、、
そのうち、この記事も生成AIが取り込んで学習し、生成AIがこの問いに対してズバリの回答をしてくれる日を気を長くして待っています。(あんがい早いかも、生成AIの学習速度は・・・)