HiÐΞClassic

ICP-NFT 収支計算 備忘録

SHOGAKU
a year ago
ICP-NFT 収支計算 備忘録NFTgeekからcsvファイルを取得するGoogle Colaboratory で作業開始Google 認証ライブラリをインストール複数の CSV ファイルをマージ日付 : ミリ秒単位から日時型に変換使わない行を削除mint1つあたりに価格を修正しておく並び替えここで保存したい人用収支計算データ保存グラフ

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 列に収支の結果を載せる

  1. 'collection.name' 列が直前の行の 'collection.name' 列と等しいかつ
  2. 'transactionType' 列が "sell" であり、
  3. 'numberOfTokens' 列が直前の行の 'numberOfTokens' 列と等しいかつ
  4. 直前の行の '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()

参考までに


コメント
いいね
投げ銭
最新順
人気順
SHOGAKU
a year ago
コメント
いいね
投げ銭
最新順
人気順
トピック
アプリ

Astar Network

DFINITY / ICP

NFT

DAO

DeFi

L2

メタバース

BCG

仮想通貨 / クリプト

ブロックチェーン別

プロジェクト

目次
Tweet
ログイン