【问题标题】:Applying DataFrame with logic expression to another DataFrame (need Pandas wizards)将带有逻辑表达式的 DataFrame 应用于另一个 DataFrame(需要 Pandas 向导)
【发布时间】:2015-05-20 15:44:36
【问题描述】:

我有一个 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 方法针对适用指标的所有条件执行此操作。期待想法。

【问题讨论】:

    标签: python pandas expression signal-processing


    【解决方案1】:

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

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

    这将是一系列的 nan。对于给定指标名称(在这种情况下为 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 中的第一行,并将所有满足条件的行设置为“折扣”。您可以对每一行执行相同的操作。从示例中很难看出,但如果您有多个列,您可能希望将信号作为 DataFrame。您可以使用

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

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

    【讨论】:

    • 谢谢,这很有帮助
    猜你喜欢
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多