我能夠得到我需要的結果,但很想知道這是否可以更有效地完成(如在更少的步驟中)或通過一些內置函式。
作為模型資料,我有 3 年的每日小部件銷售量。目標是比較上一年同季度的銷售總額。因此,與 2020 年第一季度相比,2019 年第一季度的銷售額;2020 年第一季度至 2021 年第一季度的銷售額;2019 年第二季度至 2020 年第二季度等。
我的策略是:
- 將銷售資料重采樣/下采樣到季度
- 創建一個條件,創建一個新列,命名每個季度的值,如 Q1、Q2、Q3 和 Q4。
- 創建一個只有年份的列。
- 通過 groupby 創建一個新的 df,這會產生一個多索引 df,它按年對每個季度進行分組……所以所有 Q1 都在一起并按年列出。
- 現在我們做另一個 groupby 來逐年找出類似季度的差異。
這是帶有重新采樣/下采樣資料的代碼:
sample_data = [{'date': Timestamp('2019-03-31 00:00:00'), '#_widgets': 4502},
{'date': Timestamp('2019-06-30 00:00:00'), '#_widgets': 4388},
{'date': Timestamp('2019-09-30 00:00:00'), '#_widgets': 4703},
{'date': Timestamp('2019-12-31 00:00:00'), '#_widgets': 4344},
{'date': Timestamp('2020-03-31 00:00:00'), '#_widgets': 4206},
{'date': Timestamp('2020-06-30 00:00:00'), '#_widgets': 4281},
{'date': Timestamp('2020-09-30 00:00:00'), '#_widgets': 4879},
{'date': Timestamp('2020-12-31 00:00:00'), '#_widgets': 4115},
{'date': Timestamp('2021-03-31 00:00:00'), '#_widgets': 4313},
{'date': Timestamp('2021-06-30 00:00:00'), '#_widgets': 4578},
{'date': Timestamp('2021-09-30 00:00:00'), '#_widgets': 4467},
{'date': Timestamp('2021-12-31 00:00:00'), '#_widgets': 4871}]
匯入庫
import pandas as pd
from datetime import datetime
import numpy as np
創建條件以添加 Q1、Q2 等,使用 Q1 將有第 3 個月、Q2 第 6 個月等的想法。
abbrv = dfq["date"].dt.month
conditions = {
"Q1": abbrv == 3,
"Q2": abbrv == 6,
"Q3": abbrv == 9,
"Q4": abbrv == 12
}
然后我通過了條件:
## use numpy to run conditions
dfq['quarter'] = np.select(conditions.values(), conditions.keys(), default="Not Available")
添加一個年份列,以便我可以抱怨:
## add years to it
dfq["year"] = dfq["date"].dt.year
使用 groupby 創建新的 df:
## group by to get sort by quarters in each year
dff = dfq.groupby(["quarter", "year", ])["#_widgets"].sum().to_frame()
在我的最后一步中,我再次分組,但得到了同期季度的差異:
## find the difference for previous year quarter comparisons
dff['diff'] = dff.groupby(['quarter']).diff()
這很好用,但似乎必須有一種方法可以減少步驟而不增加太多復雜性。
uj5u.com熱心網友回復:
您的方法對我來說看起來不錯,您當然可以通過使用呼叫的 pandas 內置方法to_period將日期時間直接轉換為季度來使其更簡潔。
d = df['date'].dt.to_period('Q').dt
df['year'], df['quarter'] = d.year, d.quarter
dff = df.groupby(['quarter', 'year'], as_index=False)['#_widgets'].sum()
dff['diff'] = dff.groupby('quarter')['#_widgets'].diff()
結果
quarter year #_widgets diff
0 1 2019 4502 NaN
1 1 2020 4206 -296.0
2 1 2021 4313 107.0
3 2 2019 4388 NaN
4 2 2020 4281 -107.0
5 2 2021 4578 297.0
6 3 2019 4703 NaN
7 3 2020 4879 176.0
8 3 2021 4467 -412.0
9 4 2019 4344 NaN
10 4 2020 4115 -229.0
11 4 2021 4871 756.0
如果您有興趣嘗試,這是具有不同輸出表示的替代方法:-)
d = df['date'].dt.to_period('Q').dt
df['year'], df['quarter'] = d.year, d.quarter
s = df.pivot_table('#_widgets', 'quarter', 'year', aggfunc='sum')
pd.concat([s, s.diff(axis=1)], axis=1, keys=['#_widgets', 'diff'])
結果
#_widgets diff
year 2019 2020 2021 2019 2020 2021
quarter
1 4502 4206 4313 NaN -296 107
2 4388 4281 4578 NaN -107 297
3 4703 4879 4467 NaN 176 -412
4 4344 4115 4871 NaN -229 756
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/512090.html
上一篇:如何使用groupby在python中提取與每個日期相關的最接近到期??日期
下一篇:我有一個與使用python和Beautifulsoup從網站上抓取日期相關的問題,就像`.split('.',"")
