diff()函数两种调用方式结果差异的原因及含义咨询
问题原因拆解
嘿,这个现象其实很好解释,核心就在于**diff()的调用时机不同,导致绘图的对象完全不一样,但求和逻辑本质是同一个东西**:
1. 为什么cumdev结果一模一样?
咱们先看两个场景里的df定义:
- 场景1中,你直接把
df定义成了平滑归一化后序列的全局diff结果:df = ((data['teak-share'].rolling(...).mean() - ...)/...).diff() - 场景2中,
df是平滑归一化的原始序列,只在计算cumdev时才对整个df调用diff():cumdev = cumdev + df.diff()[data[...]['Simulation No'].values + n].sum()
本质上,场景1的df 完全等于 场景2中df.diff()的结果。所以当你对两个场景里完全相同的索引位置取值求和时,结果自然完全一致——就像你先把整个数组做差再挑部分求和,和先对整个数组做差再挑部分求和,拿到的是同一组数值,求和结果当然没区别。
2. 为什么绘图结果差这么多?
这就更直观了:两个场景传给plot()的是完全不同的序列:
- 场景1画的是每轮trial的变化量:也就是平滑归一化后的teak-share序列,相邻trial之间的差值,展示的是“每一轮相对于上一轮的波动幅度”;
- 场景2画的是teak-share的平滑归一化累积值本身:展示的是“参与者柚木播种收获累积差的整体趋势”。
举个极简例子:如果平滑后的序列是[1, 3, 6, 10],diff后的序列就是[NaN, 2, 3, 4]——前者是数值本身,后者是相邻差值,画出来的图肯定完全不一样,但如果取索引2和3的元素求和,前者diff后的求和是3+4=7,后者先diff再取索引2和3求和也是3+4=7,结果完全一致。
内容的提问来源于stack exchange,提问作者Arjun Mitra
相关产品推荐
相关产品推荐

