如何比较DataFrame中同一列的多行

How to compare multiple rows from same column in DataFrame

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

包含价格数据的 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)

工作没有任何问题,但显然没有按照我的意愿进行。

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

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

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

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