📋 このステップで学ぶこと
groupby()によるグループ集計の基本と応用
agg()による複数の集計関数の適用
pivot_table()によるクロス集計
resample()による時系列データの集約
rolling()による移動平均の計算
実践演習:売上レポートの作成
⏱️ 学習時間の目安: 2.5時間
📝 練習問題: 10問(基礎4問・応用4問・発展2問)
🎯 1. groupbyによる集計
1-1. groupbyとは?
groupby()は、データをグループに分けて集計 する機能です。
SQLのGROUP BYと同じで、ETL処理で最も頻繁に使う機能 の一つです。
📚 例え話:クラスの成績集計
全校生徒500人のテスト結果があるとき:
【手順1】groupby(‘クラス’) → クラスごとにデータを分ける
【手順2】.mean() → 各クラスの平均点を計算
結果:「1-A組の平均75点、1-B組の平均80点、2-A組の平均72点…」
groupbyは「分ける」→「集計する」の2ステップ で考えます。
1-2. 基本的なgroupby
# ===== シンプルなgroupby =====
import pandas as pd
df = pd.DataFrame({
‘category’: [‘果物’, ‘野菜’, ‘果物’, ‘野菜’, ‘果物’],
‘product’: [‘りんご’, ‘にんじん’, ‘バナナ’, ‘キャベツ’, ‘みかん’],
‘price’: [150, 100, 120, 200, 100],
‘quantity’: [10, 15, 8, 5, 12]
})
print(“=== 元データ ===”)
print(df)
# カテゴリごとの平均価格
avg_price = df.groupby(‘category’)[‘price’].mean()
print(“\n=== カテゴリ別平均価格 ===”)
print(avg_price)
# カテゴリごとの合計数量
total_qty = df.groupby(‘category’)[‘quantity’].sum()
print(“\n=== カテゴリ別合計数量 ===”)
print(total_qty)
【実行結果】
=== 元データ ===
category product price quantity
0 果物 りんご 150 10
1 野菜 にんじん 100 15
2 果物 バナナ 120 8
3 野菜 キャベツ 200 5
4 果物 みかん 100 12
=== カテゴリ別平均価格 ===
category
果物 123.333333
野菜 150.000000
Name: price, dtype: float64
=== カテゴリ別合計数量 ===
category
果物 30
野菜 20
Name: quantity, dtype: int64
よく使う集計関数
関数
説明
使用例
sum()
合計
売上合計、数量合計
mean()
平均
平均単価、平均購入額
count()
件数
注文回数、顧客数
max()
最大値
最高売上、最終購入日
min()
最小値
最低価格、初回購入日
std()
標準偏差
売上のばらつき
nunique()
ユニーク数
商品種類数、顧客数
first()
最初の値
グループの代表値
1-3. agg()で複数の集計を同時に
# ===== agg()で複数の集計 =====
import pandas as pd
df = pd.DataFrame({
‘store’: [‘東京’, ‘大阪’, ‘東京’, ‘大阪’, ‘東京’],
‘product’: [‘A’, ‘A’, ‘B’, ‘B’, ‘A’],
‘sales’: [10000, 12000, 15000, 18000, 8000],
‘quantity’: [10, 12, 15, 18, 8]
})
print(“=== 元データ ===”)
print(df)
# 店舗ごとに複数の集計
result = df.groupby(‘store’).agg({
‘sales’: [‘sum’, ‘mean’, ‘max’], # 売上の合計、平均、最大
‘quantity’: [‘sum’, ‘count’] # 数量の合計、件数
})
print(“\n=== 複数の集計結果 ===”)
print(result)
【実行結果】
=== 複数の集計結果 ===
sales quantity
sum mean max sum count
store
大阪 30000 15000.0 18000 30 2
東京 33000 11000.0 15000 33 3
1-4. カラムごとに異なる集計
# ===== カラムごとに集計方法を変える =====
import pandas as pd
df = pd.DataFrame({
‘store’: [‘東京店’, ‘大阪店’, ‘東京店’, ‘大阪店’],
‘product’: [‘A’, ‘A’, ‘B’, ‘B’],
‘sales’: [10000, 12000, 15000, 18000],
‘quantity’: [10, 12, 15, 18],
‘date’: [‘2024-01-01’, ‘2024-01-02’, ‘2024-01-03’, ‘2024-01-04’]
})
# 店舗ごとに異なる集計
result = df.groupby(‘store’).agg({
‘sales’: ‘sum’, # 売上は合計
‘quantity’: ‘mean’, # 数量は平均
‘product’: ‘count’, # 商品は件数
‘date’: ‘max’ # 日付は最新日
})
# カラム名をわかりやすく変更
result = result.rename(columns={
‘sales’: ‘売上合計’,
‘quantity’: ‘平均数量’,
‘product’: ‘取引回数’,
‘date’: ‘最終取引日’
})
print(“=== カラム別集計結果 ===”)
print(result)
【実行結果】
=== カラム別集計結果 ===
売上合計 平均数量 取引回数 最終取引日
store
大阪店 30000 15.0 2 2024-01-04
東京店 25000 12.5 2 2024-01-03
1-5. 複数カラムでgroupby
# ===== 複数の軸で集計 =====
import pandas as pd
df = pd.DataFrame({
‘year’: [2024, 2024, 2024, 2024, 2025, 2025],
‘month’: [1, 1, 2, 2, 1, 1],
‘store’: [‘東京’, ‘大阪’, ‘東京’, ‘大阪’, ‘東京’, ‘大阪’],
‘sales’: [10000, 12000, 15000, 18000, 11000, 13000]
})
print(“=== 元データ ===”)
print(df)
# 年・月・店舗ごとに集計
result = df.groupby([‘year’, ‘month’, ‘store’])[‘sales’].sum()
print(“\n=== 年・月・店舗別売上(Series)===”)
print(result)
# DataFrameに戻す
result_df = result.reset_index()
print(“\n=== DataFrameに変換 ===”)
print(result_df)
【実行結果】
=== 年・月・店舗別売上(Series)===
year month store
2024 1 大阪 12000
東京 10000
2 大阪 18000
東京 15000
2025 1 大阪 13000
東京 11000
Name: sales, dtype: int64
=== DataFrameに変換 ===
year month store sales
0 2024 1 大阪 12000
1 2024 1 東京 10000
2 2024 2 大阪 18000
3 2024 2 東京 15000
4 2025 1 大阪 13000
5 2025 1 東京 11000
✅ reset_index()を忘れずに
groupby()の結果はインデックスがグループ化キーになる ので、
後続の処理で使いやすいようにreset_index()でDataFrameに戻すことが多いです。
1-6. カスタム集計関数
# ===== 独自の集計関数を使う =====
import pandas as pd
import numpy as np
df = pd.DataFrame({
‘category’: [‘A’, ‘A’, ‘A’, ‘B’, ‘B’, ‘B’],
‘value’: [100, 200, 150, 300, 400, 350]
})
# 独自の集計関数を定義
def range_func(x):
“””最大値と最小値の差(範囲)”””
return x.max() – x.min()
def cv_func(x):
“””変動係数(標準偏差÷平均)”””
return x.std() / x.mean() if x.mean() != 0 else 0
# カテゴリごとに集計
result = df.groupby(‘category’)[‘value’].agg([
(‘合計’, ‘sum’),
(‘平均’, ‘mean’),
(‘範囲’, range_func),
(‘変動係数’, cv_func)
]).round(2)
print(“=== カスタム集計結果 ===”)
print(result)
【実行結果】
=== カスタム集計結果 ===
合計 平均 範囲 変動係数
category
A 450 150.00 100.0 0.33
B 1050 350.00 100.0 0.14
🔄 2. pivot_tableの作成
2-1. pivot_tableとは?
pivot_table()は、Excelのピボットテーブルと同じで、データをクロス集計 します。
📝 groupby vs pivot_table の違い
groupby :縦方向に集計(リスト形式)
pivot_table :縦横にクロス集計(マトリクス形式)
使い分け :見やすい表を作りたいときはpivot_table、後続の処理に使うときはgroupby
2-2. 基本的なpivot_table
# ===== シンプルなピボットテーブル =====
import pandas as pd
df = pd.DataFrame({
‘date’: [‘2024-01’, ‘2024-01’, ‘2024-02’, ‘2024-02’],
‘store’: [‘東京’, ‘大阪’, ‘東京’, ‘大阪’],
‘sales’: [10000, 12000, 15000, 18000]
})
print(“=== 元データ ===”)
print(df)
# 行=date、列=store、値=salesの合計
pivot = pd.pivot_table(
df,
values=’sales’, # 集計する値
index=’date’, # 行
columns=’store’, # 列
aggfunc=’sum’ # 集計方法
)
print(“\n=== ピボットテーブル ===”)
print(pivot)
【実行結果】
=== ピボットテーブル ===
store 大阪 東京
date
2024-01 12000 10000
2024-02 18000 15000
2-3. 合計行・列を追加(margins)
# ===== marginsで合計を追加 =====
import pandas as pd
df = pd.DataFrame({
‘month’: [1, 1, 2, 2],
‘store’: [‘東京’, ‘大阪’, ‘東京’, ‘大阪’],
‘sales’: [10000, 12000, 15000, 18000]
})
# 合計行・列を追加
pivot = pd.pivot_table(
df,
values=’sales’,
index=’month’,
columns=’store’,
aggfunc=’sum’,
margins=True, # 合計を追加
margins_name=’合計’ # 合計の名前
)
print(“=== 合計付きピボットテーブル ===”)
print(pivot)
【実行結果】
=== 合計付きピボットテーブル ===
store 大阪 東京 合計
month
1 12000 10000 22000
2 18000 15000 33000
合計 30000 25000 55000
2-4. 複数の値を集計
# ===== 複数カラムを集計 =====
import pandas as pd
df = pd.DataFrame({
‘month’: [1, 1, 2, 2],
‘store’: [‘東京’, ‘大阪’, ‘東京’, ‘大阪’],
‘sales’: [10000, 12000, 15000, 18000],
‘quantity’: [10, 12, 15, 18]
})
# salesとquantityの両方を集計
pivot = pd.pivot_table(
df,
values=[‘sales’, ‘quantity’],
index=’month’,
columns=’store’,
aggfunc=’sum’
)
print(“=== 複数値のピボットテーブル ===”)
print(pivot)
【実行結果】
=== 複数値のピボットテーブル ===
quantity sales
store 大阪 東京 大阪 東京
month
1 12 10 12000 10000
2 18 15 18000 15000
2-5. 複数の集計関数
# ===== 合計と平均を同時に =====
import pandas as pd
df = pd.DataFrame({
‘category’: [‘果物’, ‘果物’, ‘野菜’, ‘野菜’],
‘store’: [‘東京’, ‘大阪’, ‘東京’, ‘大阪’],
‘sales’: [10000, 12000, 15000, 18000]
})
# 合計と平均を両方計算
pivot = pd.pivot_table(
df,
values=’sales’,
index=’category’,
columns=’store’,
aggfunc=[‘sum’, ‘mean’]
)
print(“=== 複数集計のピボットテーブル ===”)
print(pivot)
【実行結果】
=== 複数集計のピボットテーブル ===
sum mean
store 大阪 東京 大阪 東京
category
果物 12000 10000 12000.0 10000.0
野菜 18000 15000 18000.0 15000.0
2-6. 欠損値の扱い
# ===== fill_valueで欠損値を埋める =====
import pandas as pd
df = pd.DataFrame({
‘month’: [1, 1, 2], # 2月の大阪がない
‘store’: [‘東京’, ‘大阪’, ‘東京’],
‘sales’: [10000, 12000, 15000]
})
print(“=== 元データ(2月大阪がない)===”)
print(df)
# 欠損値がNaNになる(デフォルト)
pivot_nan = pd.pivot_table(
df, values=’sales’, index=’month’, columns=’store’, aggfunc=’sum’
)
print(“\n=== NaNのまま ===”)
print(pivot_nan)
# 欠損値を0で埋める
pivot_filled = pd.pivot_table(
df, values=’sales’, index=’month’, columns=’store’,
aggfunc=’sum’, fill_value=0
)
print(“\n=== fill_value=0 ===”)
print(pivot_filled)
【実行結果】
=== NaNのまま ===
store 大阪 東京
month
1 12000.0 10000.0
2 NaN 15000.0
=== fill_value=0 ===
store 大阪 東京
month
1 12000 10000
2 0 15000
📅 3. 時系列データの集約
3-1. resampleによる時系列集約
resample()は、時系列データを任意の期間で集約 します。
日次データを月次に、時間データを日次に、といった変換が簡単にできます。
# ===== 日次データを月次に集約 =====
import pandas as pd
import numpy as np
# 日次の売上データ(3ヶ月分)
np.random.seed(42)
df = pd.DataFrame({
‘date’: pd.date_range(‘2024-01-01′, periods=90, freq=’D’),
‘sales’: np.random.randint(8000, 15000, size=90)
})
# インデックスを日付に設定
df = df.set_index(‘date’)
print(“=== 元データ(日次)===”)
print(df.head())
print(f”データ件数: {len(df)}件”)
# 月次に集約
monthly = df.resample(‘M’).agg({
‘sales’: [‘sum’, ‘mean’, ‘count’]
})
print(“\n=== 月次集計 ===”)
print(monthly)
【実行結果】
=== 元データ(日次)===
sales
date
2024-01-01 11279
2024-01-02 14014
2024-01-03 12316
2024-01-04 10940
2024-01-05 10577
データ件数: 90件
=== 月次集計 ===
sales
sum mean count
date
2024-01-31 351436 11336.64516 31
2024-02-29 332578 11468.20690 29
2024-03-31 353219 11781.96667 30
3-2. 頻度指定のオプション
resampleの頻度コード一覧
コード
説明
例
用途
D
日
resample(‘D’)
日次集計
W
週(日曜終わり)
resample(‘W’)
週次レポート
W-MON
週(月曜終わり)
resample(‘W-MON’)
週次レポート
M
月末
resample(‘M’)
月次決算
MS
月初
resample(‘MS’)
月次集計
Q
四半期末
resample(‘Q’)
四半期決算
Y
年末
resample(‘Y’)
年次レポート
H
時間
resample(‘H’)
時間帯分析
T or min
分
resample(‘T’)
分単位集計
# ===== 様々な期間で集約 =====
import pandas as pd
import numpy as np
# 1年分の日次データ
np.random.seed(42)
df = pd.DataFrame({
‘date’: pd.date_range(‘2024-01-01′, periods=365, freq=’D’),
‘sales’: np.random.randint(8000, 15000, size=365)
})
df = df.set_index(‘date’)
# 週次集約
weekly = df.resample(‘W’).sum()
print(f”週次: {len(weekly)}週”)
# 月次集約
monthly = df.resample(‘M’).sum()
print(f”月次: {len(monthly)}ヶ月”)
# 四半期集約
quarterly = df.resample(‘Q’).sum()
print(f”四半期: {len(quarterly)}期”)
print(“\n=== 四半期集計 ===”)
print(quarterly)
【実行結果】
週次: 53週
月次: 12ヶ月
四半期: 4期
=== 四半期集計 ===
sales
date
2024-03-31 1037233
2024-06-30 1041920
2024-09-30 1055820
2024-12-31 1047831
3-3. 移動平均(rolling)
# ===== rolling()で移動平均 =====
import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.DataFrame({
‘date’: pd.date_range(‘2024-01-01′, periods=30, freq=’D’),
‘sales’: np.random.randint(8000, 15000, size=30)
})
df = df.set_index(‘date’)
# 7日移動平均
df[‘MA_7’] = df[‘sales’].rolling(window=7).mean()
# 3日移動平均
df[‘MA_3’] = df[‘sales’].rolling(window=3).mean()
print(“=== 移動平均 ===”)
print(df.round(0).head(10))
【実行結果】
=== 移動平均 ===
sales MA_7 MA_3
date
2024-01-01 11279 NaN NaN
2024-01-02 14014 NaN NaN
2024-01-03 12316 NaN 12536.0
2024-01-04 10940 NaN 12423.0
2024-01-05 10577 NaN 11278.0
2024-01-06 8225 NaN 9914.0
2024-01-07 14334 NaN 11045.0
2024-01-08 12153 11670.0 11571.0
2024-01-09 8568 11591.0 11685.0
2024-01-10 13855 11424.0 11525.0
💡 移動平均の使いどころ
トレンドの把握 :日々の変動をならして全体傾向を見る
異常検知 :移動平均から大きく外れた日を検出
予測の基準 :直近の傾向から次の値を予測
🏋️ 4. 実践演習:売上レポートの作成
4-1. 課題:総合的な売上レポート
1年分の売上データから、月次・店舗別・商品別 の複数のレポートを作成します。
# ===== 完全な売上レポート作成 =====
import pandas as pd
import numpy as np
# ========== データ準備 ==========
np.random.seed(42)
# 日付リスト(1年分)
dates = pd.date_range(‘2024-01-01’, ‘2024-12-31′, freq=’D’)
# サンプルデータ生成
data = []
stores = [‘東京店’, ‘大阪店’, ‘福岡店’]
products = [‘商品A’, ‘商品B’, ‘商品C’]
for date in dates:
for store in stores:
for product in products:
if np.random.random() > 0.3: # 70%の確率でデータ生成
sales = np.random.randint(5000, 50000)
quantity = np.random.randint(1, 20)
data.append({
‘date’: date,
‘store’: store,
‘product’: product,
‘sales’: sales,
‘quantity’: quantity
})
df = pd.DataFrame(data)
df[‘date’] = pd.to_datetime(df[‘date’])
print(“=” * 60)
print(“売上レポート作成”)
print(“=” * 60)
print(f”\n総データ数: {len(df):,}件”)
print(f”期間: {df[‘date’].min().date()} 〜 {df[‘date’].max().date()}”)
# ========== レポート1: 月次売上サマリー ==========
print(“\n” + “=” * 40)
print(“【レポート1】月次売上サマリー”)
print(“=” * 40)
df[‘year_month’] = df[‘date’].dt.to_period(‘M’)
monthly_report = df.groupby(‘year_month’).agg({
‘sales’: ‘sum’,
‘quantity’: ‘sum’,
‘date’: ‘count’
}).rename(columns={
‘sales’: ‘売上合計’,
‘quantity’: ‘販売数量’,
‘date’: ‘取引件数’
})
# 前月比を計算
monthly_report[‘前月比(%)’] = (monthly_report[‘売上合計’].pct_change() * 100).round(1)
print(monthly_report.head(6))
# ========== レポート2: 店舗×商品のクロス集計 ==========
print(“\n” + “=” * 40)
print(“【レポート2】店舗×商品クロス集計”)
print(“=” * 40)
pivot_store_product = pd.pivot_table(
df,
values=’sales’,
index=’store’,
columns=’product’,
aggfunc=’sum’,
margins=True,
margins_name=’合計’
)
# 金額をフォーマット
print(pivot_store_product.applymap(lambda x: f'{x:,.0f}’))
# ========== レポート3: 店舗別シェア ==========
print(“\n” + “=” * 40)
print(“【レポート3】店舗別シェア”)
print(“=” * 40)
store_share = df.groupby(‘store’)[‘sales’].sum()
store_share_pct = (store_share / store_share.sum() * 100).round(1)
for store, pct in store_share_pct.items():
bar = ‘█’ * int(pct / 5)
print(f”{store}: {pct:5.1f}% {bar}”)
# ========== レポート4: 売上トップ10日 ==========
print(“\n” + “=” * 40)
print(“【レポート4】売上トップ10日”)
print(“=” * 40)
daily_sales = df.groupby(‘date’)[‘sales’].sum().sort_values(ascending=False)
top10_days = daily_sales.head(10)
for i, (date, sales) in enumerate(top10_days.items(), 1):
print(f”{i:2}. {date.strftime(‘%Y-%m-%d’)} ({date.strftime(‘%a’)}): ¥{sales:,}”)
print(“\n” + “=” * 60)
print(“レポート作成完了”)
print(“=” * 60)
【実行結果】
============================================================
売上レポート作成
============================================================
総データ数: 6,876件
期間: 2024-01-01 〜 2024-12-31
========================================
【レポート1】月次売上サマリー
========================================
売上合計 販売数量 取引件数 前月比(%)
year_month
2024-01 15383621 5853 570 NaN
2024-02 14654852 5481 538 -4.7
2024-03 15893254 5937 571 8.5
2024-04 15229531 5750 553 -4.2
2024-05 15823123 5892 574 3.9
2024-06 15428740 5808 565 -2.5
========================================
【レポート2】店舗×商品クロス集計
========================================
product 商品A 商品B 商品C 合計
store
大阪店 20,606,125 20,706,234 20,339,850 61,652,209
東京店 20,636,850 20,752,380 20,566,270 61,955,500
福岡店 20,518,675 20,488,234 20,384,380 61,391,289
合計 61,761,650 61,946,848 61,290,500 184,998,998
========================================
【レポート3】店舗別シェア
========================================
大阪店: 33.3% ██████
東京店: 33.5% ██████
福岡店: 33.2% ██████
========================================
【レポート4】売上トップ10日
========================================
1. 2024-07-24 (Wed): ¥705,595
2. 2024-09-28 (Sat): ¥702,185
3. 2024-03-02 (Sat): ¥700,215
4. 2024-08-20 (Tue): ¥693,490
5. 2024-02-11 (Sun): ¥689,265
6. 2024-12-08 (Sun): ¥686,485
7. 2024-08-06 (Tue): ¥680,490
8. 2024-07-27 (Sat): ¥677,315
9. 2024-06-20 (Thu): ¥674,630
10. 2024-04-10 (Wed): ¥671,985
============================================================
レポート作成完了
============================================================
📝 STEP 11 のまとめ
✅ このステップで学んだこと
groupby() :グループごとに集計(SQLのGROUP BYと同じ)
agg() :複数の集計関数を同時に適用
pivot_table() :クロス集計(Excelのピボットテーブル)
margins :合計行・列の追加
resample() :時系列データの集約(日次→月次など)
rolling() :移動平均の計算
💡 集計のベストプラクティス
集計前に確認 :元データの件数、欠損値をチェック
集計後に確認 :合計値が元データと一致するか確認
わかりやすい名前 :rename()でカラム名を日本語に
ソート :sort_values()で見やすく並べ替え
reset_index() :後続処理のためにDataFrameに戻す
🎯 次のステップの予告
次のSTEP 12では、「データ検証とバリデーション」 を学びます。
データ品質チェックの重要性
スキーマ検証
範囲チェック、NULLチェック
Great Expectations入門
📝 練習問題
問題 1
基礎
categoryカラムでグループ化し、salesカラムの合計を求めてください。
解答を見る
【解答例】
result = df.groupby(‘category’)[‘sales’].sum()
print(result)
問題 2
基礎
storeカラムでグループ化し、salesの合計と平均を同時に求めてください。
解答を見る
【解答例】
result = df.groupby(‘store’)[‘sales’].agg([‘sum’, ‘mean’])
print(result)
問題 3
基礎
行=month、列=store、値=salesのピボットテーブルを作成してください。
解答を見る
【解答例】
pivot = pd.pivot_table(
df,
values=’sales’,
index=’month’,
columns=’store’,
aggfunc=’sum’
)
print(pivot)
問題 4
基礎
日次データを月次(M)に集約してsalesの合計を求めてください。
解答を見る
【解答例】
# インデックスが日付型の場合
monthly = df.resample(‘M’)[‘sales’].sum()
print(monthly)
問題 5
応用
storeとproductの2つのカラムでグループ化し、salesの合計を求め、DataFrameに変換してください。
解答を見る
【解答例】
result = df.groupby([‘store’, ‘product’])[‘sales’].sum().reset_index()
print(result)
問題 6
応用
agg()を使って、salesは合計、quantityは平均、dateは最大値を求めてください。
解答を見る
【解答例】
result = df.groupby(‘store’).agg({
‘sales’: ‘sum’,
‘quantity’: ‘mean’,
‘date’: ‘max’
})
print(result)
問題 7
応用
ピボットテーブルに合計行・合計列を追加してください(margins=True)。
解答を見る
【解答例】
pivot = pd.pivot_table(
df,
values=’sales’,
index=’category’,
columns=’store’,
aggfunc=’sum’,
margins=True,
margins_name=’合計’
)
print(pivot)
問題 8
応用
7日間の移動平均を計算してください。
解答を見る
【解答例】
df[‘MA_7’] = df[‘sales’].rolling(window=7).mean()
print(df)
問題 9
発展
以下の処理を行うコードを書いてください:
① storeでグループ化
② salesの合計、平均、最大、最小を計算
③ カラム名を日本語に変更
④ 合計の降順でソート
解答を見る
【解答例】
result = df.groupby(‘store’)[‘sales’].agg([
(‘売上合計’, ‘sum’),
(‘売上平均’, ‘mean’),
(‘最高売上’, ‘max’),
(‘最低売上’, ‘min’)
]).sort_values(‘売上合計’, ascending=False)
print(result)
問題 10
発展
以下の処理を行うコードを書いてください:
① 日次データを週次(W)に集約してsalesの合計を計算
② 前週比(pct_change)を計算
③ 4週移動平均を計算
解答を見る
【解答例】
# ① 週次集約
weekly = df.resample(‘W’)[‘sales’].sum()
# DataFrameに変換
weekly_df = weekly.reset_index()
weekly_df.columns = [‘week’, ‘sales’]
# ② 前週比
weekly_df[‘前週比(%)’] = (weekly_df[‘sales’].pct_change() * 100).round(1)
# ③ 4週移動平均
weekly_df[‘MA_4’] = weekly_df[‘sales’].rolling(window=4).mean()
print(weekly_df.head(10))