ICP NFTフロア価格(その日の最低取引価格とする)のデータを引っ張りたいとき

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

------------

# ICP NFTフロア価格(その日の最低取引価格とする)のデータを引っ張りたいとき

以下に流れを記載

***

# NFTトランザクションデータを収集するスクリプト

!rm -r nfts_data は、繰り返し使ったときにエラー出た対処の名残りで残しています

<pre><code>!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': 'Motoko',
        'id': 'oeee4-qaaaa-aaaak-qaaeq-cai'
    },
    {
        'name': 'BTC Flowers',
        'id': 'pk6rk-6aaaa-aaaae-qaazq-cai'
    },
    {
        'name': 'Poked bots',
        'id': 'bzsui-sqaaa-aaaah-qce2a-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>

*   このコードは、Interledger 関連の技術を使用して、NFTトランザクションデータを収集するスクリプト<br><https://github.com/lukasvozda/nfts_data.git> を見ながら実施

以下のような部分はお好みのNFTに置き換えください<br>nameは適当で良いはず

> 例<br>
> name: 'Motoko'<br>
> id: 'oeee4-qaaaa-aaaak-qaaeq-cai'

***

# 取得したデータ確認

<pre><code>import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv("result.txt", header=0)

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

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

***

# グラフ化

<pre><code>sns.scatterplot(x='timestamp', y='icp', data=df)
plt.show()</code></pre>

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

***

# 日時を修正、レジェンド追加

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

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

***

# フロア価格

その日の最低取引価格、ない場合は前日を引き継ぐ

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

# プロットする
ax = sns.scatterplot(x=df_min.index.get_level_values(0), y=df_min, hue=df_min.index.get_level_values(1))
ax.legend(loc='center right', bbox_to_anchor=(1.35, 0.9))
plt.show()
</code></pre>

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

***

# csvファイルに保存する

<pre><code>import pandas as pd

#DataFrameを作成
df_temp = pd.DataFrame({
'date': df_min.index.get_level_values(0),
'ICP': df_min,
'collection': df_min.index.get_level_values(1)
})

#CSV形式で保存する
df_temp.to_csv("min_icp.csv", index=False)</code></pre>

***

# Google Driveに保存する

<pre><code>from google.colab import drive
drive.mount('/content/gdrive')

df_temp.to_csv('/content/gdrive/My Drive/min_icp.csv', index=False)
</code></pre>

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

***

というような感じとりあえずデータを出せた。