【超便利】pandasで四半期末かどうかを瞬時に判定!QuarterEnd.is_quarter_endの使い方とサンプルコード集
pandas.tseries.offsets.QuarterEnd.is_quarter_end
は、指定された日付が四半期末かどうかを判定する関数です。
使い方
import pandas as pd
# サンプルデータ
dates = pd.to_datetime(['2024-01-31', '2024-02-29', '2024-03-31', '2024-04-30', '2024-05-31', '2024-06-30'])
# 各日付が四半期末かどうか判定
is_quarter_end = QuarterEnd().is_quarter_end(dates)
print(is_quarter_end)
出力
[ True False True True False True]
解説
- 上記の例では、
dates
内の日付のうち、1月31日、3月31日、4月30日、6月30日は四半期末であるため、True
が返されています。 is_quarter_end()
メソッドは、オフセットと比較して、日付がオフセットに一致するかどうかを判定します。QuarterEnd()
は、四半期末を表すオフセットを生成します。
QuarterEnd
は、四半期末を判定するだけでなく、四半期末の日付を生成したり、四半期末に移動したりすることもできます。startingMonth
引数で、四半期が始まる月を指定できます。デフォルトは3月です。
- 四半期末の株価を分析する
- 四半期ごとにレポートを作成する
- 四半期ごとの売上データを集計する
サンプル 1:四半期ごとの売上データを集計
import pandas as pd
# サンプルデータ
data = {
'date': pd.to_datetime(['2023-01-10', '2023-02-15', '2023-03-20', '2023-04-12', '2023-05-05', '2023-06-22']),
'sales': [100, 150, 220, 250, 300, 350]
}
df = pd.DataFrame(data)
# 四半期ごとに集計
df_quarterly = df.resample('Q-T', on='date').sum()
print(df_quarterly)
出力
sales
quarter
2023Q1 470
2023Q2 550
2023Q3 350
解説
sum()
で、各四半期における売上を合計します。resample('Q-T', on='date')
で、date
列を基準に四半期ごとにデータを集計します。
サンプル 2:四半期ごとにレポートを作成
import pandas as pd
# サンプルデータ
data = {
'date': pd.to_datetime(['2023-01-10', '2023-02-15', '2023-03-20', '2023-04-12', '2023-05-05', '2023-06-22']),
'sales': [100, 150, 220, 250, 300, 350],
'product': ['A', 'A', 'B', 'B', 'C', 'C']
}
df = pd.DataFrame(data)
# 四半期ごとに集計
df_quarterly = df.resample('Q-T', on='date').agg({
'sales': 'sum',
'product': 'nunique'
})
# レポートを作成
for quarter, row in df_quarterly.iterrows():
print(f"## {quarter}売上レポート")
print(f"売上: {row['sales']}")
print(f"販売商品数: {row['product']}")
出力
## 2023Q1売上レポート
売上: 470
販売商品数: 2
## 2023Q2売上レポート
売上: 550
販売商品数: 2
## 2023Q3売上レポート
売上: 350
販売商品数: 1
- 各四半期ごとに、売上レポートを出力します。
iterrows
で、集計結果をループ処理します。agg
で、各四半期における売上と販売商品数を集計します。resample('Q-T', on='date')
で、date
列を基準に四半期ごとにデータを集計します。
import pandas as pd
import yfinance as yf
# サンプルデータ
ticker = 'AAPL' # Apple社の株価データを取得
# 四半期末を取得
quarter_ends = pd.date_range(start='2020-01-01', end='2024-06-30', freq='Q-END')
# 株価データを取得
data = yf.download(ticker, start=quarter_ends[0], end=quarter_ends[-1])['Adj Close']
# 四半期末ごとに株価を分析
for quarter_end, price in data.iteritems():
print(f"{quarter_end.strftime('%Y-%
代替方法
以下に、pandas.tseries.offsets.QuarterEnd.is_quarter_end
の代替方法をいくつか紹介します。
month 属性と比較
最も簡単な方法は、month
属性と比較することです。四半期末は 3月、6月、9月、12月なので、以下の式で判定できます。
is_quarter_end = (df['date'].dt.month % 3 == 0) & (df['date'].dt.is_month_end)
QuarterEnd オブジェクトを使用
QuarterEnd
オブジェクトを使用して、四半期末の日付を生成し、比較する方法もあります。
quarter_ends = pd.offsets.QuarterEnd()
is_quarter_end = df['date'].dt.is_on(quarter_ends)
カスタム関数を使用
より複雑な判定が必要な場合は、カスタム関数を作成する方法もあります。
def is_quarter_end(date):
if date.month in [3, 6, 9, 12] and date.day == date.days_in_month:
return True
else:
return False
is_quarter_end = df['date'].apply(is_quarter_end)
numpy.vectorize を使用する
上記のカスタム関数をベクトル化したい場合は、numpy.vectorize
を使用できます。
import numpy as np
is_quarter_end_vec = np.vectorize(is_quarter_end)
is_quarter_end = is_quarter_end_vec(df['date'])
選択のポイント
どの方法を選択するかは、データ量や処理速度、必要な精度などを考慮して決定する必要があります。
- 高い精度が必要な場合は、QuarterEnd オブジェクトを使用 する方法がおすすめです。
- より複雑な判定が必要な場合は、カスタム関数を使用 または numpy.vectorize を使用する 方法が適しています。
- データ量が少なく、処理速度が重要でない場合は、month 属性と比較 が最も簡単で効率的です。
- それぞれの方法の性能や精度を比較するために、ベンチマークを実施することをおすすめします。
- 上記の代替方法は、pandas 1.0.0 以降で使用できます。