【ChatGPT】Code Interpreter を使ったら営業日計算も一発だった話
更新日: 2023/07/19
概要
ChatGPT に課金して楽しさのあまり毎日触っています。
Code Interpreter を使ってよく企業などのシステムで使われる営業日計算について解かせたのでそのログと感想です。
まず Code Interpreter を使うには
課金するのは前提です。
左のサイドバーから「New chat」を選択して新たなスレッドを立てる。
上部に切り替えがあるので「GPT-4」を選択する。その時マウスを載せたままにすると下記のように使うモデルを選択できるようになります。
出てこない人へ
- 左のサイドバーの一番下にある自分のアイコンの横の「…」を押す。
- その中に「Settings」があるので押す。
- 「Beta features」の「Code Interpreter」をONにしましょう!
やらせてみた
私: このCSVを取り込んで日本の祝日も考慮した営業日計算のコードを作成せよ。
(添付ファイル: syukujitsu.csv)
と質問すると。。。
※ ファイルはドラッグ&ドロップで持っていけます。
了解しました。日本の祝日情報を含むCSVファイルを読み込み、営業日の計算を行うPythonコードを作成します。
まずは、提供されたCSVファイルの内容を確認しましょう。これにより、どのようなデータが含まれていて、どのようにそれを処理するかを理解することができます。
なななんと優しい受け答え。
その後解析が始まる。
おい落ちてるやんけ!!! ... と思ったら。 ....
上記のエラーは、CSVファイルがUTF-8エンコーディングでないことを示しています。おそらく、このCSVファイルは別のエンコーディング(恐らく日本語のShift-JIS)で保存されていると思われます。
Shift-JISエンコーディングで再度ファイルを読み込んでみましょう。
いい子じゃないか!失敗を恐れない!
そして変数名とかも完璧やね。
今度こそ正解!
そして列名から値の type も判断できている。
型について何も教えてないんですけど!?
次は何してくれるの?と思ってたら。
これらのデータを使用して、営業日の計算に祝日を考慮するコードを作成します。まず、日付データが正しい日付形式に変換されることを確認します。そして、pandasのCustomBusinessDayを使用して、営業日を計算します。これにより、週末(土曜日と日曜日)と祝日を除いた日付を取得することができます。
エンジニアがやるような検証もちゃんとやるんだね。そうしなきゃ扱えないか。
そりゃうまくいくよね。
んで仕上げに関数作ってくれるそうです。
次に、この祝日リストを用いて営業日を計算する関数を作成します。
この関数は、開始日、終了日、および追加の祝日をパラメータとして受け取り、開始日から終了日までの営業日のリストを返します。営業日とは、週末(土曜日と日曜日)と祝日を除いた日です。この計算には、pandasのCustomBusinessDayを使用します。
最終的にできたのがこちら。
from pandas.tseries.offsets import CustomBusinessDay
from pandas.tseries.holiday import AbstractHolidayCalendar, Holiday
# Define a class for Japanese holiday calendar
class JapaneseHolidayCalendar(AbstractHolidayCalendar):
rules = [
Holiday(holiday_name, year=holiday_date.year, month=holiday_date.month, day=holiday_date.day)
for holiday_date, holiday_name in zip(holidays_df['国民の祝日・休日月日'], holidays_df['国民の祝日・休日名称'])
]
# Define a function to calculate business days
def calculate_business_days(start_date, end_date):
# Define custom business day
bday_jp = CustomBusinessDay(calendar=JapaneseHolidayCalendar())
# Calculate business days
business_days = pd.date_range(start=start_date, end=end_date, freq=bday_jp)
return business_days
# Test the function
start_date = '2023-01-01'
end_date = '2023-12-31'
business_days = calculate_business_days(start_date, end_date)
business_days
一応今年の営業日数を勝手に数えてくれた。
# RESULT
DatetimeIndex(['2023-01-03', '2023-01-04', '2023-01-05', '2023-01-06',
'2023-01-10', '2023-01-11', '2023-01-12', '2023-01-13',
'2023-01-16', '2023-01-17',
...
'2023-12-18', '2023-12-19', '2023-12-20', '2023-12-21',
'2023-12-22', '2023-12-25', '2023-12-26', '2023-12-27',
'2023-12-28', '2023-12-29'],
dtype='datetime64[ns]', length=247, freq='C')
2023年1月1日から2023年12月31日までの間に存在する営業日を計算しました。この期間には合計で247日の営業日があります。
この関数calculate_business_days(start_date, end_date)は、開始日から終了日までの営業日を計算するのに使用できます。ただし、この関数は土曜日と日曜日を休日として扱います。それ以外の特定の休日(この場合、日本の祝日)を休日として考慮します。
営業日の計算に特定の日付範囲を使用するには、その日付範囲を関数のパラメータとして指定します。関数は営業日のリスト(DatetimeIndex形式)を返します。
使い方まで教えてくれてありがとう。
続けて質問してみた
これを使って計算してもらいたかったので。。
私: 上記の関数を使って2023-4-24から2023-5-9までの営業日を計算して
というと、
2023年4月24日から2023年5月9日までの営業日を計算しました。この期間には次の9日の営業日があります:
2023-04-24
2023-04-25
2023-04-26
2023-04-27
2023-04-28
2023-05-01
2023-05-02
2023-05-08
2023-05-09
この期間にはいくつかの休日(週末や祝日)があるため、全ての日が営業日ではありません。
正解!
そして別の会話でも、同一スレッド内なら定義した関数を呼べることがわかりました!
わかったこと
- 教えなくても言葉の特性から型を理解してくれるのすごい
- エンコード教えなくても自分で解決するのすごい
- 前の会話の関数覚えてくれている
とりあえずすごい!(雑)
気をつけたいところ
マル秘なファイルとかを読み込ませないように!
学習に使用しないように設定させたらいいのかもしれないけど一旦はサーバーに送られてしまうから今の状態ではアウトだと私は思う。
(編集)
2023/07/19 見やすいようにデザインのみ修正しました。