python - 熊猫:功能转变:“模棱两可的真值”
问题描述
我有一个由 dateIndex 和 price 列组成的数据框,如下所示:
DATE | PRICE
01-01-2018 100
02-01-2018 101
03-01-2018 97
我编写了一个函数来计算连续价格与之前 3 行(“天”)的价格之间的差异。(我知道还有其他的 pandas 方法可以实现这一点,但是这个函数是一个存根,我想稍后扩展)
def case1(x):
prevrow = x.shift(3)
if np.isnan(prevrow['price']):
pass
else:
if x['price'] > prevrow['price']:
diff = prevrow['price'] - x['price']
print('The diff is {}').format(diff)
但是,当我尝试运行 ( case1(df)
) 这个函数时,我遇到了
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
错误。它似乎是NaN
在函数开头移位生成的 3 个值上触发的。但是添加对NaN
值的检查仍然会导致相同的错误消息。
有谁知道我做错了什么?
解决方案
让我们考虑一个更大的数据框以获得更好的可视化:
DATE | price
01-01-2018 100
02-01-2018 101
03-01-2018 97
04-01-2018 102
05-01-2018 100
06-01-2018 107
07-01-2018 38
您的代码中有一些问题。您正在尝试使用数组而不是单个值进行布尔运算。一个解法:
def case1(x):
# New df with a new column for shift prices
df = x.assign(price_prevrow= x.shift(3)['price'])
if np.isnan(df['price_prevrow']).all(): # Check ALL values
pass
else:
# Slice df to get only rows with price greater than price_prevrow
df = df.loc[df['price'] > df['price_prevrow']]
# Calculate difference
diff = df['price_prevrow'] - df['price']
# Print all differences
for d in diff:
print('The diff is {}'.format(d))
上面的代码创建了一个新的数据框,其中包含了价格变化后的价格,然后将该数据框分割为价格值大于 prevrow 值的行。在此之后,差异很容易。
输出:
"The diff is -2.0"
"The diff is -10.0"
推荐阅读
- esp8266 - SPIFFS 更改文件中特定行的内容
- windows - 使用 PSwindowsUpdate 模块自动执行 Windows Server 更新。问题
- swift - 在树中迭代
- python - 我无法让 Kivy 屏幕管理器在这个特定的应用程序中工作,我已经让它在其他程序中工作我真的无法让它在这个应用程序中工作
- javascript - 如何在 Javascript 中循环 Django 查询集
- android - 如何在没有BottomNavigationView的情况下使用BottomNavigationView和内部屏幕实现带有少量片段的Single Activity?
- python - 从 numpy 数组中获取最后 x 个非 nan 元素
- html - 为什么添加 1px 填充在 div 的高度中添加 10px
- r - 根据一组条件计算多列中每一行的自定义平均值
- python - 根据时间动画散点图