在比较简单的d之后,如何在Python中修复“序列的真值是不明确的”

2024-04-25 03:35:15 发布

您现在位置:Python中文网/ 问答频道 /正文

在从雅虎获得比特币(BTC-USD)的数据之后,我尝试创建一个新的列来显示每天的收盘价是否高于开盘价。你知道吗

我要做的是创建一个列,当Close高于Open时显示1。如果条件不成立,则为0。你知道吗

当我尝试比较关闭值和打开值时,我会收到下一条消息:ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。你知道吗

我尝试过几种方法来解决这个问题(比如直接从Yahoo导入CSV数据),但不幸的是我找不到解决方案。你知道吗

下面您可以看到我使用的代码:

import pandas as pd
import pandas_datareader as dr
df = dr.data.get_data_yahoo('btc-usd',start = '01-01-2015', end= '31-12-2018')
df.head(2)

df['X'] = [1 if (df.loc[ei,'Close'] > df.loc[ei,'Open'])  else 0 for ei in df.index] #---> The error is produced in this line of code
df.tail()

下面您可以看到错误消息:

ValueError                                Traceback (most recent call last)
<ipython-input-45-eb64775bf24f> in <module>
----> 1 df['X'] = [1 if (df.loc[ei,'Close'] > df.loc[ei,'Open'])  else 0 for ei in df.index]
      2 df.tail()

<ipython-input-45-eb64775bf24f> in <listcomp>(.0)
----> 1 df['X'] = [1 if (df.loc[ei,'Close'] > df.loc[ei,'Open'])  else 0 for ei in df.index]
      2 df.tail()

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
   1476         raise ValueError("The truth value of a {0} is ambiguous. "
   1477                          "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
-> 1478                          .format(self.__class__.__name__))
   1479 
   1480     __bool__ = __nonzero__

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我想得到这个公式的结果。关闭时为1,条件为false时为0。你知道吗


Tags: inpandasdfcloseifanyopenall
2条回答

如果要在Close>;open时在列中放置1,只需使用np.where

import numpy as np
df['X'] = np.where(df['Close']>df['Open'],1,0)

第二个解决方案可能是

df['X'] = 0
df.loc[df['Close']>df['Open'],"X"] = 1
print(df)
                 High   Low          Open       Close        Volume     Adj Close   X
Date                            
2014-12-31  319.089996  308.890015  311.269989  318.239990  6472822    318.239990   1
2015-01-01  321.359985  313.540009  318.239990  314.890015  4073067    314.890015   0
2015-01-02  316.399994  313.079987  314.890015  315.209991  4673971    315.209991   1
2015-01-03  315.829987  284.890015  315.209991  287.130005  14209564    287.130005  0
2015-01-04  289.940002  255.869995  287.130005  264.720001  24255392    264.720001  0

您可以在列表理解之外进行系列比较,如下所示:

df['X'] = 1*(df['Close'] > df['Open'])

会有用的。序列比较返回具有真/假值的序列。你可以把真值乘以1得到你想要的结果。你知道吗

如果需要更复杂的函数,可以在df['Close'] > df['Open']系列中使用.apply(我将用简单的1/0来显示它,但您可以从中选择它):

df['X'] = (df['Close'] > df['Open']).apply(lambda x: 1 if x else 0)

相关问题 更多 >