2016-06-16 5 views
1

私は比較的新しいPythonとpandasです。 私はDataFrameに過去数日間、少数の株とそれに関連する「低い」価格を持っています。私はそれぞれの株式(今は3つしかないが、最終的には何千もあるだろう)を繰り返してみようとしています。そして、各株式について、現在の「低」価格が昨日の低価格よりも高いかどうかを見たいと思っています。昨日の低価格が2日前からの低価格よりも低い場合。この基準を満たす在庫ごとに、私は最終的にcsvファイルにエクスポートしたいと考えています。株式のためにパンダを使ってDataFrameを反復する

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()を使用します。

私は入力を感謝します。

答えて

0

Lowかどうかを識別するために、最後の3日間増加しており、あなたが使用することができ、以下:

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

のいずれかで増加しているTrueLow場合、隣接日の間Lowを比較し、返す条件どちらの場合:

stockData[(stockData.Low < stockData.Low.shift(1)) & (stockData.Low.shift(1) < stockData.Low.shift(2))] 

それとも最新の日は今、fが来るので、最後の3個のLow価格との差が、(負の場合チェックIRST)すべての日のために:あなたのアプリケーションのためにそう

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 
+0

私はこれを行うとき、私はこのエラーを取得:ValueErrorを:、多次元キー – user2590076

+0

わからないといないインデックスすることができますが、 'DataReader'から直接' stockData'を使用していますか?条件を修正しました.2016-05-11は、過去2日間の「低」価格が下がった結果です。 – Stefan

+0

私はあなたがしていることを見て、これは私がやろうとしていることではありません。私はこれらの基準が満たされているかどうかを見極めて、真または偽を取得しようとしています。 low0> low1かつlow1 user2590076

0

この、この問題に似てますが、わずかに異なるアプローチの例です。私はデモ値を使用してデモンストレーションしています。

まず、データフレームを作成します。私は値が初日とデータフレームで二日目に比べて第二と第三日の間に上下に行きましたか、どのくらいの追跡する.shift()を使用

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 

。私はdf.shift(1)dfから引いてこれを行います。最初の日の値は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 
関連する問題