STEP 11:集計と集約

📊 STEP 11: 集計と集約

groupbyとpivot_tableでデータを要約しよう

📋 このステップで学ぶこと

  • 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():移動平均の計算
💡 集計のベストプラクティス
  1. 集計前に確認:元データの件数、欠損値をチェック
  2. 集計後に確認:合計値が元データと一致するか確認
  3. わかりやすい名前:rename()でカラム名を日本語に
  4. ソート:sort_values()で見やすく並べ替え
  5. 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))

📝

学習メモ

ETL・データパイプライン構築 - Step 11

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE