2016-06-23 9 views
1

私はpandas groupbyをprしたいと思っています。ティッカーグループ。以下のコードで。異なるKPIを計算するために、在庫リストのティッカー。ここで私は前の日のcol 'Difference'を表示します。明らかに、私は異なるティッカーの違いを望んでいない - それは意味をなさない - したがって、groupby。しかし、意図したとおりに動作しません。Python pandas groupbyが動作しない

問題は、以下の出力に表示されて、それがすることになっているものをそのCOL「違い」犯すを行うと、GROUPBYで異なるグループにまたがらない、出力ファイル で実際のGROUPBYをemerge (ティッカー)。したがって、第1グループの最後のティッカーラインと第2グループの最初のティッカーラインとの差分を計算します。これは意図した通りではありません。この行は、これは「違い」コルがある理由として、DFの違い 日

2015-04-09 NaN 
2015-04-10 1.180000 
2015-04-13 3.150000 
2015-04-14 -0.980000 
2015-04-15 1.280000 
2015-04-16 -8.280000 
2015-04-17 -8.770000 
2015-04-09 -139.859995 This is not correct. The groupby does not separate the tickers as it should. This should be a NaN... not the diff between 2 different tickers! 

2015-04-10 0.899994 
2015-04-13 -1.130005 
2015-04-14 -0.589996 
2015-04-15 1.000000 
2015-04-16 0.350006 
2015-04-09 -139.859995 

任意のアイデアで「違い」COLの結果です...最初の行として

NaNにする必要があります私のコードでgroupbyで分離されていないのですか?

import pandas as pd 
import time 
from io import StringIO 

text = """Date Ticker  Open  High   Low Adj_Close Volume 
    2015-04-09 vws.co 315.000000 316.100000 312.500000 311.520000 1686800 
    2015-04-10 vws.co 317.000000 319.700000 316.400000 312.700000 1396500 
    2015-04-13 vws.co 317.900000 321.500000 315.200000 315.850000 1564500 
    2015-04-14 vws.co 320.000000 322.400000 318.700000 314.870000 1370600 
    2015-04-15 vws.co 320.000000 321.500000 319.200000 316.150000 945000 
    2015-04-16 vws.co 319.000000 320.200000 310.400000 307.870000 2236100 
    2015-04-17 vws.co 309.900000 310.000000 302.500000 299.100000 2711900 
    2015-04-20 vws.co 303.000000 312.000000 303.000000 306.490000 1629700 
    2015-04-09  mmm 166.750000 167.500000 166.500000 166.630005 1762800 
    2015-04-10  mmm 165.630005 167.740005 164.789993 167.529999 1993700 
    2015-04-13  mmm 167.110001 167.490005 165.919998 166.399994 2022800 
    2015-04-14  mmm 165.179993 166.550003 164.649994 165.809998 1610300 
    2015-04-15  mmm 165.339996 167.080002 164.839996 166.809998 2092200 
    2015-04-16  mmm 165.880005 167.229996 165.250000 167.160004 2721900""" 

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

def Screener(group): 

    def diff_calc(group): 

     df['Difference'] = df['Adj_Close'].diff() 
     return df['Difference'] 

    df['Difference'] = diff_calc(group) 
    return df 

if __name__ == '__main__': 

    ### groupby screeener (filtering to only rel ticker group) 
    grouped = df.groupby('Ticker', as_index=False) # Now doing the groupby outside the iteration... 

    for name, group in grouped: 
     # Testing/showing the groups... 
     print ('(group)\n',name,'\n') 
     print ('(group (ticker) in df)\n',group.head(10),'\n') 
     df = Screener(group) 
     print(60 * '=') 

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

は、意図したとおりにApparantly私GROUPBYは動作しますが、意図した「違い」コルは不規則ここに私のテスト出力に示されている動作します。あなたのScreenerに、より密接にスコープをあなたのコードを確認した後

(group) 
mmm 

(group (ticker) in df) 
      Ticker  Open  High   Low Adj_Close Volume 
Date                  
2015-04-09 mmm 166.750000 167.500000 166.500000 166.630005 1762800 
2015-04-10 mmm 165.630005 167.740005 164.789993 167.529999 1993700 
2015-04-13 mmm 167.110001 167.490005 165.919998 166.399994 2022800 
2015-04-14 mmm 165.179993 166.550003 164.649994 165.809998 1610300 
2015-04-15 mmm 165.339996 167.080002 164.839996 166.809998 2092200 
2015-04-16 mmm 165.880005 167.229996 165.250000 167.160004 2721900 

============================================================ 
(group) 
vws.co 

(group (ticker) in df) 
      Ticker Open High Low Adj_Close Volume 
Date              
2015-04-09 vws.co 315.0 316.1 312.5  311.52 1686800 
2015-04-10 vws.co 317.0 319.7 316.4  312.70 1396500 
2015-04-13 vws.co 317.9 321.5 315.2  315.85 1564500 
2015-04-14 vws.co 320.0 322.4 318.7  314.87 1370600 
2015-04-15 vws.co 320.0 321.5 319.2  316.15 945000 
2015-04-16 vws.co 319.0 320.2 310.4  307.87 2236100 
2015-04-17 vws.co 309.9 310.0 302.5  299.10 2711900 
2015-04-20 vws.co 303.0 312.0 303.0  306.49 1629700 

============================================================ 
df_test (summary from df) (Output) 
      Ticker  Open  High   Low Adj_Close Volume Date                   
2015-04-09 vws.co 315.000000 316.100000 312.500000 311.520000 1686800 
2015-04-10 vws.co 317.000000 319.700000 316.400000 312.700000 1396500 
2015-04-13 vws.co 317.900000 321.500000 315.200000 315.850000 1564500 
2015-04-09  mmm 166.750000 167.500000 166.500000 166.630005 1762800 
2015-04-10  mmm 165.630005 167.740005 164.789993 167.529999 1993700 
2015-04-13  mmm 167.110001 167.490005 165.919998 166.399994 2022800 

      Difference 
Date      
2015-04-09   NaN 
2015-04-10 1.180000 
2015-04-13 3.150000 
2015-04-09 -139.859995 This is not correct!!! This should be NaN... 
2015-04-10 0.899994 
2015-04-13 -1.130005 

答えて

0

機能が間違っています。あなたはdfパラメータを渡さずにその機能でdfを参照しています。これは、関数の外のスコープで定義されたdf変数、つまりメインdfで動作していることを意味します。したがって、グループではなく、全体のdf.diff()を割り当てています。

私はそれが簡単に見つかりました

df_ = df.set_index('Ticker', append=True) 
df_['Difference'] = df_.groupby(level=1).Adj_Close.diff() 
print df_.reset_index('Ticker') 

enter image description here

+0

本当にありがとうございました@piRSqueared、。これは本当に私の(中世の)日でした。驚くばかり。なぜマルチインデックスを使用するのですか?私はあなたのグループを撮影してそれを私の文脈に入れましたが、グループ反復を保持しています。この方法で、私が望むように私のスクリーナでもっと多くの機能を呼び出すことができます。 Diffは私がこれらの数字で必要とする計算の唯一の部分ではありません... そして、あなたが提案するように私はKPIごとに別のグループを行います。数百万の時系列の株式データでコードを実行すると時間が無駄になると思われます。 – Excaliburst

関連する問題