したがって、私の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が指摘したエラーを修正しました。感謝のエド。
誰かが自分のコードに何が間違っていると思いますか?
Thanks Ed 、今私はpandas 'DataFrame'オブジェクトが呼び出すことができない別のエラーが表示されます...私の質問の更新。 – Excaliburst
あなたが何をやっているのか分かりませんが、ここでの問題は、グループ単位で操作しようとしている間にdfで直接操作している関数を定義したことです。私はあなたが望むものとその機能が何をしているのかを見て、それがあなたが望むものであるかどうかを検討する必要があると思う。 – EdChum
私のパンダで新しい列「トレード」を計算する必要がある。私は関数 'Trade_signal_calc'を使用しています。そして、異なるグループからの数字を混同しないように、私はpd groupbyを使います。だから私はこれ以上簡単にはできないと思う。私は疑問に思っているdfの列に各グループでアクセスすることはできません。次のように:df( 'MACD' [ - 1])(最後の行)、df( 'MACD' [ - 2])...(最後の2行目)... そして、この関数はグループf()のパラメータで指定します。最初のパー'グループ' – Excaliburst