ICP-NFT 収支計算 備忘録

Google Colaboratory で実施した例です<br><br>
Google Colaboratory → <https://colab.research.google.com/?hl=ja#>

***

# ICP-NFT 収支計算 備忘録

ICタートル、クラファン、などは、mint時の状態がcsvファイルに載っていなかった。

他にも情報ないものもあるかもなので、参考までに。

***

## NFTgeekからcsvファイルを取得する

準備として以下から取得<br>[NFTgeek サイト](https://t5t44-naaaa-aaaah-qcutq-cai.raw.ic0.app/)

![](https://pbs.twimg.com/media/FovctG3aIAItjat?format=jpg\&name=small)

取得したら、[Google Drive](https://drive.google.com/drive/my-drive) へ格納

今回、私は以下のように複数アドレス分を格納しています。

*   infinity1.csv
*   infinity2.csv
*   infinity3.csv
*   plug1.csv
*   plug2.csv
*   plug3.csv
*   plug4.csv
*   stoic1.csv

***

## [Google Colaboratory](https://colab.research.google.com/?hl=ja#) で作業開始

***

## Google 認証ライブラリをインストール

<pre><code>!pip install google-auth google-auth-oauthlib google-auth-httplib2
!pip install gspread</code></pre>

***

## 複数の CSV ファイルをマージ

Google Drive に格納したファイル名を書く。マージ(結合)

<pre><code>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())</code></pre>

例、こんな表示

![](https://pbs.twimg.com/media/Fove-OtacAIgTGb?format=png\&name=small)

***

## 日付 : ミリ秒単位から日時型に変換

<pre><code>import pandas as pd

df['timeMillis'] = pd.to_datetime(df['timeMillis'], unit='ms')

print(df.head())</code></pre>

ここ直した

![](https://pbs.twimg.com/media/FovfZ9LaMAAC3bF?format=png\&name=240x240)

***

## 使わない行を削除

<pre><code>df = df.drop(columns=['collection.canisterId', 'collection.alias', 'buyerUniqueIdentifier.uniqueIdentifierType', 'sellerUniqueIdentifier.uniqueIdentifierType','sellerUniqueIdentifier.id','buyerUniqueIdentifier.id'])
print(df.head())</code></pre>

先頭5行のデータ、こんな感じ

![](https://pbs.twimg.com/media/FovgdpoaEAESJrD?format=png\&name=small)

***

## mint1つあたりに価格を修正しておく

<pre><code># 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)</code></pre>

こういうことをしてる

![](https://pbs.twimg.com/media/Fovh6XbaQAA9tii?format=jpg\&name=large)

***

## 並び替え

<pre><code>df_splitted.sort_values(by=['collection.name', 'tokenIds', 'timeMillis'], ascending=[True, True, True], inplace=True)

df_splitted</code></pre>

***

## ここで保存したい人用

グーグルドライブへ保存

<pre><code>df_splitted.to_csv('splitted.csv', index=False)
df_splitted.to_csv('/content/drive/My Drive/splitted.csv', index=False)</code></pre>

こんなデータ

![](https://pbs.twimg.com/media/Fovj-ZnaYAEwTyf?format=png\&name=small)

***

# 収支計算

ここから先は参考までに。

以下コードは、こういう条件で実行

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' 列に空文字列 "" を代入します。

<pre><code>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'], ''))</code></pre>

## データ保存

グーグルドライブへ

<pre><code>df_splitted.to_csv('Balanceofpayments.csv', index=False)
df_splitted.to_csv('/content/drive/My Drive/Balanceofpayments.csv', index=False)</code></pre>

こんな感じ

![](https://pbs.twimg.com/media/FovnMnXakAAJ6Hd?format=png\&name=small)

## グラフ

年ごとの収支確認

ミント時の情報が抜けているNFTもあるので、過剰にプラスになる

<pre><code>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()</code></pre>

例

![](https://pbs.twimg.com/media/FovmVpaakAAivzF?format=png\&name=small)

***

参考までに。