2017-09-26 10 views
0

私はいくつかの公開企業と各社の四半期ごとの所見があるパネルデータを扱っています。私は、データを整理する最良の方法は、第1レベルが一意の企業識別子(この場合は 'gvkey')であり、第2レベルが四半期であるマルチインデックスであると考えていました。パンダのカスタム会計四半期?

会計年度の終了日は、DatetimeIndex.quarterから私に提示される年の任意の月とすることができます。パンダに意味のあるパンダのカスタムクォーターを定義する方法はありますか?私は単純に「2014Q1」のような文字列を使うことができましたが、Pandasが前四半期を知っているか、またはその会社の会計年度終了が月10であることを知るために、何らかのオブジェクトにすることを望んでいましたので、2014年1月には2014年1月に終了します。これは可能ですか?

これは、DataFrameにあるデータの例です。インデックスはgvkeyで、一意の企業識別子です。 datadateは四半期の最終日(四半期の最後の月の最終日)、datafqtrは年と四半期の文字列、fyrは会計年度末の月です(例:5は年は5月に終わります)。

 conm datadate datafqtr fyr 
gvkey    
001004 AAR CORP 2014-02-28 2013Q3 5.0 
001004 AAR CORP 2014-05-31 2013Q4 5.0 
001004 AAR CORP 2014-08-31 2014Q1 5.0 
001004 AAR CORP 2014-11-30 2014Q2 5.0 
001045 AMERICAN AIRLINES GROUP INC 2014-03-31 2014Q1 12.0 
001045 AMERICAN AIRLINES GROUP INC 2014-06-30 2014Q2 12.0 
001045 AMERICAN AIRLINES GROUP INC 2014-09-30 2014Q3 12.0 
001045 AMERICAN AIRLINES GROUP INC 2014-12-31 2014Q4 12.0 
001050 CECO ENVIRONMENTAL CORP 2014-03-31 2014Q1 12.0 
001050 CECO ENVIRONMENTAL CORP 2014-06-30 2014Q2 12.0 
001050 CECO ENVIRONMENTAL CORP 2014-09-30 2014Q3 12.0 
001050 CECO ENVIRONMENTAL CORP 2014-12-31 2014Q4 12.0 
001062 ASA GOLD AND PRECIOUS METALS 2014-02-28 2014Q1 11.0 
001062 ASA GOLD AND PRECIOUS METALS 2014-05-31 2014Q2 11.0 
001062 ASA GOLD AND PRECIOUS METALS 2014-08-31 2014Q3 11.0 
001062 ASA GOLD AND PRECIOUS METALS 2014-11-30 2014Q4 11.0 
001072 AVX CORP 2014-03-31 2013Q4 3.0 
001072 AVX CORP 2014-06-30 2014Q1 3.0 
001072 AVX CORP 2014-09-30 2014Q2 3.0 
001072 AVX CORP 2014-12-31 2014Q3 3.0 

答えて

1

私はあなたが何を求めているか知っていると思います。

まず、私はいくつかのデータを作ります:

# Make dataframe 
df = pd.DataFrame({'gvkey' : ['001004']*4 +\ 
          ['001045']*4 +\ 
          ['001050']*4 +\ 
          ['001062']*4 +\ 
          ['001072']*4, 
        'conm' : ['AAR CORP']*4 +\ 
          ['AMERICAN AIRLINES GROUP INC']*4 +\ 
          ['CECO ENVIRONMENTAL CORP']*4 +\ 
          ['ASA GOLD AND PRECIOUS METALS']*4 +\ 
          ['AVX CORP']*4, 
        'datadate' : ['2014-02-28', '2014-05-31', '2014-08-31', '2014-11-30'] +\ 
           ['2014-03-31', '2014-06-30', '2014-09-30', '2014-12-31']*2 +\ 
           ['2014-02-28', '2014-05-31', '2014-08-31', '2014-11-30'] +\ 
           ['2014-03-31', '2014-06-30', '2014-09-30', '2014-12-31'], 
        'datafqtr' : ['2013Q3', '2013Q4', '2014Q1', '2014Q2'] +\ 
           ['2014Q1', '2014Q2', '2014Q3', '2014Q4']*3 +\ 
           ['2013Q4', '2014Q1', '2014Q2', '2014Q3'], 
        'fyr' : [5]*4 +\ 
          [12]*8 +\ 
          [11]*4 +\ 
          [3]*4}) 

# Reorder columns 
df = df[[df.columns[-1]] + list(df.columns[:-1])] 

# Convert 'datadate' to datetime 
df.loc[:, 'datadate'] = pd.to_datetime(df.loc[:, 'datadate']) 

# Show the dataframe 
df 

original df

第二に、(私がすべき問題を解釈した内容に基づいて)私はあなたのdatafqtr列の複製を作成します。私は6より<た'fyr'かどうかを検討しなければならなかった'new_year'列を作成したときにすることを

# Copy the dataframe 
df1 = df.copy() 

# Insert 'year' column 
df1.insert(df1.shape[1], 
      'year', 
      df1.loc[:, 'datadate'].dt.year) 

# Insert 'month' column 
df1.insert(df1.shape[1], 
      'month', 
      df1.loc[:, 'datadate'].dt.month) 

# Subtract 'fyr' from 'month' 
df1.insert(df1.shape[1], 
      'month-fyr', 
      df1.loc[:, 'month'] - df1.loc[:, 'fyr']) 

# Create 'new_year' column 
df1.insert(df1.shape[1], 
      'new_year', 
      np.where((df1.loc[:, 'month-fyr'] <= 0) & (df1.loc[:, 'fyr'] < 6), 
        df1.loc[:, 'year'] - 1, 
        df1.loc[:, 'year'])) 

# Make a mapper for mapping the values of 'month-fyr' to 'new_qtr' 
mapper = {-9 : 1, 
      -6 : 2, 
      -3 : 3, 
      0 : 4, 
      3 : 1, 
      6 : 2, 
      9 : 3} 

# Insert the 'new_qtr' column 
df1.insert(df1.shape[1], 
      'new_qtr', 
      df1.loc[:, 'month-fyr'].map(mapper)) 

# Insert 'new_datafqtr' column (this should be equivalent to 'datafqtr') 
df1.insert(df1.shape[1], 
      'new_datafqtr', 
      df1.loc[:, 'new_year'].astype(str) + 'Q' + df1.loc[:, 'new_qtr'].astype(str)) 

# Show the dataframe 
df1 

new df

注:これを行うには、私は四半期および年間を作成するための12の剰余マッピング技術を使用していました。これは列を作成する際に重要です。

groupby 'gvkey', 'conm', 'new_year', 'new_qtr'にしたければ、それぞれの正しい会計年度と四半期が表示されます。

希望すると便利です。

編集:pd.diffため

# Insert random revenue 
df1.insert(df1.shape[1], 
      'random_revenue', 
      np.random.randint(low = 0, high = 1000000, size = df1.shape[0])) 

# Groupby 'gvkey', 'conm', 'new_year', 'new_qtr' and sum 'random_revenue' 
df_group = df1.groupby(['gvkey', 
         'conm', 
         'new_year', 
         'new_qtr']).agg({'random_revenue' : 'sum'}) 

# Find difference in revenue for "AAR CORP" between 2013Q3 and 2014Q2 
df_group.loc[('001004', 'AAR CORP', slice(None), [3, 2])].diff() 

ドキュメント() - >https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.diff.html#pandas-dataframe-diff

+0

イアン、これは素晴らしいです。間違いなく、パンダとNumPyについて、これに続いていくつかのことを学びました。私はおそらく、私の質問にあったはずのはっきりしていなかった。私のデータソースは常に 'datafqtr'カラムを提供するので、再作成する必要はありません。私が望んでいたことは、パンダが四半期を扱うという目的を持っていることで、私は知的な変化のようなものをもたらし、前四半期の価値をつかむことができるということでした。 たとえば、前四半期の収益変化を計算したいとします。私はちょうど私の期間が四半期であることをパンダに言うことができ、私は-1を望んでいますQ.私はできないと推測していますか? – Liedakkala

+0

私の編集を見てください –

関連する問題