簡體   English   中英

使用pandas為庫存迭代DataFrame

[英]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

如果您更喜歡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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM