Python 使用pandas进行股票数据帧迭代

Python 使用pandas进行股票数据帧迭代,python,pandas,datareader,Python,Pandas,Datareader,我对python和熊猫比较陌生。 我有一个DataFrame,上面有几只股票以及过去几天的相关“低价”。我试着遍历每只股票(现在我只有3只,但最终会有数千只),然后对于每只股票,我想看看今天的“低价”是否大于昨天的低价,我想看看昨天的低价是否小于两天前的低价。对于满足此条件的每个股票,我最终希望将它们导出到csv文件 list = ['IBM', 'AMZN', 'FB'] stockData = DataReader(list, 'yahoo', datetime(2016,06,8),

我对python和熊猫比较陌生。 我有一个
DataFrame
,上面有几只股票以及过去几天的相关“低价”。我试着遍历每只股票(现在我只有3只,但最终会有数千只),然后对于每只股票,我想看看今天的“低价”是否大于昨天的低价,我想看看昨天的低价是否小于两天前的低价。对于满足此条件的每个股票,我最终希望将它们导出到csv文件

list = ['IBM', 'AMZN', 'FB'] 

stockData = DataReader(list,  'yahoo', datetime(2016,06,8), datetime.today().utcnow())

low = stockData['Low']

low0 = low.iloc[-1]
low1 = low.iloc[-2]
low2 = low.iloc[-3]
变量low0、low1和low2可能不是必需的,但我确实喜欢它们拼接出我想要的特定数据的方式

然后,我尝试使用我的函数迭代列表中的每个股票:

for stock in list:
    if low0 > low1 and low1 < low2:
        print True
    else: 
        print False
对于入库单:
如果low0>low1和low1
这是我得到的错误: ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()


如果您有任何意见,我将不胜感激。

要确定
低值在过去三天中是否一直在增加,您可以使用以下信息:

stockData = stockData.sort_index(ascending=False).iloc[:3] # reverse order, use last three days
如果两种情况下
Low
都在增加,则比较相邻两天之间
Low
的情况,并返回
True

stockData[(stockData.Low < stockData.Low.shift(1)) & (stockData.Low.shift(1) < stockData.Low.shift(2))]
因此,对于您的应用程序:

for stock in ['IBM', 'AMZN', 'FB']:
    stockData = DataReader(stock, 'yahoo', datetime(2016, 6, 8), datetime.today().utcnow()).sort_index(ascending=False).iloc[:3]
    print('\n', stockData.Low)
    print(stock, (stockData.Low.diff().dropna()<0).all())
    print(stock, stockData[(stockData.Low < stockData.Low.shift(1)) & (stockData.Low.shift(1) < stockData.Low.shift(2))].Low.any())


 Date
2016-06-15    150.600006
2016-06-14    150.399994
2016-06-13    150.279999
Name: Low, dtype: float64
IBM True
IBM True

 Date
2016-06-15    713.349976
2016-06-14    712.270020
2016-06-13    711.159973
Name: Low, dtype: float64
AMZN True
AMZN True

 Date
2016-06-15    114.070000
2016-06-14    113.580002
2016-06-13    113.309998
Name: Low, dtype: float64
FB True
FB True
对于库存['IBM','AMZN','FB']:
stockData=DataReader(股票,'yahoo',datetime(2016,6,8),datetime.today().utcnow()).sort_index(升序=False).iloc[:3]
打印('\n',stockData.Low)

打印(股票,(stockData.Low.diff().dropna()要确定
低值
在过去三天中是否一直在增加,您可以使用以下选项:

stockData = stockData.sort_index(ascending=False).iloc[:3] # reverse order, use last three days
如果两种情况下
Low
都在增加,则比较相邻两天之间
Low
的情况,并返回
True

stockData[(stockData.Low < stockData.Low.shift(1)) & (stockData.Low.shift(1) < stockData.Low.shift(2))]
因此,对于您的应用程序:

for stock in ['IBM', 'AMZN', 'FB']:
    stockData = DataReader(stock, 'yahoo', datetime(2016, 6, 8), datetime.today().utcnow()).sort_index(ascending=False).iloc[:3]
    print('\n', stockData.Low)
    print(stock, (stockData.Low.diff().dropna()<0).all())
    print(stock, stockData[(stockData.Low < stockData.Low.shift(1)) & (stockData.Low.shift(1) < stockData.Low.shift(2))].Low.any())


 Date
2016-06-15    150.600006
2016-06-14    150.399994
2016-06-13    150.279999
Name: Low, dtype: float64
IBM True
IBM True

 Date
2016-06-15    713.349976
2016-06-14    712.270020
2016-06-13    711.159973
Name: Low, dtype: float64
AMZN True
AMZN True

 Date
2016-06-15    114.070000
2016-06-14    113.580002
2016-06-13    113.309998
Name: Low, dtype: float64
FB True
FB True
对于库存['IBM','AMZN','FB']:
stockData=DataReader(股票,'yahoo',datetime(2016,6,8),datetime.today().utcnow()).sort_index(升序=False).iloc[:3]
打印('\n',stockData.Low)

print(stock)(stockData.Low.diff().dropna()这是解决此问题的类似但略有不同的方法的示例。我使用虚拟值来演示

首先,我创建一个数据帧

dates = pd.date_range('20130101', periods=3)
IBM = [5,3,2]
AMZN = [1,7,6]
FB = [4,7,9]
df = pd.DataFrame({'IBM': IBM,'AMZN': AMZN,'FB':FB}, index=dates)
df
          AMZN  FB  IBM
2013-01-01  1   4   5
2013-01-02  7   7   3
2013-01-03  6   9   2
我使用
.shift()
来跟踪与数据帧中的第一天和第二天相比,第二天和第三天的值上升或下降了多少。我通过从
df
中减去
df.shift(1)
来实现这一点。第一天的值将替换为
NaN

df - df.shift(1)
           AMZN     FB     IBM
2013-01-01  NaN     NaN     NaN  
2013-01-02  6.0     3.0     -2.0
2013-01-03  -1.0    2.0     -1.0
如果您更喜欢
True
False
,您可以检查值是否高于或低于
0
。因此,在这种情况下,
True
表示向上,
False
表示向下,第一天的起始值将替换为
False

df - df.shift(1) > 0
            AMZN    FB      IBM
2013-01-01  False   False   False
2013-01-02  True    True    False
2013-01-03  False   True    False 

这是一个类似但略有不同的解决方法的示例。我使用虚拟值来演示

首先,我创建一个数据帧

dates = pd.date_range('20130101', periods=3)
IBM = [5,3,2]
AMZN = [1,7,6]
FB = [4,7,9]
df = pd.DataFrame({'IBM': IBM,'AMZN': AMZN,'FB':FB}, index=dates)
df
          AMZN  FB  IBM
2013-01-01  1   4   5
2013-01-02  7   7   3
2013-01-03  6   9   2
我使用
.shift()
来跟踪与数据帧中的第一天和第二天相比,第二天和第三天的值上升或下降了多少。我通过从
df
中减去
df.shift(1)
来实现这一点。第一天的值将替换为
NaN

df - df.shift(1)
           AMZN     FB     IBM
2013-01-01  NaN     NaN     NaN  
2013-01-02  6.0     3.0     -2.0
2013-01-03  -1.0    2.0     -1.0
如果您更喜欢
True
False
,您可以检查值是否高于或低于
0
。因此,在这种情况下,
True
表示向上,
False
表示向下,第一天的起始值将替换为
False

df - df.shift(1) > 0
            AMZN    FB      IBM
2013-01-01  False   False   False
2013-01-02  True    True    False
2013-01-03  False   True    False 

当我这样做时,我得到了这个错误:ValueError:无法使用多维键进行索引不确定,您是否直接从
DataReader
使用
stockData
?修复了条件,现在
2016-05-11
是正确的结果,前两天的
价格较低。好的。我知道您在做什么,这是n我想做的是什么。我想看看这些条件是否满足,并得到一个真或假。如果low0>low1和low1True
如果在这段时间内满足条件,只需添加
。any()
对于条件语句,请参见更新。不,实际上它必须同时满足两个条件,而不仅仅是一个条件。谢谢。我在执行此操作时遇到此错误:ValueError:无法使用多维键进行索引不确定,您是否直接从
DataReader
使用
stockData
?修复了条件,现在
2016-05-11
是正确的r前两天的结果是价格较低。好的。我知道你在做什么,这不是我想做的。我想看看这些标准是否满足,并得到一个真或假。如果low0>low1和low1True
,如果有一个如果期间的条件满足,只需将
.any()
添加到条件语句中,请参阅更新。不,实际上它必须同时满足两个条件,而不仅仅满足一个条件。谢谢。