0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

生成AIに書いてもらったコードをデバッグしました

Last updated at Posted at 2024-04-03

はじめに

生成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の学習速度は・・・)

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?