python - 如何在 df.rolling.apply 中生成多个输出?
问题描述
data = pd.DataFrame(np.random.random((200, 10)), columns=[*'ABCDEFGHIJ'])
============================
A B C ... H I J
0 0.037608 0.301907 0.392480 ... 0.933584 0.183160 0.704827
1 0.916830 0.419919 0.890444 ... 0.683593 0.004465 0.750646
2 0.631486 0.234803 0.723553 ... 0.960028 0.303452 0.692989
3 0.357510 0.506667 0.928800 ... 0.707072 0.429867 0.993928
4 0.933780 0.083027 0.164354 ... 0.463918 0.291948 0.498712
.. ... ... ... ... ... ... ...
195 0.229429 0.960220 0.321908 ... 0.825912 0.405020 0.230486
196 0.733413 0.226747 0.707638 ... 0.746275 0.865566 0.579064
197 0.792347 0.440722 0.640206 ... 0.128993 0.161051 0.327097
198 0.399510 0.909695 0.361036 ... 0.604576 0.132304 0.929926
199 0.065853 0.833491 0.526684 ... 0.049173 0.693042 0.196375
============================
def foo(arr):
return pd.Series([*'XYZ'], index=[*'RST'])
============================
data.agg({'A': foo, 'B': foo})
A B
R S T R S T
0 X Y Z X Y Z
1 X Y Z X Y Z
2 X Y Z X Y Z
3 X Y Z X Y Z
4 X Y Z X Y Z
.. .. .. .. .. .. ..
195 X Y Z X Y Z
196 X Y Z X Y Z
197 X Y Z X Y Z
198 X Y Z X Y Z
199 X Y Z X Y Z
-----------------------------
data.rolling(10).agg({'A': foo, 'B': foo})
TypeError: cannot convert the series to <class 'float'>
看来rolling apply,rolling agg只接受单一输出,而且必须是float。
有没有办法像 data.agg 那样生成具有多索引的列?
我需要在滚动窗口上计算一些统计数据,它们共享一些中间变量。因此,一次计算它们可以节省大量时间。
例如,如果我想要偏度和峰度,那么我可以重用中间变量,如二阶矩、均值等。如果我分别为偏度和峰度编写独立函数,则计算过程将是多余的。
解决方案
IIUC,这有效:
df = pd.DataFrame({'A':np.arange(100),
'B':np.arange(100,10001,100),
'C':np.arange(1000,100001,1000)})
df.rolling(3).agg(['max','min','std'])
输出:
A B C
max min std max min std max min std
0 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 2.0 0.0 1.0 300.0 100.0 100.0 3000.0 1000.0 1000.0
3 3.0 1.0 1.0 400.0 200.0 100.0 4000.0 2000.0 1000.0
4 4.0 2.0 1.0 500.0 300.0 100.0 5000.0 3000.0 1000.0
5 5.0 3.0 1.0 600.0 400.0 100.0 6000.0 4000.0 1000.0
6 6.0 4.0 1.0 700.0 500.0 100.0 7000.0 5000.0 1000.0
7 7.0 5.0 1.0 800.0 600.0 100.0 8000.0 6000.0 1000.0
8 8.0 6.0 1.0 900.0 700.0 100.0 9000.0 7000.0 1000.0
9 9.0 7.0 1.0 1000.0 800.0 100.0 10000.0 8000.0 1000.0
推荐阅读
- python - 使用 TKinter 从 GUI 插入数据到 SQLite3
- nginx - 在 nginx Ingress 中使用自签名证书
- ubuntu - Anaconda 无法在 kde linux 中打开终端
- python - 为什么列表“table_x”在“for”完成后获取列表“table_cards”的值?
- php - 集成 php 和 google sheet api 时出错
- java - restMockMvc - 预期:一个包含 <1.0F> 的集合,但:是 <1.0>
- docker - Docker Compose ECS 负载均衡器未配置
- linux - AWS CLI S3 CP --recursive 函数在控制台中有效,但在 .sh 文件中无效
- flutter - 如何使用颤振和 Firestore 创建聊天室
- python - 带有 setWordWrap(True) 的 QLabel 在放置在 QListWidget 中时不会垂直调整大小,即使 resizeMode 已设置为 Adjust