[英]Iterating through DataFrame using pandas for stocks
我對python和pandas
比較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可能不是必需的,但我確實喜歡它們如何拼接出我想要的特定數據。
然后我嘗試使用我的函數遍歷列表中的每個股票:
for stock in list:
if low0 > low1 and low1 < low2:
print True
else:
print False
這是我得到的錯誤:ValueError:系列的真值是不明確的。 使用a.empty,a.bool(),a.item(),a.any()或a.all()。
我很感激任何意見。
要確定過去三天Low
是否一直在增加,您可以使用以下內容:
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))]
或者檢查所有日子中最后三個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
取代。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.