使用pandas为股票迭代数据帧

2024-09-26 22:42:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python和pandas比较陌生。 我有一个DataFrame和一些股票相关的过去几天的“低”价格。我试着迭代每只股票(现在我只有3只,但最终会有数千只),然后对于每只股票,我想看看今天的“低价”是否大于昨天的低价,我想看看昨天的低价是否低于2天前的最低价。对于每一只符合这个条件的股票,我最终想把它们导出到一个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可能不是必需的,但我喜欢它们如何拼接出我想要的特定数据。在

然后,我试着用我的函数遍历我的列表中的每只股票:

^{pr2}$

这是我得到的错误: 值错误:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。在

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


Tags: dataframepandasdatetime错误价格listlow股票
2条回答

要确定Low在过去三天中是否一直在增加,可以使用以下命令:

stockData = stockData.sort_index(ascending=False).iloc[:3] # reverse order, use last three days

比较相邻天之间的Low,并返回True如果Low在这两种情况下都在增加:

^{pr2}$

或者检查最近三个Low价格之间的差额是否为负数(因为最近的一天现在是第一天):

stockData.Low.diff().dropna() < 0).all()

因此,对于您的申请:

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

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

首先,我创建一个数据帧。在

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替换。在

^{pr2}$

如果您喜欢TrueFalse,可以检查这些值是否高于或低于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 

相关问题 更多 >

    热门问题