Python 使用pandas进行股票数据帧迭代
我对python和熊猫比较陌生。 我有一个Python 使用pandas进行股票数据帧迭代,python,pandas,datareader,Python,Pandas,Datareader,我对python和熊猫比较陌生。 我有一个DataFrame,上面有几只股票以及过去几天的相关“低价”。我试着遍历每只股票(现在我只有3只,但最终会有数千只),然后对于每只股票,我想看看今天的“低价”是否大于昨天的低价,我想看看昨天的低价是否小于两天前的低价。对于满足此条件的每个股票,我最终希望将它们导出到csv文件 list = ['IBM', 'AMZN', 'FB'] stockData = DataReader(list, 'yahoo', datetime(2016,06,8),
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()
添加到条件语句中,请参阅更新。不,实际上它必须同时满足两个条件,而不仅仅满足一个条件。谢谢。