我在使用Python(2.7.6.2)/Pandas(0.13和0.18)时遇到了一个奇怪的问题,当我在DataFrame上应用公式时,使用map / lambda与直接应用数字的结果似乎会有所不同。对于我来说,这似乎是一个错误,并且我很想知道原因以及如何避免这种问题。...
现在,我已经准备好了一个案例,可以重现此问题,这使问题有些清晰:
我猜测这是由于数字表示不准确,但是当我直接在数字上应用公式时,会得到不同的行为:
为了让问题更加混乱,当我使用包含相同相关值的稍短数据框时,使用map也会得到不同结果:
现在,我已经准备好了一个案例,可以重现此问题,这使问题有些清晰:
data15min = [ 5.4753, 5.4863, 5.2497, 5.057, 5.0917, 5.3467, 5.7513, 5.6, 5.342 ]
index = pd.date_range("2015-10-17 18:00:00", periods=9, freq='15T')
columns = ['v03']
df15 = pd.DataFrame(data15min, index=index, columns=columns)
df_h = df15.rolling(min_periods=4,window=4,center=False).mean()
df_m = df_h['v03'].map(lambda x: np.nan if np.isnan(x) else int(x*100.))
df_h的最后一个值是错误计算出来的。这个值本身看起来很好(5.3467、5.7513、5.6、5.342的平均值恰好为5.51):
In [99]: df_h
Out[99]:
v03
2015-10-17 18:00:00 NaN
2015-10-17 18:15:00 NaN
2015-10-17 18:30:00 NaN
2015-10-17 18:45:00 5.317075
2015-10-17 19:00:00 5.221175
2015-10-17 19:15:00 5.186275
2015-10-17 19:30:00 5.311675
2015-10-17 19:45:00 5.447425
2015-10-17 20:00:00 5.510000
使用map函数后,我得到的结果是550:
In [100]: df_m
Out[100]:
2015-10-17 18:00:00 NaN
2015-10-17 18:15:00 NaN
2015-10-17 18:30:00 NaN
2015-10-17 18:45:00 531.0
2015-10-17 19:00:00 522.0
2015-10-17 19:15:00 518.0
2015-10-17 19:30:00 531.0
2015-10-17 19:45:00 544.0
2015-10-17 20:00:00 550.0
Freq: 15T, Name: v03, dtype: float64
我猜测这是由于数字表示不准确,但是当我直接在数字上应用公式时,会得到不同的行为:
In [103]: int(np.mean([5.3467, 5.7513, 5.6, 5.342])*100.)
Out[103]: 551
为了让问题更加混乱,当我使用包含相同相关值的稍短数据框时,使用map也会得到不同结果:
data15min = [ 5.3467, 5.7513, 5.6, 5.342 ]
index = pd.date_range("2015-10-17 19:15:00", periods=4, freq='15T')
columns = ['v03']
df15 = pd.DataFrame(data15min, index=index, columns=columns)
df_h = df15.rolling(min_periods=4,window=4,center=False).mean()
df_m = df_h['v03'].map(lambda x: np.nan if np.isnan(x) else int(x*100.))
In [104]: df_m
Out[104]:
2015-10-17 19:15:00 NaN
2015-10-17 19:30:00 NaN
2015-10-17 19:45:00 NaN
2015-10-17 20:00:00 551.0
Freq: 15T, Name: v03, dtype: float64
我很困惑,也很担心会得到错误的结果。如果这与内部数字表示不准确有关(如果这个问题在展示的情况下有不同行为,那就令人惊讶了),我真的很想知道如何避免从中得到错误的结果。