Python 熊猫的逻辑操作问题

Python 熊猫的逻辑操作问题,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有以下代码: import pandas as pd from pandas import datetime from pandas import DataFrame as df from pandas_datareader import data as web import datetime import numpy as np stock = '^GSPC' start = datetime.date(2018,1,1) end = datetime.date.today() data

我有以下代码:

import pandas as pd
from pandas import datetime
from pandas import DataFrame as df
from pandas_datareader import data as web
import datetime
import numpy as np

stock = '^GSPC'
start = datetime.date(2018,1,1)
end = datetime.date.today()

data = web.DataReader(stock, 'yahoo',start, end)
这将产生以下结果:

                   High          Low  ...      Volume    Adj Close
Date                                  ...                         
2018-01-02  2695.889893  2682.360107  ...  3367250000  2695.810059
2018-01-03  2714.370117  2697.770020  ...  3538660000  2713.060059
2018-01-04  2729.290039  2719.070068  ...  3695260000  2723.989990
2018-01-05  2743.449951  2727.919922  ...  3236620000  2743.149902
2018-01-08  2748.510010  2737.600098  ...  3242650000  2747.709961
                ...          ...  ...         ...          ...
2020-04-08  2760.750000  2663.300049  ...  5856370000  2749.979980
2020-04-09  2818.570068  2762.360107  ...  7880140000  2789.820068
2020-04-13  2782.459961  2721.169922  ...  5274310000  2761.629883
2020-04-14  2851.850098  2805.100098  ...  5567400000  2846.060059
2020-04-15  2801.879883  2761.540039  ...  5203390000  2783.360107

[575 rows x 6 columns]
我们有以下布尔逻辑:

(data['Close'].shift(2) < data['Open'].shift(1)) & (data['Close'].shift(1) > data['Open'].shift(2))
这是不对的,它应该像图片一样。我确信布尔逻辑有问题。如果您能提供我所使用的逻辑方面的帮助,我将不胜感激


我希望输出为一个系列,如下所示:

2020-04-03     True
2020-04-06    False
2020-04-07    False
2020-04-08    False
2020-04-09    False
2020-04-13    False
2020-04-14    False
2020-04-15    False
dtype: bool

只需将条件更改为
(数据['Close'].shift(2)>数据['Open'].shift(1))&(数据['Close'].shift(1)>数据['Open'].shift(2))
。 以下是一个示例:

data['Closeshift2'] = data['Close'].shift(2)
data['OpenShift1'] = data['Open'].shift(1)
data['CloseShift1'] = data['Close'].shift(1)
data['OpenShift2'] = data['Open'].shift(2)
data['Bool']  = (data['Closeshift2'] > data['OpenShift1']) & (data['CloseShift1'] > data['OpenShift2'])
data[-11:-8]
其结果是:

            High        Low         Open        Close       Volume      Adj Close   Closeshift2 OpenShift1  CloseShift1 OpenShift2  Bool
Date                                            
2020-04-01  2522.750000 2447.489990 2498.080078 2470.500000 5947900000  2470.500000 2626.649902 2614.689941 2584.590088 2558.979980 True
2020-04-02  2533.219971 2455.790039 2458.540039 2526.899902 6454990000  2526.899902 2584.590088 2498.080078 2470.500000 2614.689941 False
2020-04-03  2538.179932 2459.959961 2514.919922 2488.649902 6087190000  2488.649902 2470.500000 2458.540039 2526.899902 2498.080078 True

这是您在图片中显示的结果

请举例说明您所期望的输出。我已更新了问题。请重新检查您的执行情况,因为我运行了您的代码并获得了准确的输出。我的pandas_datareader版本是0.8.1为什么今天是
shift(1)
,昨天是
shift(2)
,是不是今天是
shift(0)
,昨天是
shift(1)
?你的代码与你的陈述相矛盾。您的代码:
(data['Close'].shift(2)data['Open'].shift(2))
与您的陈述:昨天的收盘>今天的收盘>昨天的收盘>今天的收盘>昨天的收盘-->输出是正确的感谢您详细而有用的回答,这正是我想要的!
            High        Low         Open        Close       Volume      Adj Close   Closeshift2 OpenShift1  CloseShift1 OpenShift2  Bool
Date                                            
2020-04-01  2522.750000 2447.489990 2498.080078 2470.500000 5947900000  2470.500000 2626.649902 2614.689941 2584.590088 2558.979980 True
2020-04-02  2533.219971 2455.790039 2458.540039 2526.899902 6454990000  2526.899902 2584.590088 2498.080078 2470.500000 2614.689941 False
2020-04-03  2538.179932 2459.959961 2514.919922 2488.649902 6087190000  2488.649902 2470.500000 2458.540039 2526.899902 2498.080078 True