PayPal取引履歴CSVのデータ乱れをPython Pandasで整形し会計ソフトへ取り込む方法【米国税務対応】
導入
PayPalは、個人事業主やフリーランサーにとって、オンラインでの決済を容易にする非常に便利なツールです。しかし、PayPalからダウンロードできる取引履歴CSVファイルは、そのままでは会計ソフトへの取り込みが難しい、特有のデータ乱れを含んでいることが少なくありません。特に、米国での税務申告を正確に行うためには、これらのデータを正確に整理し、会計記録に反映させることが不可欠です。本記事では、Pythonの強力なデータ分析ライブラリであるPandasを活用し、PayPalのCSVデータに含まれる一般的な乱れを整形し、会計ソフトへスムーズに取り込むための網羅的なガイドを提供します。米国税務の観点からも、正確な記帳がいかに重要であるかを踏まえ、具体的な手順とコード例を交えて解説します。
基礎知識
PayPal取引履歴CSVの特性
PayPalの取引履歴CSVは、エクスポートする期間や取引の種類によって、フォーマットが微妙に異なることがあります。一般的に、日付、説明、タイプ(支払い、受取、返金など)、金額、通貨、手数料、そして場合によってはメモや請求書番号などが含まれます。しかし、以下のような問題点がしばしば見られます。
- 日付フォーマットの不統一: ‘YYYY-MM-DD’, ‘MM/DD/YYYY’, ‘DD-Mon-YYYY’ など、複数のフォーマットが混在している。
- 金額の表記揺れ: 正の数(受取)と負の数(支払)、あるいは通貨記号($, €, ¥)やカンマ(,)が含まれている。
- 説明欄のノイズ: 取引内容を特定しにくい曖昧な記述や、不要な情報(例: ‘Payment from John Doe’, ‘Invoice #12345’)が含まれる。
- 手数料の扱い: 手数料が別項目になっている場合と、総額から差し引かれている場合がある。
- 重複データ: 稀に、同じ取引が複数行にわたって記録されていることがある。
- 文字コードの問題: 日本語環境でダウンロードした場合、文字化けが発生することがある(UTF-8, Shift-JISなど)。
Python Pandasの役割
Pandasは、Pythonでデータ操作と分析を行うための標準的なライブラリです。DataFrameという表形式のデータ構造を提供し、CSVファイルの読み込み、データのクリーニング、変換、集計などを効率的に行うことができます。この柔軟性と強力な機能により、PayPalのCSVデータ整形作業を自動化し、大幅に効率化することが可能です。
米国税務における重要性
米国では、収入と経費を正確に記録し、税務申告することが納税者の義務です。PayPalでの取引は、売上(Income)または経費(Expense)として計上されるべきものです。取引履歴が不正確だと、過大または過小な申告につながり、ペナルティや追徴課税のリスクが生じます。また、経費の計上漏れは、税負担を不必要に増加させる原因となります。正確な会計記録は、監査に対応するためにも不可欠です。
詳細解説
1. PayPal CSVファイルの読み込みと初期確認
まず、Pandasを使ってCSVファイルを読み込みます。文字コードの問題が発生しやすいので、encoding引数を指定することが重要です。一般的には ‘utf-8’ または ‘cp932’ (Shift-JIS) が使われます。
import pandas as pd
# ファイルパスを指定
file_path = 'paypal_transactions.csv'
try:
# UTF-8で読み込みを試みる
df = pd.read_csv(file_path, encoding='utf-8')
except UnicodeDecodeError:
# UTF-8で失敗した場合、Shift-JIS (cp932) で試みる
df = pd.read_csv(file_path, encoding='cp932')
# 最初の5行を表示してデータを確認
print(df.head())
# 列名とデータ型を確認
print(df.info())
# 基本統計量を確認
print(df.describe())
df.head()でデータの先頭部分を確認し、df.info()で列名、非null数、データ型を把握します。df.describe()は数値データの基本的な統計情報(件数、平均、標準偏差、最小値、最大値など)を表示し、データの全体像を掴むのに役立ちます。
2. データクリーニングと整形
2.1. 不要な列の削除
分析や会計処理に不要な列があれば、削除します。例えば、「取引ID」や「バッチID」などは、会計ソフトへの取り込みには不要な場合が多いです。
# 不要な列をリストアップ (例)
unnecessary_columns = ['Transaction ID', 'Batch ID', 'Balance After Transaction']
# 実際に存在する列のみを削除対象とする
columns_to_drop = [col for col in unnecessary_columns if col in df.columns]
df = df.drop(columns=columns_to_drop)
print(f"\nDropped columns: {columns_to_drop}")
2.2. 日付フォーマットの統一
日付列は、会計処理や期間集計の基本となります。Pandasのto_datetime関数を使って、様々なフォーマットの日付を標準的な形式(例: ‘YYYY-MM-DD’)に統一します。errors='coerce'を指定すると、変換できない値はNaT(Not a Time)になります。
# 日付列の名前を 'Date' と仮定 (実際の列名に合わせて変更)
date_column = 'Date'
# 既存の日付列が存在する場合、それを変換
if date_column in df.columns:
df[date_column] = pd.to_datetime(df[date_column], errors='coerce')
# NaTになった行を確認(必要に応じて処理)
if df[date_column].isnull().any():
print(f"\nWarning: Some dates in '{date_column}' could not be parsed and are set to NaT.")
# print(df[df[date_column].isnull()]) # NaTになった行を表示
else:
print(f"\nError: Date column '{date_column}' not found.")
# 日付フォーマットを 'YYYY-MM-DD' に変換して表示(オプション)
# df[date_column] = df[date_column].dt.strftime('%Y-%m-%d')
errors='coerce'は、不正な日付形式を無視して欠損値(NaT)として扱うための重要なオプションです。これにより、データ全体がエラーで停止するのを防ぎます。
2.3. 金額データの整形
金額列は、数値計算の対象となるため、文字列から数値型(floatまたはint)に変換する必要があります。通貨記号、カンマ、マイナス記号などを除去し、必要に応じて正負を調整します。
# 金額列の名前を 'Amount' と仮定 (実際の列名に合わせて変更)
amount_column = 'Amount'
if amount_column in df.columns:
# 通貨記号やカンマを除去
df[amount_column] = df[amount_column].astype(str).str.replace(r'[$,€¥,]', '', regex=True)
# 数値に変換 (エラーはNaNにする)
df[amount_column] = pd.to_numeric(df[amount_column], errors='coerce')
# 必要に応じて、取引タイプ列に基づいて正負を調整
# 例: 'Type' 列が 'Debit' の場合は負、'Credit' の場合は正とする
# このロジックはPayPalのCSVフォーマットによって大きく異なるため、要確認
# if 'Type' in df.columns:
# is_debit = df['Type'].str.contains('Debit|Withdrawal|Payment', case=False, na=False)
# df.loc[is_debit, amount_column] = df.loc[is_debit, amount_column] * -1
# マイナス記号が説明に含まれる場合(例:返金)の処理
# debit_amount_column = 'Debit Amount'
# credit_amount_column = 'Credit Amount'
# if debit_amount_column in df.columns:
# df[debit_amount_column] = pd.to_numeric(df[debit_amount_column].astype(str).str.replace(r'[$,€¥,]', '', regex=True), errors='coerce')
# df[debit_amount_column] = df[debit_amount_column].fillna(0) * -1
# if credit_amount_column in df.columns:
# df[credit_amount_column] = pd.to_numeric(df[credit_amount_column].astype(str).str.replace(r'[$,€¥,]', '', regex=True), errors='coerce')
# df[credit_amount_column] = df[credit_amount_column].fillna(0)
# df[amount_column] = df[debit_amount_column] + df[credit_amount_column]
# NaNになった行を確認(必要に応じて処理)
if df[amount_column].isnull().any():
print(f"\nWarning: Some amounts in '{amount_column}' could not be parsed and are set to NaN.")
# print(df[df[amount_column].isnull()]) # NaNになった行を表示
else:
print(f"\nError: Amount column '{amount_column}' not found.")
金額の処理は、PayPalのCSVフォーマットに依存します。場合によっては、「受取額」と「支払額」が別々の列になっていることもあります。その際は、それぞれの列を数値に変換し、会計ソフトが要求する形式(例:受取は正、支払は負)に統合する必要があります。
2.4. 説明欄のクリーニング
説明(Description)列は、取引内容を特定するために重要ですが、不要な情報が多く含まれることがあります。正規表現などを用いて、取引の本質的な部分だけを抽出または整形します。
# 説明列の名前を 'Description' と仮定 (実際の列名に合わせて変更)
description_column = 'Description'
if description_column in df.columns:
# 不要なキーワードやパターンを除去 (例: 'Payment from', 'Invoice #...')
df[description_column] = df[description_column].str.replace(r'^(Payment from|Invoice #[0-9-]+|\(.*?\)|\s-\s.*)', '', regex=True)
# 前後の空白を除去
df[description_column] = df[description_column].str.strip()
# 空になった説明を 'N/A' などで埋める(オプション)
df[description_column] = df[description_column].replace('', 'N/A')
# print(df[[description_column]].head())
else:
print(f"\nError: Description column '{description_column}' not found.")
正規表現は強力ですが、複雑になりがちです。まずは単純な文字列置換から始め、必要に応じて正規表現を適用していくのが良いでしょう。重要なのは、クリーニング後も取引内容が理解できることです。
2.5. 手数料の処理
PayPalの手数料(Fee)は、経費として計上できる場合があります。手数料列があれば、それを独立した列として扱い、必要であれば合計金額から差し引くなどの調整を行います。もし手数料が総額に含まれている場合は、総額から手数料分を別途計算して差し引く必要があります。
# 手数列の名前を 'Fee' と仮定 (実際の列名に合わせて変更)
fee_column = 'Fee'
if fee_column in df.columns:
# 通貨記号やカンマを除去し、数値に変換
df[fee_column] = df[fee_column].astype(str).str.replace(r'[$,€¥,]', '', regex=True)
df[fee_column] = pd.to_numeric(df[fee_column], errors='coerce')
df[fee_column] = df[fee_column].fillna(0)
# 手数料は通常マイナス値として記録されることが多い
# 必要に応じて正の値に変換 (例: 経費計上用)
# df['Fee_Expense'] = df[fee_column].abs()
# 総額から手数料を差し引いた純額を計算 (もし必要なら)
# net_amount_column = 'Net Amount'
# if amount_column in df.columns:
# df[net_amount_column] = df[amount_column] - df[fee_column]
else:
print(f"\nInfo: Fee column '{fee_column}' not found. Assuming fees are included in the amount or not separately tracked.")
手数料の扱いは、税務上の判断が絡みます。米国の税法では、PayPalの手数料は事業運営に必要な経費(Cost of Goods SoldやProcessing Feesなど)として認められる可能性があります。会計ソフトに取り込む際は、これらの手数料を適切な勘定科目に割り当てる必要があります。
2.6. 重複データの検出と削除
drop_duplicates()メソッドを使用して、完全に一致する行を削除できます。特定の列の組み合わせで重複を判断することも可能です。
# 全ての列が完全に一致する重複行を削除
initial_rows = len(df)
df = df.drop_duplicates()
removed_rows = initial_rows - len(df)
print(f"\nRemoved {removed_rows} duplicate rows.")
# 特定の列(例:日付、金額、説明)に基づいて重複を削除する場合
# df = df.drop_duplicates(subset=['Date', 'Amount', 'Description'], keep='first')
keep='first'は、最初に出現した行を残すオプションです。どの行を残すかは、データの性質によって判断が必要です。
3. 会計ソフト用データへの変換
整形後のDataFrameを、会計ソフトが要求する形式(通常はCSV)に変換します。列名を会計ソフトのフォーマットに合わせる必要がある場合も多いです。
# 会計ソフト用CSVへの変換
output_file_path = 'cleaned_paypal_transactions.csv'
# 会計ソフトで必要な列を選択・リネーム (例)
# accounting_columns = {
# 'Date': 'TransactionDate',
# 'Description': 'Memo',
# 'Amount': 'Amount'
# }
# df_accounting = df[accounting_columns.keys()].rename(columns=accounting_columns)
# ここでは、整形済みのDataFrame全体をCSVとして保存
df.to_csv(output_file_path, index=False, encoding='utf-8-sig') # utf-8-sig でExcelでの文字化けを防ぐ
print(f"\nCleaned data saved to: {output_file_path}")
print("\nFinal DataFrame preview:")
print(df.head())
print("\nFinal DataFrame info:")
print(df.info())
index=Falseは、DataFrameのインデックスをCSVに書き出さないようにするための重要なオプションです。encoding='utf-8-sig'は、Microsoft Excelで日本語などのマルチバイト文字を正しく表示させるために、BOM(Byte Order Mark)を付加します。
具体的なケーススタディ・計算例
ある個人事業主(フリーランサー)が、PayPalで商品販売とコンサルティングサービスを提供していると仮定します。月次のPayPal取引履歴CSV(paypal_monthly.csv)を整形し、会計ソフト(例: QuickBooks, Xero)に取り込むシナジーを考えます。
ケース:月次レポートの処理
元のCSVデータ(抜粋):
Date,Description,Amount,Fee,Balance
2023-10-01,Sale of digital art - Order #1001,$150.00,$4.50,$1,000.50
2023-10-05,Consulting Service Fee,$500.00,$15.00,$1,486.00
2023-10-10,Refund for Order #1001,-$150.00,-$4.50,$1,336.00
2023-10-15,Payment Received from Client B,$200.00,$6.00,$1,530.00
2023/10/20,Withdrawal to Bank Account,-$500.00,N/A,$1,030.00
Python Pandasによる処理:
import pandas as pd
# CSV読み込み(ここでは仮のデータフレームを作成)
data = {
'Date': ['2023-10-01', '2023-10-05', '2023-10-10', '2023-10-15', '2023/10/20'],
'Description': ['Sale of digital art - Order #1001', 'Consulting Service Fee', 'Refund for Order #1001', 'Payment Received from Client B', 'Withdrawal to Bank Account'],
'Amount': ['$150.00', '$500.00', '-$150.00', '$200.00', '-$500.00'],
'Fee': ['$4.50', '$15.00', '-$4.50', '$6.00', 'N/A'],
'Balance': ['$1,000.50', '$1,486.00', '$1,336.00', '$1,530.00', '$1,030.00']
}
df = pd.DataFrame(data)
# --- クリーニング処理 ---
# 1. 不要な列の削除 ('Balance' 列を削除)
df = df.drop(columns=['Balance'])
# 2. 日付フォーマットの統一
df['Date'] = pd.to_datetime(df['Date'], errors='coerce')
# 3. 金額データの整形
df['Amount'] = df['Amount'].astype(str).str.replace(r'[$,]', '', regex=True)
df['Amount'] = pd.to_numeric(df['Amount'], errors='coerce')
# 4. 手数料データの整形
df['Fee'] = df['Fee'].astype(str).str.replace(r'[$,]', '', regex=True)
df['Fee'] = pd.to_numeric(df['Fee'], errors='coerce')
df['Fee'] = df['Fee'].fillna(0) # N/Aを0に変換
# 5. 説明欄のクリーニング
df['Description'] = df['Description'].str.replace(r' - Order #[0-9]+', '', regex=True)
df['Description'] = df['Description'].str.replace(r'^Payment Received from ', '', regex=True)
df['Description'] = df['Description'].str.strip()
# 6. 取引タイプに応じた金額調整(例:Withdrawalは通常マイナス)
# この例ではAmount列に既に正負が含まれているため、追加処理は不要だが、
# 別列(Debit/Credit)の場合はここで調整が必要
# 7. 重複データの削除 (この例ではなし)
# --- 会計ソフト用データ準備 ---
# 会計ソフトで必要な列を選択・リネーム
# 例: 'Date', 'Description', 'Amount', 'Fee'
# QuickBooks Online のようなソフトでは、'Date', 'Description', 'Amount', 'Category' などが必要
# PayPalの手数料を 'Processing Fee' として計上する場合
# 受取と支払いを明確に分ける(例)
df['Transaction Type'] = df['Amount'].apply(lambda x: 'Income' if x > 0 else ('Expense' if x < 0 else 'N/A'))
# 収入と経費を別々の列に分ける(会計ソフトのインポート形式による)
df['Income'] = df.apply(lambda row: row['Amount'] if row['Transaction Type'] == 'Income' else 0, axis=1)
df['Expense'] = df.apply(lambda row: abs(row['Amount']) if row['Transaction Type'] == 'Expense' else 0, axis=1)
# 手数料を経費として計上(例)
df['Processing Fee'] = df['Fee'].apply(lambda x: abs(x) if x != 0 else 0)
# 会計ソフト用の最終的な列を選択 (例)
final_columns = ['Date', 'Description', 'Income', 'Expense', 'Processing Fee']
df_final = df[final_columns]
# CSVとして保存
output_file = 'paypal_for_accounting.csv'
df_final.to_csv(output_file, index=False, encoding='utf-8-sig')
print("\n--- Processed DataFrame for Accounting ---")
print(df_final.head())
print(f"\nData saved to {output_file}")
# --- 米国税務上の考察 ---
# 'Sale of digital art' および 'Consulting Service Fee', 'Payment Received from Client B' は収入 (Income) として計上。
# 'Refund for Order #1001' は、元の売上から相殺されるか、別途調整が必要。
# 'Withdrawal to Bank Account' は、単なる資金移動であり、収入でも経費でもないため、会計上は無視するか、あるいは特別な勘定科目(例:Owner's Draw)に割り当てる。
# 'Fee' 列は、'Processing Fee' として経費計上できる可能性がある。
処理後のCSVデータ(paypal_for_accounting.csv):
Date,Description,Income,Expense,Processing Fee
2023-10-01,Sale of digital art,150.0,0.0,4.5
2023-10-05,Consulting Service Fee,500.0,0.0,15.0
2023-10-10,Refund for Order #1001,0.0,150.0,4.5
2023-10-15,Client B,200.0,0.0,6.0
2023-10-20,Withdrawal to Bank Account,0.0,500.0,0.0
この例では、返金(Refund)や資金移動(Withdrawal)もそのまま処理していますが、会計ソフトへの取り込み時には、これらの取引を適切に処理(例:返金は売上からの控除、資金移動は無視)する必要があります。特に、Withdrawalは収入でも経費でもなく、単にPayPal口座から銀行口座への資金移動なので、Income/Expense列には計上せず、無視するか、あるいはオーナーへの払い出し(Owner's Draw)などの勘定科目に割り当てるのが一般的です。手数料(Fee)は、事業に必要な経費として計上できる可能性があります。
メリットとデメリット
メリット
- 自動化による時間短縮: 手作業でのデータ入力や修正作業が不要になり、大幅な時間節約につながります。
- 正確性の向上: ヒューマンエラー(入力ミス、計算ミス)を排除し、データの正確性を高めます。
- 一貫性の確保: 常に同じルールでデータ整形が行われるため、一貫した記録を維持できます。
- 柔軟なカスタマイズ: 会計ソフトの要求や、自身の分析目的に合わせて、整形ルールを自由にカスタマイズできます。
- 大量データへの対応: データ量が多くても、迅速かつ効率的に処理できます。
- 米国税務コンプライアンス: 正確な会計記録は、正確な税務申告の基盤となります。
デメリット
- 初期学習コスト: PythonとPandasの基本的な知識が必要です。プログラミング未経験者には学習が必要です。
- スクリプト開発の手間: 初めてのCSVフォーマットに対して、適切なクリーニングスクリプトを作成するには試行錯誤が必要です。
- フォーマット変更への対応: PayPalのCSVフォーマットが将来変更された場合、スクリプトの修正が必要になる可能性があります。
- 複雑な取引への対応: 非常に複雑な取引(例:通貨換算レートが絡む場合、複数商品が含まれる場合など)は、スクリプトが複雑化する可能性があります。
- 過度な自動化のリスク: クリーニングロジックに誤りがあった場合、大量の不正なデータが会計ソフトに取り込まれるリスクがあります。
よくある間違い・注意点
- 文字コードの誤り: CSVファイルを読み込む際に間違った文字コードを指定すると、文字化けが発生し、後の処理でエラーの原因となります。UTF-8またはShift-JIS(cp932)を試すのが一般的です。
- 日付/金額フォーマットの無視: `pd.to_datetime`や`pd.to_numeric`で
errors='coerce'を指定しないと、不正なフォーマットのデータでスクリプトが停止します。 - 列名の誤り: コード内の列名が、実際のCSVファイルの列名と一致していないとエラーになります。CSVファイルを開いて正確な列名を確認することが重要です。
- 金額の正負の誤解: PayPalのCSVでは、支払い(支出)がマイナスで、受取(収入)がプラスで表示されるのが一般的ですが、フォーマットによっては異なる場合があります。また、返金(Refund)がマイナスで表示される場合、それを単純に収入として処理しないように注意が必要です。
- 手数料の扱い忘れ: PayPalの手数料は、事業経費として計上できる重要な項目です。これを無視すると、税務上有不利になる可能性があります。
- 資金移動の混同: PayPal口座から銀行口座への資金移動(Withdrawal)は、収入でも経費でもありません。これを収入として誤って計上しないように注意が必要です。
- テスト不足: クリーニングスクリプトを作成したら、必ず少量のデータや、エッジケース(特殊な取引)を含むデータでテストし、意図した通りに動作することを確認してから本番データに適用してください。
- 会計ソフトの要件確認不足: 会計ソフトが要求するCSVのフォーマット(列名、日付形式、金額の正負など)を事前に確認し、それに合わせた整形を行う必要があります。
よくある質問 (FAQ)
Q1: PayPalのCSVファイルには、どのくらいの期間のデータを含めるべきですか?
回答: 米国での税務申告のためには、通常、その課税年度(暦年または事業年度)全体の取引履歴が必要です。PayPalのレポート機能で、該当する期間を選択してダウンロードしてください。もしデータが大きすぎる場合は、月次などで分割して処理することも可能ですが、最終的には年間の通算が必要です。
Q2: PythonとPandasの学習は必須ですか?もっと簡単な方法はありませんか?
回答: PythonとPandasは最も柔軟で強力な方法ですが、必須ではありません。もしプログラミングが苦手な場合は、以下のような代替案が考えられます。
- 会計ソフトの直接連携機能: 一部の会計ソフトは、PayPalと直接連携し、取引データを自動でインポートする機能を持っています。まずはお使いの会計ソフトの機能を確認してみてください。
- サードパーティーツール: CSVデータを整形するための専用ツールやサービスが存在する場合があります。ただし、信頼性やコスト、プライバシーには注意が必要です。
- Excelのマクロ/Power Query: Excelの高度な機能(マクロやPower Query)を使えば、プログラミングなしでもある程度のデータ整形は可能です。しかし、複雑な処理や大量データにはPandasの方が適しています。
PythonとPandasを習得すれば、PayPalだけでなく、他の様々なソースからのデータ整形にも応用が利くため、長期的に見て非常に価値があります。
Q3: 返金(Refund)やチャージバック(Chargeback)はどのように処理すべきですか?
回答: 返金は、発生した売上から差し引くべきものです。会計上は、売上(Income)を減額するか、あるいは「売上取消」や「返金」といった専用の勘定科目で処理します。チャージバックも同様に、売上から差し引く処理が必要です。PayPalの取引履歴では、返金はマイナスの金額で記録されていることが多いですが、そのマイナスを単純に経費(Expense)として計上するのは間違いです。元の収入取引と紐付けて、収入の減少として処理する必要があります。Pythonスクリプトでは、説明欄に'Refund'や'Chargeback'といったキーワードが含まれる取引を検出し、それに応じて収入列の値を調整するロジックを追加します。
Q4: PayPalの手数料は、すべて経費として計上できますか?
回答: PayPalの手数料は、事業運営に直接関連する費用(例:クレジットカード手数料、決済手数料)として、一般的に経費(Cost of Goods Sold, Processing Fees, etc.)として認められる可能性が高いです。ただし、個々の取引内容や事業形態によって判断が異なる場合もあります。米国税法に精通した税理士に相談することをお勧めします。スクリプトでは、手数料列を抽出し、絶対値を取って経費として計上する処理が一般的です。
まとめ
PayPalの取引履歴CSVは、その利便性の反面、データ整形の手間が課題となることが少なくありません。しかし、PythonのPandasライブラリを活用することで、これらの課題を克服し、正確で効率的な会計処理を実現することが可能です。本記事では、CSVの読み込みから、日付、金額、説明などのデータクリーニング、そして会計ソフトへの取り込みに適した形式への変換まで、具体的なステップとコード例を解説しました。
米国での税務申告においては、正確な収入と経費の記録が極めて重要です。このスクリプトは、そのための強力なツールとなり得ます。初期の学習コストやスクリプト開発の手間はありますが、一度構築してしまえば、継続的な作業の効率化と正確性の向上に大きく貢献します。ご自身のPayPal取引履歴のフォーマットに合わせてコードを適宜修正し、試してみてください。正確な記録は、税務コンプライアンスを維持し、ビジネスの健全な成長を支えるための第一歩です。
#Python #Pandas #PayPal #Data Cleaning #Accounting #CSV #US Tax #Bookkeeping
