Views: 20
財務報告における階層的整頓データの取り扱い
このブログ投稿では、財務報告における階層的整頓データの取り扱い方について説明します。借方/貸方フラグ、口座番号、月に基づいて金額を集計するために必要なデータを対象行にマージし、効率的なデータ管理を確保して冗長性を回避する方法について説明します。
1. 階層的整頓データの特徴
階層的整頓データは、異なる行で異なるレベルの観察を報告するため、レポート ファイルが冗長になることはありません。ただし、借方/貸方フラグ、口座番号、月に基づいて金額を集計するには、必要なデータを対象行にマージする必要があります。
入力された日付はヘッダー エントリ レベルの行に報告され、借方/貸方フラグ、科目コード、金額のデータは明細行で報告されます。日付を明細行のデータにマージする必要があります。これについては、後のセクションで説明します。
最終結果。JP04a_GL02_03_month
、JP05a_GL03_04
、JP13a_BS16_01
、JP13a_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())
JP12a
と BS04cc
がゼロで 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')
これは、JP04a
と JP05a
に基づいて、ターゲット 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_03
と JP04a_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_04
、JP13a_BS16_01
、JP13a_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_month
、JP05a_GL03_04
、JP05a_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 |
- 1. 階層的整頓データの特徴
- 2. ソース コードと説明
- 3. 各ステップの説明
- 3.1. CSV ファイルの読み込みと読み取り:
- 3.2. 列名の先頭/末尾のスペースを削除します:
- 3.3. 関連する列を適切なデータ型に変換します:
- 3.4. JP05a_GL03_04 が文字列として正しくフォーマットされていることを確認します:
- 3.5. JP04a_GL02_03 を Datetime に変換:
- 3.6. JP04a_GL02_03 から月を抽出:
- 3.7. 初期データフレームを印刷:
- 3.8. 対象行を抽出:
- 3.9. わかりやすくするためにターゲット列の名前を変更します:
- 3.10. JP04a 値のみの行を抽出:
- 3.11. 対象行をメイン DataFrame にマージします:
- 3.12. JP04a の値をメイン DataFrame にマージします:
- 3.13. メイン DataFrame を正しい値で更新:
- 3.14. マージおよび更新後の DataFrame を印刷:
- 3.15. 一意の組み合わせを収集:
- 3.16. 結果データフレームを初期化します:
- 3.17. 各一意の組み合わせを反復処理してデータをフィルタリングおよび集計します:
- 3.18. 最終結果の表示:
- 4. 結論
- 5. 階層的な整頓されたデータ ファイル
コメントを残す