【问题标题】:How to compare multiple rows from same column in DataFrame如何比较DataFrame中同一列的多行
【发布时间】:2016-08-31 23:25:02
【问题描述】:

我有一个股票价格数据帧,我想在单独的数据帧中创建一列布尔值

带有价格数据的 DataFrame 有一个使用 DateTime 索引。

我正在尝试检查股票价格是否连续 3 天上涨,如果是,那么我希望其他 DataFrame 在第三天显示 True。

这是我尝试过的所有事情

df_signal['3DayIncrease'] = df_prices[symbol_name].shift(3) < df_prices[symbol_name].shift(2) < df_prices[symbol_name].shift(1) < df_prices[symbol_name]


df_signal['3DayIncrease'] = df_prices[symbol_name].shift(3) < df_prices[symbol_name].shift(2) & \
                            df_prices[symbol_name].shift(2) < df_prices[symbol_name].shift(1) & \
                            df_prices[symbol_name].shift(1) < df_prices[symbol_name]

df_signal['3DayIncrease'] = df_prices[symbol_name].shift(3) < df_prices[symbol_name].shift(2) and \
                            df_prices[symbol_name].shift(2) < df_prices[symbol_name].shift(1) and \
                            df_prices[symbol_name].shift(1) < df_prices[symbol_name]

我正在为这个抓住稻草

df_signals['3DayIncrease'] = ((df_prices[symbol_name].shift(3) < df_prices[symbol_name].shift(2)) == True) and \
                             ((df_prices[symbol_name].shift(2) < df_prices[symbol_name].shift(1)) == True) and \
                             ((df_prices[symbol_name].shift(1) < df_prices[symbol_name]) == True)

如果我一次只比较两行,它工作正常。例如

df_signal['3DayIncrease'] = df_prices[symbol_name].shift(3) < df_prices[symbol_name].shift(2)

工作没有任何问题,但显然没有做我想要的。

【问题讨论】:

    标签: python pandas time-series timeserieschart


    【解决方案1】:

    您的方法有效。稍微简化一下你的代码

    import numpy as np
    import pandas as pd
    s = pd.DataFrame({"p":[2, 3, 5, 6, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8]})
    s['inc3days'] = ((s['p'].shift(3) < s['p'].shift(2)) &  
                     (s['p'].shift(2) < s['p'].shift(1)) &  
                     (s['p'].shift(1) < s['p']) )
    print s
    

    这是我得到的

        p inc3days
    0   2    False
    1   3    False
    2   5    False
    3   6     True
    4   3    False
    5   4    False
    6   5    False
    7   6     True
    8   7     True
    9   4    False
    10  5    False
    11  6    False
    12  7     True
    13  8     True
    

    【讨论】:

      【解决方案2】:

      滚动差异应该适用于您的情况:

      df
      Out[51]: 
                  values
      2010-01-01       1
      2010-01-02       2
      2010-01-03       0
      2010-01-04       4
      2010-01-05       5
      2010-01-06       2
      2010-01-07       1
      2010-01-08       3
      2010-01-09       4
      2010-01-10       6
      2010-01-11       2
      2010-01-12       0
      
      
      df["values"].diff(1).rolling(3).apply(lambda x: all(x>0)).fillna(0).astype(bool)
      Out[55]: 
      2010-01-01    False
      2010-01-02    False
      2010-01-03    False
      2010-01-04    False
      2010-01-05    False
      2010-01-06    False
      2010-01-07    False
      2010-01-08    False
      2010-01-09    False
      2010-01-10     True
      2010-01-11    False
      2010-01-12    False
      Freq: D, Name: values, dtype: bool
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-16
        • 1970-01-01
        • 2023-01-11
        相关资源
        最近更新 更多