将具有逻辑表达式的 DataFrame 应用到另一个 DataFrame(需要 Pandas 个向导)

Applying DataFrame with logic expression to another DataFrame (need Pandas wizards)

我有一个 DataFrame conditions,其中包含一组条件,可以像表达式一样使用:

             indicator     logic    value
Discount  'ADR Premium'     '<'     -0.5
Premium   'ADR Premium'     '>'      0.5

现在我有一个包含一组值的数据框 indicators,在这种情况下只有一个指标 ADR Premium:

                             ADR Premium
2015-04-20 15:30:00-04:00    -0.102270
2015-04-21 15:30:00-04:00     0.235315
2015-04-22 15:30:00-04:00    -0.323919
2015-04-23 15:30:00-04:00     0.546363
2015-04-24 15:30:00-04:00    -0.714143
2015-04-27 15:30:00-04:00    -0.153165
2015-04-28 15:30:00-04:00     0.878494
2015-04-29 15:30:00-04:00     0.993079
2015-04-30 15:30:00-04:00    -0.824815
2015-05-04 15:30:00-04:00     1.644784
2015-05-05 15:30:00-04:00    -0.254343
2015-05-06 15:30:00-04:00    -0.268981
2015-05-07 15:30:00-04:00     0.591411
2015-05-08 15:30:00-04:00    -0.588047
2015-05-11 15:30:00-04:00    -0.458143
2015-05-12 15:30:00-04:00     0.063643
2015-05-13 15:30:00-04:00    -0.051659
2015-05-14 15:30:00-04:00     1.474963
2015-05-15 15:30:00-04:00    -0.172429
2015-05-18 15:30:00-04:00     0.035558

我希望实现的是将 conditions 的逻辑应用到 indicators 以生成一个名为 signals 的新数据帧。为了让您了解我在寻找什么,请参阅下文。这只查看 conditions 中的第一个条件和 indicator 中的第五个值(因为它的计算结果为 True):

signals_list = []

conditions_index = 0
indicators_index = 4

if eval( str(indicators[conditions.ix[conditions_index].indicator][indicators_index]) + conditions.ix[conditions_index].log
ic + str(conditions.ix[conditions_index].value) ):

    signal = {'Time': indicators.ix[indicators_index].name,
              'Signal': conditions.ix[conditions_index].name}

    signals_list.append(signal)

signals = pd.DataFrame(signals_list)
signals.index = signals.Time
signals.drop('Time', 1)

这让我 signals:

                             Signal
Time
2015-04-24 15:30:00-04:00  'Discount'

我想以最有效的 Pandas-ic 方法针对适用指标的所有条件执行此操作。期待想法。

很难从问题中分辨出来,但我认为您只想根据该列的一组条件对 indicators 中的每个条目进行分类。首先我会初始化信号:

signals = pd.Series(index=indicators.index)

这将是一系列 nans。对于给定的指标名称(在本例中为 ADR 溢价)、逻辑、值和分类,您可以执行类似

的操作
bool_vector = indicators.eval(' '.join(indicator, logic, value))
signals[bool_vector] = classification

在给出的示例中,这将转换为

bool_vector = indicators.eval('ADR Premium < -0.5) 
signals[bool_vector] = 'discount'

对于conditions中的第一行,并将所有满足条件的行设置为'discount'。您可以对每一行执行相同的操作。很难从示例中看出,但如果您有多个列,您可能希望将信号作为 DataFrame。您可以使用

遍历 conditions
for classification, (indicator, logic, value) in conditions.iterrows():

对于完全矢量化的解决方案,您需要提供更完整的示例。