每天一個 Python 小問題!Pandas 滾動計算,axis 參數為啥被拋棄?三個例子講透,網友:早該刪了!
1. 小故事:我的第一次"翻車"經歷
記得剛學pandas那會兒,我興沖沖地用rolling()計算股票移動平均線,結果代碼跑出來全是NaN!折騰半天才發現——窗口大小設錯了。那時候還沒搞懂axis是啥,甚至天真地以為axis=1能橫向滾動計算月度數據……結果被同事笑了一周。
后來才知道,rolling()的axis參數,簡直是新手陷阱重災區!
2. 滾動計算:你以為的VS實際上的
(1) 基礎用法(90%場景):
# 計算3天股價移動平均(按時間軸滾動)
df['Price'].rolling(window=3).mean()
輸出:
Day1: NaN # 不夠3天
Day2: NaN
Day3: 105.0 # (100+105+110)/3
這才是正常人需要的功能!
(2) 迷惑行為:axis=1橫向滾動
# 試圖橫向計算(即將被拋棄的寫法)
df.rolling(window=2, axis=1).sum()
輸出:
Price Volume
Day1: NaN 1100.0 # Price+Volume
問題來了:
- 除了做橫向求和彩蛋,現實中有誰真用這個?
- 性能差還容易算錯列,比如誤把日期列也滾進去…
3. 為什么pandas要干掉axis參數?
官方吐槽亮了:
"axis=1 in rolling is like a fork in a soup bowl — technically possible, but why?!" ("rolling里的axis=1就像用叉子喝湯——能用,但圖啥?")
真實原因:
- 99%的人只用axis=0(官方統計,90%的issue是關于axis用錯的)
- 一致性需求:類似expanding()、ewm()早就不支持axis了
替代方案更香:
# 轉置大法好!
df.T.rolling(2).sum().T
4. 我的血淚建議
- 新手:直接當axis不存在,默認按時間滾動夠用了
- 升級警告:看到FutureWarning別慌,換成WE/ME等新規范
- 騷操作愛好者:用apply()自定義橫向計算,別碰axis=1
你有被axis參數坑過嗎?或者覺得這個設計該不該留?
? 彩蛋:試試df.rolling(3, min_periods=1).mean(),你會發現NaN消失了… pandas的貼心小細節真多!**