【问题标题】:df.apply return NaN in pandas dataframedf.apply 在熊猫数据框中返回 NaN
【发布时间】:2021-11-24 09:34:23
【问题描述】:

我正在尝试通过这样做,根据某些因素,用 1、0 或 -1 填充数据框中的一列:

def set_order_signal(row):
    
    if (row.MACD > row.SIGNAL) and (df.iloc[i-1].MACD < df.iloc[i-1].SIGNAL):
        if (row.MACD < 0 and row.SIGNAL < 0) and (row.close > row['200EMA']): 
            return 1
            
    elif (row.MACD < row.SIGNAL) and (df.iloc[i-1].MACD > df.iloc[i-1].SIGNAL):
        if (row.MACD > 0 and row.SIGNAL > 0) and (row.close < row['200EMA']):
            return -1
    else:
        return 0

有时它有效,但在其他行中它返回“NaN”。我找不到原因或解决方案。

我使用的数据框如下所示:

time    open    high    low close   tick_volume spread  real_volume EMA_LONG    EMA_SHORT   MACD    SIGNAL  HIST    200EMA  OrderSignal
0   2018-01-09 05:00:00 1.19726 1.19751 1.19675 1.19717 1773    1   0   1.197605    1.197152    -0.000453   -0.000453   0.000000e+00    1.197170    0.0
1   2018-01-09 06:00:00 1.19717 1.19724 1.19659 1.19681 1477    1   0   1.197538    1.197099    -0.000439   -0.000445   6.258599e-06    1.196989    0.0
2   2018-01-09 07:00:00 1.19681 1.19718 1.19642 1.19651 1622    1   0   1.197452    1.197008    -0.000444   -0.000445   5.327180e-07    1.196828    0.0
3   2018-01-09 08:00:00 1.19650 1.19650 1.19518 1.19560 3543    1   0   1.197298    1.196789    -0.000509   -0.000466   -4.237181e-05   1.196516    NaN

我正在尝试将其应用于 df:

df['OrderSignal'] = df.apply(set_order_signal, axis=1)

是格式问题吗?

已经谢谢你了!

【问题讨论】:

  • 你的函数中的 i 是什么?
  • 我认为“i”是应用函数在遍历 df 时在其中的索引。所以使用 'df.iloc[i-1]' 我想要上一行。
  • 你会怎么做?我找不到 i 是什么,但它也不会抛出错误

标签: python pandas dataframe nan


【解决方案1】:

如果要查找发送给函数的行的索引,则需要使用 row.name,而不是 i。

试试这个,看看你会得到什么结果。无法判断逻辑是否在所有情况下都正确,但四行每次都返回0

def set_order_signal(row):
    if (row.MACD > row.SIGNAL) and (df.iloc[row.name-1].MACD < df.iloc[row.name-1].SIGNAL):
        if (row.MACD < 0 and row.SIGNAL < 0) and (row.close > row['200EMA']): 
            return 1
            
    elif (row.MACD < row.SIGNAL) and (df.iloc[row.name-1].MACD > df.iloc[row.name-1].SIGNAL):
        if (row.MACD > 0 and row.SIGNAL > 0) and (row.close < row['200EMA']):
            return -1
    else:
        return 0

【讨论】:

  • 好吧,至少我现在得到了一些 '1' 而其他的是 '0' 或 NaN。但仍然没有'-1'。可能是因为格式。也许该列的格式无法返回“-1”并用 NaN 替换它?
  • 考虑将条件重写为一个语句,而不是嵌套 ifs。有可能它正在评估第一个并返回 1,但在某些情况下不知何故无法继续并产生一个 Nan。如果您发布更多您确定包含所有三种情况的数据,我们可以查看逻辑。
  • 您好,很抱歉回复晚了。我发现了问题。确实是df中无法写入的“-1”。我现在已经改变了它,而不是“-1”,而是写一个“2”并且它可以工作。仍然非常感谢您的宝贵时间!
  • 有趣。不会认为这是问题,但很高兴您找到了解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 2022-07-22
  • 2020-06-04
  • 2017-08-03
  • 2019-10-07
  • 1970-01-01
相关资源
最近更新 更多