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

# はじめに
生成AIはコードまで書いてくれるのでよく利用していますが、たまにバグありコードを平気で出してくることがあります。

そんな時は、自分でデバッグするのですが、その一例を紹介します。

# 私の質問

pandas で、Trueの数が連続でN回以上続いた場合にTrueとなるSeriesを返す関数を作ってください。

# 生成AIの回答

もちろんです！連続してTrueがN回以上続いた場合にTrueとなるSeriesを返す関数を作成しましょう。以下のステップで進めます。
１．連続するTrueの数をカウントする関数を作成します。
２．その関数を用いて、連続するTrueの数がN回以上の場合にTrueとなるSeriesを生成します。
まずは、連続するTrueの数をカウントする関数を作成します。以下のコードをご覧ください。

```python
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
```
これを実行してみると、確かに、３個以上Trueが連続している個所はTrue、それ以外はFalseを返してくれました。

# 生成AIコードの検証

しかし、Falseが連続している場合にもTrueを返してくることが判明しました。

```python
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に聞いてみました。

# 私の質問（２回目）

全部Falseを入力すると、Trueが返ってきます。デバッグしてください。

# 生成AIの回答（２回目）

申し訳ありません。デバッグいたします。

と回答しつつ、同じコードを提出してきました。

仕方がないので、私がデバッグしました。

# デバッグ

consecutive_counts は、TrueでもFalseでもカウントしてしまっていたので、
consecutive_counts *= (df[column_name]*1)
とすることで、Trueのときだけカウントされるようにしました。
（たった１文、もっと言えば、たった１回の掛け算）

```python
# 生成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が例として出していたデータフレームでも、正しい値を回答しました。

```python
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の学習速度は・・・）