財務報告における階層的整頓データの取り扱い

Views: 20

このブログ投稿では、財務報告における階層的整頓データの取り扱い方について説明します。借方/貸方フラグ、口座番号、月に基づいて金額を集計するために必要なデータを対象行にマージし、効率的なデータ管理を確保して冗長性を回避する方法について説明します。

1. 階層的整頓データの特徴

階層的整頓データは、異なる行で異なるレベルの観察を報告するため、レポート ファイルが冗長になることはありません。ただし、借方/貸方フラグ、口座番号、月に基づいて金額を集計するには、必要なデータを対象行にマージする必要があります。

入力された日付はヘッダー エントリ レベルの行に報告され、借方/貸方フラグ、科目コード、金額のデータは明細行で報告されます。日付を明細行のデータにマージする必要があります。これについては、後のセクションで説明します。

最終結果。JP04a_GL02_03_monthJP05a_GL03_04JP13a_BS16_01JP13a_BS16_02 の各組み合わせに対する CC05hW_01_target の合計が表示されます。

7. 最終結果:
    JP04a_GL02_03_month JP05a_GL03_04  JP13a_BS16_01 JP13a_BS16_02  CC05hW_01_target
  0             2021-04             D            150          受取手形          20392404
  1             2021-04             C            152           売掛金          29217041
  2             2021-04             D            131          普通預金           8823062
  3             2021-04             D            741         支払手数料              1575
  4             2021-05             D            152           売掛金           6682852
  5             2021-05             C            511           売上高           6540100

2. ソース コードと説明

import pandas as pd
  
  # CSVファイルを読み込む
  file_path = '2405/240530/tidyGL05-31_3.csv'
  
  # CSVファイルをDataFrameに読み込む
  df = pd.read_csv(file_path, encoding='utf-8-sig')
  
  # 列名の先頭および末尾のスペースを削除する
  df.columns = df.columns.str.strip()
  
  # 関連する列を適切なデータ型に変換する
  df['JP05a'] = pd.to_numeric(df['JP05a'], errors='coerce').astype('Int64') # 明細行
  df['JP12a'] = pd.to_numeric(df['JP12a'], errors='coerce').astype('Int64') # 補助科目
  df['BS04cc'] = pd.to_numeric(df['BS04cc'], errors='coerce').astype('Int64') # 部門
  df['CC05hW_01'] = pd.to_numeric(df['CC05hW_01'], errors='coerce').astype('Int64') # 金額
  df['JP13a_BS16_01'] = pd.to_numeric(df['JP13a_BS16_01'], errors='coerce').astype('Int64') # 科目コード
  
  # 比較のためにJP05a_GL03_04(借方/貸方フラグ)を文字列として正しくフォーマットする
  df['JP05a_GL03_04'] = df['JP05a_GL03_04'].astype(str)
  
  # JP04a_GL02_03(伝票日付)を日時に変換し、非標準の日付フォーマットを処理する
  df['JP04a_GL02_03'] = pd.to_datetime(df['JP04a_GL02_03'], errors='coerce')
  
  # JP04a_GL02_03(伝票日付)から月を抽出し、新しい列に追加する
  df['JP04a_GL02_03_month'] = df['JP04a_GL02_03'].dt.to_period('M').astype(str)
  
  # 初期のDataFrameを表示する
  print("1. 初期のDataFrame:")
  print(df.head())
  
  # JP12a=0かつBS04cc=0の行を抽出し、対象のCC05hW_01(金額)の値を収集する
  target_rows = df[(df['JP12a'] == 0) & (df['BS04cc'] == 0) & (df['JP05a'] != 0)][['JP04a', 'JP05a', 'CC05hW_01']]
  print("\n2. 対象の行:")
  print(target_rows.head())
  
  # マージ前に対象列を明確にするために列名を変更する
  target_rows = target_rows.rename(columns={'CC05hW_01': 'CC05hW_01_target'})
  
  # JP04a(仕訳ヘッダ)に値があり、JP05a(仕訳明細)、JP12a(補助科目)、BS04cc(部門)がすべてゼロの行を抽出する
  jp04a_rows = df[(df['JP12a'] == 0) & (df['BS04cc'] == 0) & (df['JP05a'] == 0)][['JP04a', 'JP04a_GL02_03', 'JP04a_GL02_03_month']]
  
  # マージ前に列名を明確にするために列名を変更する
  jp04a_rows = jp04a_rows.rename(columns={'JP04a_GL02_03': 'JP04a_GL02_03_value', 'JP04a_GL02_03_month': 'JP04a_GL02_03_month_value'})
  
  # 対象のCC05hW_01(金額)の値をメインのDataFrameにマージする
  df = pd.merge(df, target_rows, on=['JP04a', 'JP05a'], how='left')
  
  # JP04a_GL02_03(伝票日付)およびJP04a_GL02_03_month(伝票日付の月)の値をメインのDataFrameにマージする
  df = pd.merge(df, jp04a_rows, on='JP04a', how='left')
  
  # 正しいJP04a_GL02_03(伝票日付)およびJP04a_GL02_03_month(伝票日付の月)の値でメインのDataFrameを更新する
  df['JP04a_GL02_03'] = df['JP04a_GL02_03_value'].combine_first(df['JP04a_GL02_03'])
  df['JP04a_GL02_03_month'] = df['JP04a_GL02_03_month_value'].combine_first(df['JP04a_GL02_03_month'])
  
  # マージに使用した一時的な列を削除する
  df.drop(columns=['JP04a_GL02_03_value', 'JP04a_GL02_03_month_value'], inplace=True)
  
  # マージと更新後のDataFrameを表示する
  print("\n3. マージと更新後のDataFrame:")
  print(df.head())
  
  # JP05a_GL03_04(貸方/借方フラグ)、JP13a_BS16_01(科目コード)、およびJP13a_BS16_02(科目名)のすべてのユニークな組み合わせを収集する
  unique_combinations = df[['JP05a_GL03_04', 'JP13a_BS16_01', 'JP13a_BS16_02']].drop_duplicates()
  print("\n4. ユニークな組み合わせ:")
  print(unique_combinations)
  
  # 結果を保存するために空のDataFrameを初期化する
  results = pd.DataFrame()
  
  # 各ユニークな組み合わせをフィルタリングし、データを集計する
  for _, row in unique_combinations.iterrows():
      jp05a_gl03_04 = row['JP05a_GL03_04'] # 貸方/借方フラグ
      jp13a_bs16_01 = row['JP13a_BS16_01'] # 科目コード
      jp13a_bs16_02 = row['JP13a_BS16_02'] # 科目名
      
      # 現在の組み合わせに基づいてDataFrameをフィルタリングする
      filtered_df = df[(df['JP05a_GL03_04'] == jp05a_gl03_04) & # 貸方/借方フラグ
                       (df['JP13a_BS16_01'] == jp13a_bs16_01) & # 科目コード
                       (df['JP13a_BS16_02'] == jp13a_bs16_02) & # 科目名
                       df['CC05hW_01_target'].notna()] # 金額
  
      print(f"\n5. 現在の組み合わせに基づいてフィルタリングされたDataFrame ({jp05a_gl03_04}, {jp13a_bs16_01}, {jp13a_bs16_02}):")
      print(filtered_df)
  
      if not filtered_df.empty:
          # NaN値を削除せずに結果を表示する
          for _, filtered_row in filtered_df.iterrows():
              date = filtered_row['JP04a_GL02_03'] if pd.notna(filtered_row['JP04a_GL02_03']) else 'N/A'
              debit_credit_code = filtered_row['JP05a_GL03_04'] if pd.notna(filtered_row['JP05a_GL03_04']) else 'N/A'
              ledger_account_number = filtered_row['JP13a_BS16_01'] if pd.notna(filtered_row['JP13a_BS16_01']) else 'N/A'
              ledger_account_name = filtered_row['JP13a_BS16_02'] if pd.notna(filtered_row['JP13a_BS16_02']) else 'N/A'
              amount = filtered_row['CC05hW_01_target'] if pd.notna(filtered_row['CC05hW_01_target']) else 'N/A'
  
              print(f"日付: {date}, "
                    f"借方/貸方フラグ: {debit_credit_code}, "
                    f"科目コード: {ledger_account_number}, "
                    f"科目名: {ledger_account_name}, "
                    f"金額: {amount}")
  
          # グループ化に使用する列がnullでないことを保証する
          filtered_df = filtered_df.fillna('N/A')
  
          # 必要な列でグループ化し、'CC05hW_01_target'の合計を集計する
          result = filtered_df.groupby(
              ['JP04a_GL02_03_month', 'JP05a_GL03_04', 'JP13a_BS16_01', 'JP13a_BS16_02']
          )['CC05hW_01_target'].sum().reset_index()
  
          print("\n6. 途中結果:")
          print(result)
  
          # 結果を結果DataFrameに追加する
          results = pd.concat([results, result], ignore_index=True)
  
  # 最終結果を表示する
  print("\n7. 最終結果:")
  print(results)
  
  # 結果を新しいCSVファイルに保存する必要がある場合、以下の行のコメントを外す:
  # results.to_csv('data/_PCA/try/sum_by_combination.csv', index=False, encoding='utf-8-sig')

3. 各ステップの説明

3.1. CSV ファイルの読み込みと読み取り:

まず、初期データと、それを処理するために必要な設定から始めましょう。ソース CSV ファイルには、階層化された整頓されたデータが含まれています。

次の Python スクリプトは、CSV ファイルを読み取り、データを処理し、必要な情報を対象行にマージします。

# CSVファイルを読み込む
  file_path = '2405/240530/tidyGL05-31_3.csv'
  
  # CSVファイルをDataFrameに読み込む
  df = pd.read_csv(file_path, encoding='utf-8-sig')

3.2. 列名の先頭/末尾のスペースを削除します:

df.columns = df.columns.str.strip()

これにより、列名に含まれる余分なスペースが削除され、データ操作中のエラーを回避できます。

3.3. 関連する列を適切なデータ型に変換します:

# 関連する列を適切なデータ型に変換する
  df['JP05a'] = pd.to_numeric(df['JP05a'], errors='coerce').astype('Int64') # 明細行
  df['JP12a'] = pd.to_numeric(df['JP12a'], errors='coerce').astype('Int64') # 補助科目
  df['BS04cc'] = pd.to_numeric(df['BS04cc'], errors='coerce').astype('Int64') # 部門
  df['CC05hW_01'] = pd.to_numeric(df['CC05hW_01'], errors='coerce').astype('Int64') # 金額
  df['JP13a_BS16_01'] = pd.to_numeric(df['JP13a_BS16_01'], errors='coerce').astype('Int64') # 科目コード

列 ‘JP05a’、’JP12a’、’BS04cc’ はディメンション シーケンス番号です。
列 ‘CC05hW_01’ は、小単位のない JPY での金額です。
列 ‘JP13a_BS16_01’ は、勘定科目の番号です。
これらの行は、特定の列を数値データ型に変換し、エラーが発生した場合はそれらを NaN に強制変換してから、null 許容整数型 (Int64) に変換して処理します。

3.4. JP05a_GL03_04 が文字列として正しくフォーマットされていることを確認します:

# 比較のためにJP05a_GL03_04(借方/貸方フラグ)を文字列として正しくフォーマットする
  df['JP05a_GL03_04'] = df['JP05a_GL03_04'].astype(str)

これにより、JP05a_GL03_04 が借方/貸方フラグであり、フィルタリングおよびマージ操作中に一貫した比較を行うために文字列として扱われることが保証されます。

3.5. JP04a_GL02_03 を Datetime に変換:

# JP04a_GL02_03(伝票日付)を日時に変換し、非標準の日付フォーマットを処理する
  df['JP04a_GL02_03'] = pd.to_datetime(df['JP04a_GL02_03'], errors='coerce')

この行は、JP04a_GL02_03 列を datetime 形式に変換し、エラーを NaT に強制変換することで非標準の日付形式を処理します。

3.6. JP04a_GL02_03 から月を抽出:

# JP04a_GL02_03(伝票日付)から月を抽出し、新しい列に追加する
  df['JP04a_GL02_03_month'] = df['JP04a_GL02_03'].dt.to_period('M').astype(str)

これにより、JP04a_GL02_03 datetime 列から月が抽出され、新しい列 JP04a_GL02_03_month が作成されます。

3.7. 初期データフレームを印刷:

# 初期のDataFrameを表示する
  print("1. 初期のDataFrame:")
  print(df.head())

初期データフレームを印刷すると、初期データを検証し、データ型と値が正しくフォーマットされていることを確認できます。

1. 初期のDataFrame:
     JP04a  JP05a  JP12a  BS04cc            CC03dh_01  JP04a_GL02_01 JP04a_GL02_03      JP04a_GL02_04  ...     JP12a_03  CC05hZ_01 JP01c_BS28_01  JP01c_BS28_02  BS04cc_01 BS04cc_02   BS04cc_03 JP04a_GL02_03_month
  0      1      0      0       0  2021-02-01T13:55:00          273.0    2021-04-25  4月25日伝票No201今井百貨店  ...          NaN        NaN           NaN            NaN        NaN       NaN         NaN             2021-04
  1      1      2      0       0                  NaN            NaN           NaT                NaN  ...          NaN        0.0            00            対象外        NaN       NaN         NaN                 NaT
  2      1      2      0       1                  NaN            NaN           NaT                NaN  ...          NaN        NaN           NaN            NaN        0.0      共通部門  Department                 NaT
  3      1      3      0       0                  NaN            NaN           NaT                NaN  ...          NaN        0.0            00            対象外        NaN       NaN         NaN                 NaT
  4      1      3      1       0                  NaN            NaN           NaT                NaN  ...  Sub-Account        NaN           NaN            NaN        NaN       NaN         NaN                 NaT
  
  [5 rows x 24 columns]

3.8. 対象行を抽出:

target_rows = df[(df['JP12a'] == 0) & (df['BS04cc'] == 0) & (df['JP05a'] != 0)][['JP04a', 'JP05a', 'CC05hW_01']]
  print("\n2. 対象の行:")
  print(target_rows.head())

JP12aBS04cc がゼロで JP05a がゼロでない行を抽出し、CC05hW_01 値を収集します。

2. 対象の行:
      JP04a  JP05a  CC05hW_01
  1       1      2   20392404
  3       1      3   20392404
  7       2      2    2186153
  10      2      3    2186153
  13      2      5        735

3.9. わかりやすくするためにターゲット列の名前を変更します:

target_rows = target_rows.rename(columns={'CC05hW_01': 'CC05hW_01_target'})

ターゲット列の名前を変更すると、マージ プロセス中に区別しやすくなります。

3.10. JP04a 値のみの行を抽出:

# JP04a(仕訳ヘッダ)に値があり、JP05a(仕訳明細)、JP12a(補助科目)、BS04cc(部門)がすべてゼロの行を抽出する
  jp04a_rows = df[(df['JP12a'] == 0) & (df['BS04cc'] == 0) & (df['JP05a'] == 0)][['JP04a', 'JP04a_GL02_03', 'JP04a_GL02_03_month']]
  
  # マージ前に列名を明確にするために列名を変更する
  jp04a_rows = jp04a_rows.rename(columns={'JP04a_GL02_03': 'JP04a_GL02_03_value', 'JP04a_GL02_03_month': 'JP04a_GL02_03_month_value'})

これは、JP04a に値があり、他の指定された列がゼロである行を抽出します。関連する列は、マージ中にわかりやすくするために名前が変更されます。

3.11. 対象行をメイン DataFrame にマージします:

# 対象のCC05hW_01(金額)の値をメインのDataFrameにマージする
  df = pd.merge(df, target_rows, on=['JP04a', 'JP05a'], how='left')

これは、JP04aJP05a に基づいて、ターゲット CC05hW_01 値をメイン DataFrame にマージします。

3.12. JP04a の値をメイン DataFrame にマージします:

# JP04a_GL02_03(伝票日付)およびJP04a_GL02_03_month(伝票日付の月)の値をメインのDataFrameにマージする
  df = pd.merge(df, jp04a_rows, on='JP04a', how='left')

これにより、JP04a_GL02_03JP04a_GL02_03_month の値が JP04a に基づいてメイン DataFrame にマージされます。

3.13. メイン DataFrame を正しい値で更新:

# 正しいJP04a_GL02_03(伝票日付)およびJP04a_GL02_03_month(伝票日付の月)の値でメインのDataFrameを更新する
  df['JP04a_GL02_03'] = df['JP04a_GL02_03_value'].combine_first(df['JP04a_GL02_03'])
  df['JP04a_GL02_03_month'] = df['JP04a_GL02_03_month_value'].combine_first(df['JP04a_GL02_03_month'])
  
  # マージに使用した一時的な列を削除する
  df.drop(columns=['JP04a_GL02_03_value', 'JP04a_GL02_03_month_value'], inplace=True)

これにより、メイン DataFrame が正しい JP04a_GL02_03 で更新され、 JP04a_GL02_03_month の値は、combine_first メソッドを使用して、最初のシリーズの非 null 値を優先します。その後、マージに使用される一時列は削除されます。

3.14. マージおよび更新後の DataFrame を印刷:

# マージと更新後のDataFrameを表示する
  print("\n3. マージと更新後のDataFrame:")
  print(df.head())

マージおよび更新後の DataFrame を印刷すると、データが正しくマージおよび更新されたことを確認できます。

3. マージと更新後のDataFrame:
     JP04a  JP05a  JP12a  BS04cc            CC03dh_01  JP04a_GL02_01 JP04a_GL02_03      JP04a_GL02_04  ...  CC05hZ_01  JP01c_BS28_01 JP01c_BS28_02  BS04cc_01  BS04cc_02   BS04cc_03  JP04a_GL02_03_month CC05hW_01_target
  0      1      0      0       0  2021-02-01T13:55:00          273.0    2021-04-25  4月25日伝票No201今井百貨店  ...        NaN            NaN           NaN        NaN        NaN         NaN              2021-04
      <NA>
  1      1      2      0       0                  NaN            NaN    2021-04-25                NaN  ...        0.0             00           対象外        NaN        NaN         NaN              2021-04         20392404
  2      1      2      0       1                  NaN            NaN    2021-04-25                NaN  ...        NaN            NaN           NaN        0.0       共通部門  Department              2021-04         20392404
  3      1      3      0       0                  NaN            NaN    2021-04-25                NaN  ...        0.0             00           対象外        NaN        NaN         NaN              2021-04         20392404
  4      1      3      1       0                  NaN            NaN    2021-04-25                NaN  ...        NaN            NaN           NaN        NaN        NaN         NaN              2021-04         20392404

3.15. 一意の組み合わせを収集:

# JP05a_GL03_04(貸方/借方フラグ)、JP13a_BS16_01(科目コード)、およびJP13a_BS16_02(科目名)のすべてのユニークな組み合わせを収集する
  unique_combinations = df[['JP05a_GL03_04', 'JP13a_BS16_01', 'JP13a_BS16_02']].drop_duplicates()
  print("\n4. ユニークな組み合わせ:")
  print(unique_combinations)

これにより、JP05a_GL03_04JP13a_BS16_01JP13a_BS16_02 のすべての一意の組み合わせが収集され、データのフィルタリングと集計が容易になります。

4. ユニークな組み合わせ:
     JP05a_GL03_04  JP13a_BS16_01 JP13a_BS16_02
  0            nan           <NA>           NaN
  1              D            150          受取手形
  3              C            152           売掛金
  7              D            131          普通預金
  13             D            741         支払手数料
  31             D            152           売掛金
  34             C            511           売上高

3.16. 結果データフレームを初期化します:

# 結果を保存するために空のDataFrameを初期化する
  results = pd.DataFrame()

集計の結果を格納するために、空のデータフレームが初期化されます。

3.17. 各一意の組み合わせを反復処理してデータをフィルタリングおよび集計します:

# 結果を保存するために空のDataFrameを初期化する
  results = pd.DataFrame()
  
  # 各ユニークな組み合わせをフィルタリングし、データを集計する
  for _, row in unique_combinations.iterrows():
      jp05a_gl03_04 = row['JP05a_GL03_04'] # 貸方/借方フラグ
      jp13a_bs16_01 = row['JP13a_BS16_01'] # 科目コード
      jp13a_bs16_02 = row['JP13a_BS16_02'] # 科目名
      
      # 現在の組み合わせに基づいてDataFrameをフィルタリングする
      filtered_df = df[(df['JP05a_GL03_04'] == jp05a_gl03_04) & # 貸方/借方フラグ
                       (df['JP13a_BS16_01'] == jp13a_bs16_01) & # 科目コード
                       (df['JP13a_BS16_02'] == jp13a_bs16_02) & # 科目名
                       df['CC05hW_01_target'].notna()] # 金額
  
      print(f"\n5. 現在の組み合わせに基づいてフィルタリングされたDataFrame ({jp05a_gl03_04}, {jp13a_bs16_01}, {jp13a_bs16_02}):")
      print(filtered_df)
  
      if not filtered_df.empty:
          # NaN値を削除せずに結果を表示する
          for _, filtered_row in filtered_df.iterrows():
              date = filtered_row['JP04a_GL02_03'] if pd.notna(filtered_row['JP04a_GL02_03']) else 'N/A'
              debit_credit_code = filtered_row['JP05a_GL03_04'] if pd.notna(filtered_row['JP05a_GL03_04']) else 'N/A'
              ledger_account_number = filtered_row['JP13a_BS16_01'] if pd.notna(filtered_row['JP13a_BS16_01']) else 'N/A'
              ledger_account_name = filtered_row['JP13a_BS16_02'] if pd.notna(filtered_row['JP13a_BS16_02']) else 'N/A'
              amount = filtered_row['CC05hW_01_target'] if pd.notna(filtered_row['CC05hW_01_target']) else 'N/A'
  
              print(f"日付: {date}, "
                    f"借方/貸方フラグ: {debit_credit_code}, "
                    f"科目コード: {ledger_account_number}, "
                    f"科目名: {ledger_account_name}, "
                    f"金額: {amount}")
  
          # グループ化に使用する列がnullでないことを保証する
          filtered_df = filtered_df.fillna('N/A')
  
          # 必要な列でグループ化し、'CC05hW_01_target'の合計を集計する
          result = filtered_df.groupby(
              ['JP04a_GL02_03_month', 'JP05a_GL03_04', 'JP13a_BS16_01', 'JP13a_BS16_02']
          )['CC05hW_01_target'].sum().reset_index()
  
          print("\n6. 途中結果:")
          print(result)
  
          # 結果を結果DataFrameに追加する
          results = pd.concat([results, result], ignore_index=True)

このセクションでは、各一意の組み合わせを反復処理し、DataFrame をフィルター処理し、中間結果を出力し、CC05hW_01_target の合計を集計します。

5. 現在の組み合わせに基づいてフィルタリングされたDataFrame (nan, <NA>, nan):
  Empty DataFrame
  Columns: [JP04a, JP05a, JP12a, BS04cc, CC03dh_01, JP04a_GL02_01, JP04a_GL02_03, JP04a_GL02_04, GL05c_01, BS15c_01, JP05a_GL03_04, CC05hW_01, JP13a_BS16_01, JP13a_BS16_02, JP12a_01, JP12a_02, JP12a_03, CC05hZ_01, JP01c_BS28_01, JP01c_BS28_02, BS04cc_01, BS04cc_02, BS04cc_03, JP04a_GL02_03_month, CC05hW_01_target]
  Index: []
  
  5. 現在の組み合わせに基づいてフィルタリングされたDataFrame (D, 150, 受取手形):
     JP04a  JP05a  JP12a  BS04cc CC03dh_01  JP04a_GL02_01 JP04a_GL02_03 JP04a_GL02_04  GL05c_01  ...  JP12a_03 CC05hZ_01  JP01c_BS28_01  JP01c_BS28_02 BS04cc_01  BS04cc_02 BS04cc_03 JP04a_GL02_03_month  CC05hW_01_target1      1      2      0       0       NaN            NaN    2021-04-25           NaN       NaN  ...       NaN       0.0             00            対象外       NaN        NaN       NaN             2021-04          20392404
  
  [1 rows x 25 columns]
  日付: 2021-04-25 00:00:00, 借方/貸方フラグ: D, 科目コード: 150, 科目名: 受取手形, 金額: 20392404
  
  6. 途中結果:
    JP04a_GL02_03_month JP05a_GL03_04  JP13a_BS16_01 JP13a_BS16_02  CC05hW_01_target
  0             2021-04             D            150          受取手形          20392404
  
  5. 現在の組み合わせに基づいてフィルタリングされたDataFrame (C, 152, 売掛金):
      JP04a  JP05a  JP12a  BS04cc CC03dh_01  JP04a_GL02_01 JP04a_GL02_03 JP04a_GL02_04  GL05c_01  ...  JP12a_03 CC05hZ_01  JP01c_BS28_01  JP01c_BS28_02 BS04cc_01  BS04cc_02 BS04cc_03 JP04a_GL02_03_month  CC05hW_01_target
  3       1      3      0       0       NaN            NaN    2021-04-25           NaN       NaN  ...       NaN       0.0             00            対象外       NaN        NaN       NaN             2021-04          20392404
  10      2      3      0       0       NaN            NaN    2021-04-25           NaN       NaN  ...       NaN       0.0             00            対象外       NaN        NaN       NaN             2021-04           2186153
  15      2      6      0       0       NaN            NaN    2021-04-25           NaN       NaN  ...       NaN       0.0             00            対象外       NaN        NaN       NaN             2021-04
   735
  22      3      3      0       0       NaN            NaN    2021-04-25           NaN       NaN  ...       NaN       0.0             00            対象外       NaN        NaN       NaN             2021-04           6636909
  27      3      6      0       0       NaN            NaN    2021-04-25           NaN       NaN  ...       NaN       0.0             00            対象外       NaN        NaN       NaN             2021-04
   840
  
  [5 rows x 25 columns]
  日付: 2021-04-25 00:00:00, 借方/貸方フラグ: C, 科目コード: 152, 科目名: 売掛金, 金額: 20392404
  日付: 2021-04-25 00:00:00, 借方/貸方フラグ: C, 科目コード: 152, 科目名: 売掛金, 金額: 2186153
  日付: 2021-04-25 00:00:00, 借方/貸方フラグ: C, 科目コード: 152, 科目名: 売掛金, 金額: 735
  日付: 2021-04-25 00:00:00, 借方/貸方フラグ: C, 科目コード: 152, 科目名: 売掛金, 金額: 6636909
  日付: 2021-04-25 00:00:00, 借方/貸方フラグ: C, 科目コード: 152, 科目名: 売掛金, 金額: 840
  
  6. 途中結果:
    JP04a_GL02_03_month JP05a_GL03_04  JP13a_BS16_01 JP13a_BS16_02  CC05hW_01_target
  0             2021-04             C            152           売掛金          29217041
  
  5. 現在の組み合わせに基づいてフィルタリングされたDataFrame (D, 131, 普通預金):
      JP04a  JP05a  JP12a  BS04cc CC03dh_01  JP04a_GL02_01 JP04a_GL02_03 JP04a_GL02_04  GL05c_01  ...  JP12a_03 CC05hZ_01  JP01c_BS28_01  JP01c_BS28_02 BS04cc_01  BS04cc_02 BS04cc_03 JP04a_GL02_03_month  CC05hW_01_target
  7       2      2      0       0       NaN            NaN    2021-04-25           NaN       NaN  ...       NaN       0.0             00            対象外       NaN        NaN       NaN             2021-04           2186153
  19      3      2      0       0       NaN            NaN    2021-04-25           NaN       NaN  ...       NaN       0.0             00            対象外       NaN        NaN       NaN             2021-04           6636909
  
  [2 rows x 25 columns]
  日付: 2021-04-25 00:00:00, 借方/貸方フラグ: D, 科目コード: 131, 科目名: 普通預金, 金額: 2186153
  日付: 2021-04-25 00:00:00, 借方/貸方フラグ: D, 科目コード: 131, 科目名: 普通預金, 金額: 6636909
  
  6. 途中結果:
    JP04a_GL02_03_month JP05a_GL03_04  JP13a_BS16_01 JP13a_BS16_02  CC05hW_01_target
  0             2021-04             D            131          普通預金           8823062
  
  5. 現在の組み合わせに基づいてフィルタリングされたDataFrame (D, 741, 支払手数料):
      JP04a  JP05a  JP12a  BS04cc CC03dh_01  JP04a_GL02_01 JP04a_GL02_03 JP04a_GL02_04  GL05c_01  ...  JP12a_03 CC05hZ_01  JP01c_BS28_01  JP01c_BS28_02 BS04cc_01  BS04cc_02 BS04cc_03 JP04a_GL02_03_month  CC05hW_01_target
  13      2      5      0       0       NaN            NaN    2021-04-25           NaN       NaN  ...       NaN      66.0             Q5          仕入10%       NaN        NaN       NaN             2021-04
  735
  25      3      5      0       0       NaN            NaN    2021-04-25           NaN       NaN  ...       NaN      76.0             Q5          仕入10%       NaN        NaN       NaN             2021-04
  840
  
  [2 rows x 25 columns]
  日付: 2021-04-25 00:00:00, 借方/貸方フラグ: D, 科目コード: 741, 科目名: 支払手数料, 金額: 735
  日付: 2021-04-25 00:00:00, 借方/貸方フラグ: D, 科目コード: 741, 科目名: 支払手数料, 金額: 840
  
  6. 途中結果:
    JP04a_GL02_03_month JP05a_GL03_04  JP13a_BS16_01 JP13a_BS16_02  CC05hW_01_target
  0             2021-04             D            741         支払手数料              1575
  
  5. 現在の組み合わせに基づいてフィルタリングされたDataFrame (D, 152, 売掛金):
      JP04a  JP05a  JP12a  BS04cc CC03dh_01  JP04a_GL02_01 JP04a_GL02_03 JP04a_GL02_04  GL05c_01  ...  JP12a_03 CC05hZ_01  JP01c_BS28_01  JP01c_BS28_02 BS04cc_01  BS04cc_02 BS04cc_03 JP04a_GL02_03_month  CC05hW_01_target
  31      4      2      0       0       NaN            NaN    2021-05-31           NaN       NaN  ...       NaN       0.0             00            対象外       NaN        NaN       NaN             2021-05           1245400
  36      4      5      0       0       NaN            NaN    2021-05-31           NaN       NaN  ...       NaN       0.0             00            対象外       NaN        NaN       NaN             2021-05           1329984
  41      4      8      0       0       NaN            NaN    2021-05-31           NaN       NaN  ...       NaN       0.0             00            対象外       NaN        NaN       NaN             2021-05           3964716
  46      4     11      0       0       NaN            NaN    2021-05-31           NaN       NaN  ...       NaN       0.0             00            対象外       NaN        NaN       NaN             2021-05            101952
  51      4     14      0       0       NaN            NaN    2021-05-31           NaN       NaN  ...       NaN       0.0             00            対象外       NaN        NaN       NaN             2021-05             40800
  
  [5 rows x 25 columns]
  日付: 2021-05-31 00:00:00, 借方/貸方フラグ: D, 科目コード: 152, 科目名: 売掛金, 金額: 1245400
  日付: 2021-05-31 00:00:00, 借方/貸方フラグ: D, 科目コード: 152, 科目名: 売掛金, 金額: 1329984
  日付: 2021-05-31 00:00:00, 借方/貸方フラグ: D, 科目コード: 152, 科目名: 売掛金, 金額: 3964716
  日付: 2021-05-31 00:00:00, 借方/貸方フラグ: D, 科目コード: 152, 科目名: 売掛金, 金額: 101952
  日付: 2021-05-31 00:00:00, 借方/貸方フラグ: D, 科目コード: 152, 科目名: 売掛金, 金額: 40800
  
  6. 途中結果:
    JP04a_GL02_03_month JP05a_GL03_04  JP13a_BS16_01 JP13a_BS16_02  CC05hW_01_target
  0             2021-05             D            152           売掛金           6682852
  
  5. 現在の組み合わせに基づいてフィルタリングされたDataFrame (C, 511, 売上高):
      JP04a  JP05a  JP12a  BS04cc CC03dh_01  JP04a_GL02_01 JP04a_GL02_03 JP04a_GL02_04  GL05c_01  ...  JP12a_03 CC05hZ_01  JP01c_BS28_01  JP01c_BS28_02 BS04cc_01  BS04cc_02 BS04cc_03 JP04a_GL02_03_month  CC05hW_01_target
  34      4      3      0       0       NaN            NaN    2021-05-31           NaN       NaN  ...       NaN  113218.0             B5          売上10%       NaN        NaN       NaN             2021-05           1245400
  39      4      6      0       0       NaN            NaN    2021-05-31           NaN       NaN  ...       NaN  120907.0             B5          売上10%       NaN        NaN       NaN             2021-05           1329984
  44      4      9      0       0       NaN            NaN    2021-05-31           NaN       NaN  ...       NaN  360428.0             B5          売上10%       NaN        NaN       NaN             2021-05           3964716
  
  [3 rows x 25 columns]
  日付: 2021-05-31 00:00:00, 借方/貸方フラグ: C, 科目コード: 511, 科目名: 売上高, 金額: 1245400
  日付: 2021-05-31 00:00:00, 借方/貸方フラグ: C, 科目コード: 511, 科目名: 売上高, 金額: 1329984
  日付: 2021-05-31 00:00:00, 借方/貸方フラグ: C, 科目コード: 511, 科目名: 売上高, 金額: 3964716
  
  6. 途中結果:
    JP04a_GL02_03_month JP05a_GL03_04  JP13a_BS16_01 JP13a_BS16_02  CC05hW_01_target
  0             2021-05             C            511           売上高           6540100
  
  5. 現在の組み合わせに基づいてフィルタリングされたDataFrame (C, 521, 売上値引戻り高):
      JP04a  JP05a  JP12a  BS04cc CC03dh_01  JP04a_GL02_01 JP04a_GL02_03 JP04a_GL02_04  GL05c_01  ...  JP12a_03 CC05hZ_01  JP01c_BS28_01  JP01c_BS28_02 BS04cc_01  BS04cc_02 BS04cc_03 JP04a_GL02_03_month  CC05hW_01_target
  49      4     12      0       0       NaN            NaN    2021-05-31           NaN       NaN  ...       NaN    9268.0             C5          売返10%       NaN        NaN       NaN             2021-05            101952
  54      4     15      0       0       NaN            NaN    2021-05-31           NaN       NaN  ...       NaN    3709.0             C5          売返10%       NaN        NaN       NaN             2021-05             40800
  
  [2 rows x 25 columns]
  日付: 2021-05-31 00:00:00, 借方/貸方フラグ: C, 科目コード: 521, 科目名: 売上値引戻り高, 金額: 101952
  日付: 2021-05-31 00:00:00, 借方/貸方フラグ: C, 科目コード: 521, 科目名: 売上値引戻り高, 金額: 40800
  
  6. 途中結果:
    JP04a_GL02_03_month JP05a_GL03_04  JP13a_BS16_01 JP13a_BS16_02  CC05hW_01_target

3.18. 最終結果の表示:

# 最終結果を表示する
  print("\n7. 最終結果:")
  print(results)

最後に、JP04a_GL02_03_monthJP05a_GL03_04JP05a_GL03_04 の各組み合わせに対する CC05hW_01_target の合計を示す最終結果を表示します。 JP13a_BS16_01、および JP13a_BS16_02

7. 最終結果:
    JP04a_GL02_03_month JP05a_GL03_04  JP13a_BS16_01 JP13a_BS16_02  CC05hW_01_target
  0             2021-04             D            150          受取手形          20392404
  1             2021-04             C            152           売掛金          29217041
  2             2021-04             D            131          普通預金           8823062
  3             2021-04             D            741         支払手数料              1575
  4             2021-05             D            152           売掛金           6682852
  5             2021-05             C            511           売上高           6540100

これらの手順に従うことで、階層的に整頓されたデータで効率的なデータ管理が確保され、冗長性が回避され、財務データを正確に要約できます。

4. 結論

階層的な整頓されたデータを処理するには、さまざまなレベルの観察がどのように報告されるかを慎重に考慮する必要があります。必要なデータを対象行にマージすることで、借方/貸方フラグ、口座番号、月に基づいて金額を要約できるため、冗長性が回避され、効率的なデータ管理が保証されます。

この記事で概説したアプローチは、Python と pandas を使用してこのようなデータを処理する方法を示し、財務報告のための堅牢なソリューションを提供します。

5. 階層的な整頓されたデータ ファイル

JP04a

JP05a

JP12a

BS04cc

CC03dh_01

JP04a_GL02_01

JP04a_GL02_03

JP04a_GL02_04

GL05c_01

BS15c_01

JP05a_GL03_04

CC05hW_01

JP13a_BS16_01

JP13a_BS16_02

JP12a_01

JP12a_02

JP12a_03

CC05hZ_01

JP01c_BS28_01

JP01c_BS28_02

BS04cc_01

BS04cc_02

BS04cc_03

1

0

0

0

2021-02-01T13:55:00

273

2021-04-25

4月25日伝票No201今井百貨店

1

21

1

2

0

0

D

20392404

150

受取手形

0

00

対象外

1

2

0

1

000

共通部門

Department

1

3

0

0

C

20392404

152

売掛金

0

00

対象外

1

3

1

0

2

今井百貨店

Sub-Account

1

3

0

1

000

共通部門

Department

2

0

0

0

2021-02-01T13:55:00

274

2021-04-25

4月25日伝票No202株式会社 総合経営

1

21

2

2

0

0

D

2186153

131

普通預金

0

00

対象外

2

2

1

0

30

三井 名古屋

Sub-Account

2

2

0

1

000

共通部門

Department

2

3

0

0

C

2186153

152

売掛金

0

00

対象外

2

3

1

0

7

㈱総合経営

Sub-Account

2

3

0

1

000

共通部門

Department

2

5

0

0

D

735

741

支払手数料

66

Q5

仕入10%

2

5

0

1

030

名古屋支店

Department

2

6

0

0

C

735

152

売掛金

0

00

対象外

2

6

1

0

7

㈱総合経営

Sub-Account

2

6

0

1

000

共通部門

Department

3

0

0

0

2021-02-01T13:55:00

275

2021-04-25

4月25日伝票No203株式会社 小林マーケット

1

21

3

2

0

0

D

6636909

131

普通預金

0

00

対象外

3

2

1

0

10

北海道 駅前

Sub-Account

3

2

0

1

000

共通部門

Department

3

3

0

0

C

6636909

152

売掛金

0

00

対象外

3

3

1

0

25

㈱小林マーケット

Sub-Account

3

3

0

1

000

共通部門

Department

3

5

0

0

D

840

741

支払手数料

76

Q5

仕入10%

3

5

0

1

010

札幌営業所

Department

3

6

0

0

C

840

152

売掛金

0

00

対象外

3

6

1

0

25

㈱小林マーケット

Sub-Account

3

6

0

1

000

共通部門

Department

4

0

0

0

2021-02-01T13:55:00

114

2021-05-31

5月1日~5月31日分売上

1

21

4

2

0

0

D

1245400

152

売掛金

0

00

対象外

4

2

1

0

5

㈱ABC

Sub-Account

4

2

0

1

000

共通部門

Department

4

3

0

0

C

1245400

511

売上高

113218

B5

売上10%

4

3

0

1

010

札幌営業所

Department

4

5

0

0

D

1329984

152

売掛金

0

00

対象外

4

5

1

0

14

㈱藤田

Sub-Account

4

5

0

1

000

共通部門

Department

4

6

0

0

C

1329984

511

売上高

120907

B5

売上10%

4

6

0

1

010

札幌営業所

Department

4

8

0

0

D

3964716

152

売掛金

0

00

対象外

4

8

1

0

25

㈱小林マーケット

Sub-Account

4

8

0

1

000

共通部門

Department

4

9

0

0

C

3964716

511

売上高

360428

B5

売上10%

4

9

0

1

010

札幌営業所

Department

4

11

0

0

D

101952

152

売掛金

0

00

対象外

4

11

1

0

25

㈱小林マーケット

Sub-Account

4

11

0

1

000

共通部門

Department

4

12

0

0

C

101952

521

売上値引戻り高

9268

C5

売返10%

4

12

0

1

010

札幌営業所

Department

4

14

0

0

D

40800

152

売掛金

0

00

対象外

4

14

1

0

5

㈱ABC

Sub-Account

4

14

0

1

000

共通部門

Department

4

15

0

0

C

40800

521

売上値引戻り高

3709

C5

売返10%

4

15

0

1

010

札幌営業所

Department


投稿日

カテゴリー:

, , ,

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です