2016-07-20 6 views
0

したがって、私のgroupby適用で適用しようとする関数のパラメータをさらに入力しようとするとgorupbyが機能しないようです。Pandas groupbyが正しく処理されていません4、配置が1を意味します

私はここに私のシナリオのようなものを発見した:周りの途中記事ダウン「加重平均とグループ化データ」のセクションhttp://pbpython.com/weighted-average.htmlを。

私の計算を行うためのパラメータとして、dfの2つの列が必要な私の関数を使用しようとしています。

私のコード

import pandas as pd 
from io import StringIO 

text = """Ticker Date Adj_Close Volume MACD emaSlw emaFst MACDsig MACDperc 
A 18-07-2016 46.8 1362900.0 0.55 45.81 45.26 0.21 -0.9954 
A 19-07-2016 46.98 2579000.0 0.6 45.99 45.39 0.29 -0.9937 
AA 18-07-2016 10.92 16297800.0 0.32 10.27 9.94 0.1 -0.99 
AA 19-07-2016 10.63 14316200.0 0.33 10.32 9.99 0.15 -0.9856 
AAL 18-07-2016 36.03 8604200.0 1.15 32.84 31.69 -0.08 -10.023 
AAL 19-07-2016 36.01 7928100.0 1.32 33.33 32.01 0.19 -0.9942 
AAP 18-07-2016 164.4 516800.0 2.83 162.59 159.75 2.72 -0.9832 
AAP 19-07-2016 163.7 854700.0 2.71 162.76 160.05 2.76 -0.983 
AAPL 18-07-2016 99.83 36439900.0 0.5 97.36 96.86 -0.16 -10.017 
AAPL 19-07-2016 99.87 23703900.0 0.67 97.75 97.08 -0.01 -10.001 
ABBV 18-07-2016 63.56 6384800.0 0.9 63.06 62.16 0.71 -0.9887 
ABBV 19-07-2016 63.32 5716800.0 0.86 63.1 62.25 0.78 -0.9876 
ABC 18-07-2016 86.03 1113600.0 2.31 82.91 80.6 1.52 -0.9817 
ABC 19-07-2016 85.92 1975400.0 2.38 83.38 81.0 1.7 -0.9796 
ABT 18-07-2016 42.09 7524200.0 1.05 41.14 40.09 0.75 -0.9818 
ABT 19-07-2016 41.8 8395400.0 1.02 41.24 40.22 0.84 -0.9796""" 

df = pd.read_csv(StringIO(text), delim_whitespace=1, parse_dates=[0], index_col=1) 

df.drop(['Volume', 'emaSlw', 'emaFst'],inplace=True,axis=1) 

def Trade_signal_calc(group): 

    if df['MACD'].irow(-1) > 0: # MACD is pos. so trade (BUY/Sell) 
     # BUY signals 
     # if todays MACD is higher than signal, AND yesturday's MACD was lower than signal 
     if (df['MACD'].irow(-1) > df['MACDsig'].irow(-1)) \ 
     & (df['MACD'].irow(-2) < df['MACDsig'].irow(-2)) : 
      df['Trade'] = 'Buy' 
      return df 
     # SELL signals 
     # if todays MACD is lower than signal, AND yesturday's MACD was higher than signal - reverse the above 
     elif (df['MACD'].irow(-1) < df['MACDsig'].irow(-1)) \ 
     & ((df['MACD'].irow(-2)) > df['MACDsig'].irow(-2)) : 
      df['Trade'] = 'Sell' 
      return df 
     else: # No strong Buy or Sell signals 
      return df 
    else: # MACD is neg. so don't trade 
     return df 


if __name__ == '__main__': 

    # Multiindex Needed for my groupby to work properly ??? 
    df = df.set_index('Ticker', append=True) 
    print ('\ndf \n%s\n---------------------------------\nMultiindex df\n%s' %(df.iloc[0:4,0:6], df.iloc[0:4,0:6]))  

    df['Trade'] = df.groupby(level='Ticker')[['MACD','MACDsig']].apply(Trade_signal_calc) 
    print ('\ndf with Buy & Sell signals \ndfTrade shows trades from MACD & MACDsig comparison (summary from df) (Output)\n%s\nSignals: \nBuy: (df(MACD[-1]) > df(MACDsig[-1])) & (df(MACD[-2]) < df(MACDsig[-2])) \nSell: (df(MACD[-1]) < df(MACDsig[-1])) & (df(MACD[-2]) > df(MACDsig[-2])) \n\n%s' %(75*'-',df[['Trade','MACD','MACDsig','Adj_Close','Date']])) 
    # Resetting index from before doing groupby w. multi-index 
    df = df.reset_index('Ticker')  

    # Test the first 3 rows of each group for 'Difference' col transgress groups... 
    df = df.groupby('Ticker').head(3).reset_index().set_index('Date') 
    print ('\ndf (summary from df) (Output)\n',df,'\n') 

しかし、私は私のコードでそれを適用しようとすると、私はエラーを取得します。

df 
        Adj_Close MACD MACDsig MACDperc 
Date  Ticker          
18-07-2016 A   46.80 0.55  0.21 -0.9954 
19-07-2016 A   46.98 0.60  0.29 -0.9937 
18-07-2016 AA   10.92 0.32  0.10 -0.9900 
19-07-2016 AA   10.63 0.33  0.15 -0.9856 
--------------------------------- 
Multiindex df 
        Adj_Close MACD MACDsig MACDperc 
Date  Ticker          
18-07-2016 A   46.80 0.55  0.21 -0.9954 
19-07-2016 A   46.98 0.60  0.29 -0.9937 
18-07-2016 AA   10.92 0.32  0.10 -0.9900 
19-07-2016 AA   10.63 0.33  0.15 -0.9856 
Traceback (most recent call last): 

    File "<ipython-input-27-d88b1f547887>", line 1, in <module> 
    runfile('C:/Users/Morten/Documents/Design/Python/CrystalBall - Local - Git/Git - CrystalBall/sandbox/test_groupby_multiple_Input_Cols.py', wdir='C:/Users/Morten/Documents/Design/Python/CrystalBall - Local - Git/Git - CrystalBall/sandbox') 

    File "C:\Program Files\WinPython-64bit-3.3.5.7_2ndInst\python-3.3.5.amd64\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 682, in runfile 
    execfile(filename, namespace) 

    File "C:\Program Files\WinPython-64bit-3.3.5.7_2ndInst\python-3.3.5.amd64\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 85, in execfile 
    exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace) 

    File "C:/Users/Morten/Documents/Design/Python/CrystalBall - Local - Git/Git - CrystalBall/sandbox/test_groupby_multiple_Input_Cols.py", line 63, in <module> 
    df['Trade'] = df.groupby(level='Ticker')[['MACD','MACDsig']].apply(Trade_signal_calc) 

    File "C:\Program Files\WinPython-64bit-3.3.5.7_2ndInst\python-3.3.5.amd64\lib\site-packages\pandas\core\frame.py", line 2117, in __setitem__ 
    self._set_item(key, value) 

    File "C:\Program Files\WinPython-64bit-3.3.5.7_2ndInst\python-3.3.5.amd64\lib\site-packages\pandas\core\frame.py", line 2195, in _set_item 
    NDFrame._set_item(self, key, value) 

    File "C:\Program Files\WinPython-64bit-3.3.5.7_2ndInst\python-3.3.5.amd64\lib\site-packages\pandas\core\generic.py", line 1190, in _set_item 
    self._data.set(key, value) 

    File "C:\Program Files\WinPython-64bit-3.3.5.7_2ndInst\python-3.3.5.amd64\lib\site-packages\pandas\core\internals.py", line 2975, in set 
    self.insert(len(self.items), item, value) 

    File "C:\Program Files\WinPython-64bit-3.3.5.7_2ndInst\python-3.3.5.amd64\lib\site-packages\pandas\core\internals.py", line 3074, in insert 
    placement=slice(loc, loc+1)) 

    File "C:\Program Files\WinPython-64bit-3.3.5.7_2ndInst\python-3.3.5.amd64\lib\site-packages\pandas\core\internals.py", line 2093, in make_block 
    placement=placement) 

    File "C:\Program Files\WinPython-64bit-3.3.5.7_2ndInst\python-3.3.5.amd64\lib\site-packages\pandas\core\internals.py", line 77, in __init__ 
    len(self.values), len(self.mgr_locs))) 

ValueError: Wrong number of items passed 4, placement implies 1 

それはパラメータエラーのように思えるが、私はTrade_signal_calc(グループ)の呼び出しでGROUPBYオブジェクト「グループ」以外の任意のparamsを使用しないでください。

私のコードで私はEdChumが指摘したエラーを修正しました。感謝のエド。

誰かが自分のコードに何が間違っていると思いますか?

答えて

0

あなたの列選択の周りに追加の[]を追加します。

df['Trade'] = df['MACD','MACDsig'].groupby(level=1).apply(Trade_signal_calc, 'MACD','MACDsig') 

df['Trade'] = df.groupby(level=1)[['MACD','MACDsig']].apply(Trade_signal_calc, 'MACD','MACDsig') 

をエラーが、それはタプルとして、あなたの選択の治療だと何のキーが存在しないことを言っているが、これはやってに違いはありません

このように構文を調べると、失敗した理由がわかるので、[]を追加して、列のリストになるようにする必要があります。

+0

Thanks Ed 、今私はpandas 'DataFrame'オブジェクトが呼び出すことができない別のエラーが表示されます...私の質問の更新。 – Excaliburst

+0

あなたが何をやっているのか分かりませんが、ここでの問題は、グループ単位で操作しようとしている間にdfで直接操作している関数を定義したことです。私はあなたが望むものとその機能が何をしているのかを見て、それがあなたが望むものであるかどうかを検討する必要があると思う。 – EdChum

+0

私のパンダで新しい列「トレード」を計算する必要がある。私は関数 'Trade_signal_calc'を使用しています。そして、異なるグループからの数字を混同しないように、私はpd groupbyを使います。だから私はこれ以上簡単にはできないと思う。私は疑問に思っているdfの列に各グループでアクセスすることはできません。次のように:df( 'MACD' [ - 1])(最後の行)、df( 'MACD' [ - 2])...(最後の2行目)... そして、この関数はグループf()のパラメータで指定します。最初のパー'グループ' – Excaliburst

関連する問題