如何比较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
我有一个股票价格 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