将具有逻辑表达式的 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():
对于完全矢量化的解决方案,您需要提供更完整的示例。
我有一个 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():
对于完全矢量化的解决方案,您需要提供更完整的示例。