ICP-NFT取引データの分析と可視化(Entrepot): 最終日の最小価格取引データの抽出と表示

これから記載の内容は、以下です。

1.  NFT取引データをリポジトリから取得し、必要なライブラリをインストールする。
2.  取得したデータをPandasデータフレームに読み込む。
3.  Seabornを使用して、取引データを散布図で可視化する。
4.  最終日の最小価格取引データを抽出し、整形して表示する。
5.  最終日の最小価格取引データを11行ごとに分割し、整形して表示する。

全体の流れとして、まずNFT取引データを取得し、データを分析して可視化します。その後、最終日の最小価格取引データを抽出し、整形して表示します。最後に、データを11行ごとに分割し、整形して表示します。

***

# データ取得

このコードは、複数のNFT（非代替可能トークン）コレクションから取引データを取得して、結果をテキストファイルに保存するPythonスクリプトです。

このスクリプトを実行すると、各NFTコレクションから取引データが取得され、result.txtという名前のテキストファイルに保存されます。このデータには、コレクション名、インデックス、トークンID、取引価格、タイムスタンプ、売り手、買い手などの情報が含まれています。

<pre><code class>!rm -r nfts_data
!git clone https://github.com/lukasvozda/nfts_data.git
!pip install -r nfts_data/requirements.txt

from ic.agent import *
from ic.identity import *
from ic.client import *
from ic.candid import Types, encode, decode

# Inicialisation
client = Client(url = "https://ic0.app")
iden = Identity()
agent= Agent(iden, client)

# Endpoint that we want to pull data from
function_to_call = 'transactions'

# List of NFTs canisters we want to pull data from
# You can find it on Entrepot clicking on NFTs 
canisters = [
    {
        'name': 'Poked bots',
        'id': 'bzsui-sqaaa-aaaah-qce2a-cai'
    },
    {
        'name': 'OG MEDALS',
        'id': 'rw623-hyaaa-aaaah-qctcq-cai'
    },
    {
        'name': 'ICPuppies',
        'id': '5movr-diaaa-aaaak-aaftq-cai'
    },
    {
        'name': 'Dfinity Space Apes',
        'id': '3mttv-dqaaa-aaaah-qcn6q-cai'
    },
    {
        'name': 'IC Dinos',
        'id': 'yrdz3-2yaaa-aaaah-qcvpa-cai'
    },
    {
        'name': 'ICPCS',
        'id': 'j3dqa-byaaa-aaaah-qcwfa-cai'
    },
    {
        'name': 'D-City',
        'id': 'gtb2b-tiaaa-aaaah-qcxca-cai'
    },
    {
        'name': 'Meme Cake',
        'id': 'txr2a-fqaaa-aaaah-qcmkq-cai'
    },
    {
        'name': 'Pineapple Punks',
        'id': 'skjpp-haaaa-aaaae-qac7q-cai'
    },
    {
        'name': 'BTC Flower',
        'id': 'pk6rk-6aaaa-aaaae-qaazq-cai'
    },
    {
        'name': 'ETH Flower',
        'id': 'dhiaa-ryaaa-aaaae-qabva-cai'
    },
    {
        'name': 'ICP Flower',
        'id': '4ggk4-mqaaa-aaaae-qad6q-cai'
    },
    {
        'name': 'Motoko',
        'id': 'oeee4-qaaaa-aaaak-qaaeq-cai'
    },
    {
        'name': 'Motoko Mechs',
        'id': 'ugdkf-taaaa-aaaak-acoia-cai'
    },
    {
        'name': 'Cubetopia Islands',
        'id': '3vdxu-laaaa-aaaah-abqxa-cai'
    },

    {
        'name': 'ICKitties',
        'id': 'rw7qm-eiaaa-aaaak-aaiqq-cai'
    },
    {
        'name': 'Cubetopia Islands',
        'id': '3vdxu-laaaa-aaaah-abqxa-cai'
    },
    {
        'name': 'Poked Bots Mutant Army',
        'id': 'jv55j-riaaa-aaaal-abvnq-cai'
    },
    {
        'name': 'ICPunks',
        'id': 'bxdf4-baaaa-aaaah-qaruq-cai'
    },
    
    {
        'name': 'Pet bots',
        'id': 't2mog-myaaa-aaaal-aas7q-cai'
    },
    {
        'name': 'IC BUCKS',
        'id': '6wih6-siaaa-aaaah-qczva-cai'
    },
    {
        'name': 'MoonWalkers',
        'id': 'er7d4-6iaaa-aaaaj-qac2q-cai'
    },
    
    {
        'name': 'Finterest',
        'id': '4fcza-biaaa-aaaah-abi4q-cai'
    },  
    {
        'name': 'ICmojis',
        'id': 'gevsk-tqaaa-aaaah-qaoca-cai'
    },  

    {
        'name': 'ICTuTs',
        'id': 'ahl3d-xqaaa-aaaaj-qacca-cai'
    },
    {
        'name': 'Starverse',
        'id': 'nbg4r-saaaa-aaaah-qap7a-cai'
    },

    {
        'name': 'ICP.DOG',
        'id': '3bqt5-gyaaa-aaaah-qcvha-cai'
    },
    {
        'name': 'ICApes',
        'id': 'zvycl-fyaaa-aaaah-qckmq-cai'
    },
    {
        'name': 'Boxy Dude',
        'id': 's36wu-5qaaa-aaaah-qcyzq-cai'
    },
    {
        'name': 'ICPets',
        'id': 'unssi-hiaaa-aaaah-qcmya-cai'
    },
    {
        'name': 'Pet bots',
        'id': 't2mog-myaaa-aaaal-aas7q-cai'
    },
    {
        'name': 'CrowdFund NFT',
        'id': '2glp2-eqaaa-aaaak-aajoa-cai'
    },
    {
        'name': 'Astronauts',
        'id': 'sr4qi-vaaaa-aaaah-qcaaq-cai'
    },   


]

# File to write results to
f  = open('result.txt','w')
# Header row
f.write(f"collection,index,token,icp,time_updated,timestamp,seller,buyer")

for c in canisters:
    params = []

    params = encode(params)

    response = agent.query_raw(c["id"], function_to_call, params)

    print("Getting collection:", c["name"])

    trans = response[0]["value"]
    for i,t in enumerate(trans):
        price = str(t['_3364572809']/100000000)
        timestamp = t['_1291635725']
        token = t['_338395897']
        seller = t['_1782082687']
        buyer = t['_3136747827']
        f.write(f"\n{c['name']},{i},{token},{price},,{timestamp},{seller},{buyer}")

f.close()

</code></pre>

***

# NFT取引データ、時系列で価格をプロット

このコードは、先程取得したNFT取引データを使って、時系列で価格をプロットするPythonスクリプトです。

このスクリプトを実行すると、result.txtに保存されたNFT取引データを使用して、時系列で価格をプロットし、カテゴリ別に色分けした散布図が表示されます。プロットの外に凡例が表示され、x軸はタイムスタンプ、y軸は価格（ICP）となっています。

<pre><code class>import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns


df = pd.read_csv("result.txt", header=0)
df['timestamp'] = pd.to_datetime(df['timestamp'])

sns.scatterplot(x='timestamp', y='icp', hue='collection', legend=True, data=df)
plt.grid(linestyle='dotted')

#レジェンド
#plt.legend(loc='upper left')

#X軸のラベルを変更
import matplotlib.dates as mdates

plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%y/%m'))
plt.gca().xaxis.set_major_locator(mdates.MonthLocator())
plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=3))
plt.gcf().autofmt_xdate()

#Y軸 Max1000
import matplotlib.pyplot as plt

# Place legend outside of the plot
plt.legend(loc='center left', bbox_to_anchor=(1.0, 0.5))

#plt.ylim(0, 1000)

plt.show()
df = df.sort_values(by='timestamp')

</code></pre>

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

***

# NFT取引データを日付ごとにまとめて最低価格をプロット

このコードは、先程の時系列プロットに変更を加え、NFT取引データを日付ごとにまとめて最低価格をプロットするPythonスクリプトです。

このスクリプトを実行すると、日付ごとにまとめたNFT取引データを使用して、時系列で最低価格をプロットし、カテゴリ別に色分けした散布図が表示されます。プロットの外に凡例が表示され、x軸は日付、y軸は最低価格（ICP）となっています。

<pre><code class>import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df['day'] = df['timestamp'].dt.date
df_min = df.groupby(['day', 'collection'])['icp'].min()

# ffillメソッドを使用して、前日のデータで空欄を埋める
df_min = df_min.ffill()

# プロットする
sns.scatterplot(x=df_min.index.get_level_values(0), y=df_min, hue=df_min.index.get_level_values(1), legend=True)

plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%y/%m'))
plt.gca().xaxis.set_major_locator(mdates.MonthLocator())
plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=3))
plt.gcf().autofmt_xdate()

# Place legend outside of the plot
plt.legend(loc='center left', bbox_to_anchor=(1.0, 0.5))

plt.grid(linestyle='dotted')

plt.show()

</code></pre>

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

***

# 最終日の最小価格取引データを表示

このコードには、最終日の最小価格取引データを表示するための処理が含まれています。具体的には、必要なカラムを抽出し、インデックスをリセットし、データフレームのカラム名にラベルを追加して表示しています。

このコードを実行すると、最終日の最小価格取引データが表示されます。データフレームには、「day」、「collection」、「icp」のカラムが含まれており、各行は最終日の各コレクションの最小価格取引データを示しています。カラム名にはラベル「最終日の最小価格取引(ICP)」が追加されています。

<pre><code class># 各コレクションの最終日を取得
last_days = df_min.reset_index().groupby('collection')['day'].max()

# 最終日のデータを抽出
last_day_data = df_min.reset_index()[df_min.reset_index().apply(lambda x: x['day'] == last_days[x['collection']], axis=1)]

# 結果を表示
print(last_day_data)

</code></pre>

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

***

# 必要なカラムだけを抽出

<pre><code class># 必要なカラムだけを抽出し、インデックスをリセットして表示
last_day_data = last_day_data[['day', 'collection', 'icp']].reset_index(drop=True)
last_day_data.columns.name = '最終日の最小価格取引(ICP)'
print(last_day_data)

</code></pre>

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

***

# tabulate ライブラリを使って、最終日の最小価格取引データを整形して表示

このコードは、tabulate ライブラリを使って、最終日の最小価格取引データを整形して表示するためのスクリプトです。

このコードを実行すると、最終日の最小価格取引データが整形された表として表示されます。各行は最終日の各コレクションの最小価格取引データを示し、カラム名がヘッダーとして表示されます。表の書式は、グリッド線で区切られたものになっています。

<pre><code class>!pip install tabulate
from tabulate import tabulate

# 必要なカラムだけを抽出し、インデックスをリセット
last_day_data = last_day_data[['day', 'collection', 'icp']].reset_index(drop=True)

# tabulateを使って表を表示
print("最終日の最小価格取引(ICP)")
print(tabulate(last_day_data, headers='keys', tablefmt='grid'))
</code></pre>

縦に長いので、次で分割表示

***

# tabulate ライブラリを使って、最終日の最小価格取引データを整形して表示 (分割)

このコードは、最終日の最小価格取引データを11行ごとに分割し、それぞれの部分を整形して表示するためのスクリプトです。

このコードを実行すると、最終日の最小価格取引データが11行ごとに分割され、それぞれの部分が整形された表として表示されます。各表には、部分の番号が表示され、カラム名がヘッダーとして表示されます。表の書式は、グリッド線で区切られたものになっています。部分ごとに改行が挿入されています。

<pre><code class>from tabulate import tabulate

# 表を11行ごとに分割
n = 11
table_parts = [last_day_data.iloc[i:i+n] for i in range(0, len(last_day_data), n)]

# 各部分を表示
for i, part in enumerate(table_parts):
    print(f"Entrepot 取引があった最終日の最小価格取引(ICP) - Part {i+1}")
    print(tabulate(part, headers='keys', tablefmt='grid'))
    print("\n")

</code></pre>

![](https://pbs.twimg.com/media/FvrjYsaaQAUax2S?format=png\&name=small)
![](https://pbs.twimg.com/media/Fvrjg-AaAAAAZtx?format=png\&name=small)
![](https://pbs.twimg.com/media/FvrjmnHacAEYvzJ?format=png\&name=small)

***

久しぶりに見たが、

フロアが下がっている