📚

pandas で仮想通貨トランザクションの日毎の集計するメモ

2023/05/19に公開

とりあえず仮想通貨のトランザクションが csv なり xlsx なりである...
日毎とか月毎で集計したい...

panads の resample を使ってみます.

情報

https://obenkyolab.com/?p=4743

https://note.nkmk.me/python-pandas-time-series-resample-asfreq/

ありがとうございます.

方法

とりあえず元データ csv は

date, tx, amount
2022-01-01, 0x00000000, 0.1
...

のような形にします.

pandas で resample 使うには,

  • 'date' の値(文字列)を datetime 型にする(to_datetime)
  • Index を 'date' column にする(set_index)

が必要です.

read_csv() に各種指定してもいいのですが, めんどいので読んでから処理します.

import pandas as pd

df = pd.read_csv("input.csv")
df['date'] = pd.to_datetime(df['date'])

# 必要に応じてソート
df.sort_values(by='date')

df.set_index('date', inplace=True)
# inplace だと 'date' column が消えてしまう(`date` column は Index column へ移行)ので, 元データを
# 残したい場合は new_df = df.set_index('date') として新規 df を作るとよいでしょう.

print(df.index) # DatetimeIndex になっているのを確認

# `M` : 月ごとの和
dm = df.resample('M').sum()

print(dm['amount'])

'date' の文字列を datetime 型に変換はたぶん概ねどのような形式でもよろしく処理してくれると思いますが, day, month の区別が付かないような入力があった場合は, format 指定してあげましょう.

https://deepage.net/features/pandas-to-datetime.html

その他

特定のトランザクションの行(row)だけ抜き出して処理したい(address などで)場合は drop を使うとよいでしょうか.

df = df.drop(df[df.address != 'myaddr'].index)

df[<COND>].index で COND に一致した row を削除できます.

精度?

トランザクションが多量にあり, 金額の総和を取りたい場合, Pandas がきちんと Decimal など精度保つ処理しているかどうか確認する必要があるでしょう.

指定かなった場合, 演算誤差が出る可能性があるので, 自前で Decimal で処理するしかないかも...

Discussion