ICP-NFT 収支計算 備忘録
SHOGAKU
a year ago
Google Colaboratory で実施した例です
Google Colaboratory → https://colab.research.google.com/?hl=ja#
ICP-NFT 収支計算 備忘録
ICタートル、クラファン、などは、mint時の状態がcsvファイルに載っていなかった。
他にも情報ないものもあるかもなので、参考までに。
NFTgeekからcsvファイルを取得する
準備として以下から取得
NFTgeek サイト
取得したら、Google Drive へ格納
今回、私は以下のように複数アドレス分を格納しています。
- infinity1.csv
- infinity2.csv
- infinity3.csv
- plug1.csv
- plug2.csv
- plug3.csv
- plug4.csv
- stoic1.csv
Google Colaboratory で作業開始
Google 認証ライブラリをインストール
!pip install google-auth google-auth-oauthlib google-auth-httplib2
!pip install gspread
複数の CSV ファイルをマージ
Google Drive に格納したファイル名を書く。マージ(結合)
import pandas as pd
files = ['infinity1.csv', 'infinity2.csv', 'infinity3.csv', 'plug1.csv', 'plug2.csv', 'plug3.csv', 'plug4.csv', 'stoic1.csv']
# Google Drive アクセス
from google.colab import drive
drive.mount('/content/drive')
df_list = [pd.read_csv('/content/drive/My Drive/' + file) for file in files]
df_merged = pd.concat(df_list, axis=0)
df=df_merged
print(df.head())
例、こんな表示
日付 : ミリ秒単位から日時型に変換
import pandas as pd
df['timeMillis'] = pd.to_datetime(df['timeMillis'], unit='ms')
df['timeMillis'] = df['timeMillis'].dt.strftime('%Y-%m-%d %H:%M')
print(df.head())
ここ直した
使わない行を削除
df = df.drop(columns=['collection.canisterId', 'collection.alias', 'buyerUniqueIdentifier.uniqueIdentifierType', 'sellerUniqueIdentifier.uniqueIdentifierType','sellerUniqueIdentifier.id','buyerUniqueIdentifier.id'])
print(df.head())
先頭5行のデータ、こんな感じ
mint1つあたりに価格を修正しておく
# mint1つあたりに価格を修正しておく
df['price'] = df['price'] / df['numberOfTokens']
df['priceUsd'] = df['priceUsd'] / df['numberOfTokens']
# tokenIdsを分割する
df['tokenIds'] = df['tokenIds'].astype(str)
df_list = []
for i, row in df.iterrows():
token_ids = row['tokenIds'].split(';')
number_of_tokens = row['numberOfTokens']
for j, token_id in enumerate(token_ids):
new_row = row.copy()
new_row['tokenIds'] = token_id
new_row['numberOfTokens'] = 1
df_list.append(new_row)
df_splitted = pd.DataFrame(df_list)
print(df_splitted)
こういうことをしてる
並び替え
df_splitted.sort_values(by=['collection.name', 'tokenIds', 'timeMillis'], ascending=[True, True, True], inplace=True)
df_splitted
ここで保存したい人用
グーグルドライブへ保存
df_splitted.to_csv('splitted.csv', index=False)
df_splitted.to_csv('/content/drive/My Drive/splitted.csv', index=False)
こんなデータ
収支計算
ここから先は参考までに。
以下コードは、こういう条件で実行
Balance of payments 列に収支の結果を載せる
- 'collection.name' 列が直前の行の 'collection.name' 列と等しいかつ
- 'transactionType' 列が "sell" であり、
- 'numberOfTokens' 列が直前の行の 'numberOfTokens' 列と等しいかつ
- 直前の行の 'transactionType' 列が "mint" または "buy" である場合 その場合、'Balance of payments' 列に 'priceUsd' 列から直前の行の 'priceUsd' 列を引いた値を代入します。
そうでない場合、もし 'transactionType' 列が "sell" である場合、'Balance of payments' 列に 'priceUsd' 列を代入します。そうでない場合、'Balance of payments' 列に空文字列 "" を代入します。
import numpy as np
df_splitted['Balance of payments'] = np.where((df_splitted['collection.name'] == df_splitted['collection.name'].shift()) &
(df_splitted['transactionType'] == 'sell') &
(df_splitted['numberOfTokens'] == df_splitted['numberOfTokens'].shift()) &
((df_splitted['transactionType'].shift() == 'mint') | (df_splitted['transactionType'].shift() == 'buy')),
df_splitted['priceUsd'] - df_splitted['priceUsd'].shift(),
np.where(df_splitted['transactionType'] == 'sell', df_splitted['priceUsd'], ''))
データ保存
グーグルドライブへ
df_splitted.to_csv('Balanceofpayments.csv', index=False)
df_splitted.to_csv('/content/drive/My Drive/Balanceofpayments.csv', index=False)
こんな感じ
グラフ
年ごとの収支確認
ミント時の情報が抜けているNFTもあるので、過剰にプラスになる
import pandas as pd
import matplotlib.pyplot as plt
# データフレームの読み込み
df_splitted = pd.read_csv("Balanceofpayments.csv")
# timeMillisをdatetime形式に変換
df_splitted['timeMillis'] = pd.to_datetime(df_splitted['timeMillis'])
# 指定された年の合計値を求める
df_splitted['year'] = df_splitted['timeMillis'].dt.year
df_grouped = df_splitted.groupby('year')['Balance of payments'].sum()
# 棒グラフを作成
df_grouped.plot.bar(x='year', y='Balance of payments')
# 罫線を入れる
plt.grid(axis='y')
# グラフのタイトルや軸ラベルを設定する
plt.xlabel('Year')
plt.ylabel('Balance of payments')
plt.title('Balance of payments per year')
plt.show()
例
参考までに
コメント
いいね
投げ銭
最新順
人気順
コメント
いいね
投げ銭
最新順
人気順