Github Copilot のインラインチャットにてコード全体に対する修正が可能

## 概要

VS Code 利用時に Github Copilot にてコード全体に対する変更が実施可能であることを YouTube の動画（本記事の内容とは別の内容です）にて知りました。今までメソッドごとに修正作業を確認しながら実施していたため、そんな便利な方法があったのかと驚きました。本記事では、サンプルとして用意したサンプルコードの修正を実施する手順を紹介します。


<iframe width="560" height="315" src="https://www.youtube.com/embed/9ngQFuAsiiM?si=9EUPshT7qOS61upK&amp;start=78" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e258cee9-e7a0-400d-f557-b12939b2c82f.png)

引用元：https://youtu.be/9ngQFuAsiiM?si=sX1cOCjysoQEUlyM&t=78

## 手順

### 1. 修正作業のコードを準備

下記のコードは Github Copilot にて生成した検証用のコードです。

```python
class Sample:
    def __init__(self):
        pass

    def sample_method1(self, path: str) -> pd.DataFrame:
        data = pd.read_csv(path)
        print(data.head())
        return data

    def add_current_date_column(self, data: pd.DataFrame, col_name: str) -> pd.DataFrame:
        data[col_name] = pd.to_datetime('today').date()
        return data

    def convert_to_spark_dataframe(self, data: pd.DataFrame) -> pd.DataFrame:
        spark = SparkSession.builder.getOrCreate()
        spark_df = spark.createDataFrame(data)
        spark_df = spark_df.withColumn("audit_column", F.current_timestamp())
        return spark_df.toPandas()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/852c7c69-dd7d-3f99-0ac6-1844a68c7d30.png)


### 2. インラインチャット（`Ctrl + I`）を起動してプロンプトをリクエスト（`Enter`）

後述する理由により同一コードに対する処理を２度行うため、コード全体を選択しています。全体を選択しない場合でも、コード全体に対する修正が実施されました。

```text
コード全体に対して、次の条件を満たす改善を実施してください。

- 英語で記述する
- 不足しているライブラリを import する
- Google スタイルの Docstring を記述する
- メソッド内のコードに  Docstring だけでなく、適切なソースコードコメントを追加する
- パラメータにデータ型ヒントを記述する
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/da374328-6f5c-ebf3-6740-0da4013b7076.png)

### 3. 変更内容を Accept する

一度目の提案ではコードに対するコメントが実施されなかったため、再度プロンプトをリクエストしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9a487236-760d-b681-14f3-6711ffc3a793.png)

### 4. 変更されたコードを確認

```python
import pandas as pd
from pyspark.sql import SparkSession
from pyspark.sql import functions as F

class Sample:
    def __init__(self):
        pass

    def sample_method1(self, path: str) -> pd.DataFrame:
        """
        Reads a CSV file from the given path and returns the data as a pandas DataFrame.

        Args:
            path (str): The path to the CSV file.

        Returns:
            pd.DataFrame: The data read from the CSV file.
        """
        # Read the CSV file
        data = pd.read_csv(path)
        print(data.head())
        return data

    def add_current_date_column(self, data: pd.DataFrame, col_name: str) -> pd.DataFrame:
        """
        Adds a new column with the current date to the given DataFrame.

        Args:
            data (pd.DataFrame): The input DataFrame.
            col_name (str): The name of the new column.

        Returns:
            pd.DataFrame: The DataFrame with the new column added.
        """
        # Add a new column with the current date
        data[col_name] = pd.to_datetime('today').date()
        return data

    def convert_to_spark_dataframe(self, data: pd.DataFrame) -> pd.DataFrame:
        """
        Converts the given pandas DataFrame to a Spark DataFrame.

        Args:
            data (pd.DataFrame): The input DataFrame.

        Returns:
            pd.DataFrame: The converted Spark DataFrame.
        """
        # Create a SparkSession
        spark = SparkSession.builder.getOrCreate()

        # Convert pandas DataFrame to Spark DataFrame
        spark_df = spark.createDataFrame(data)

        # Add an audit column with the current timestamp
        spark_df = spark_df.withColumn("audit_column", F.current_timestamp())
        return spark_df.toPandas()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/78c307db-6c14-cf41-8446-edbd3c9ae80b.png)


## まとめ

GitHub Copilotを使用して、Pythonプログラムに対してDocstringや不足しているライブラリのインポートなど、コード全体の修正を行いました。GitHub Copilotは非常に便利であり、この記事のようなテクニックを使用することで生産性を向上させることができます。