1. ホーム
  2. python

[解決済み】plotly: TypeError: 辞書の更新シーケンス要素#0をシーケンスに変換できない

2022-02-13 02:48:09

質問

現在進めているプロジェクトで問題が発生したので、質問を残します。
現在のコンテンツはsensorで表形式で描画しています。しかし、数日前、ある作業をしているときに、直し方がわからなくなり、相談させていただきました。

import plotly.plotly as py
import plotly.figure_factory as ff
from bluepy import sensortag
import sys
import time
import datetime
import numpy as np

py.sign_in("smrlswja9963","94b4enXKYqyOu4iuPDGG")

time.sleep(1.0)

tag = sensortag.SensorTag('24:71:89:CC:53:00')
tag.IRtemperature.enable()
tag.humidity.enable()

stream1=py.Stream('liz9v2c0or')
stream1.open()

i=0     
while True:
    now = datetime.datetime.now()
    dateTime = now.strftime("%Y-%m-%d %H:%M:%S")

    A = tag.IRtemperature.read()
    B = tag.humidity.read()
    tempt=A[0]
    humty=B[0]

    stream1.write({dateTime,tempt,humty})

    i+=1

    tag.waitForNotifications(3.0)     

table = go.Table(
    header=dict(values=["dateTime","tempt","humty"]),
    cells=dict(values=[[dateTime],[tempt],[humty]]),
    stream = dict(token='liz9v2c0or',))

data=[table]
py.iplot(table, filename="latex table")

以下のコードを実行したところ、以下のエラーが発生しました。

Traceback (most recent call last):
  File "/home/pi/do it.py", line 27, in <module>
    stream1.write({dateTime,tempt,humty})
  File "/usr/local/lib/python2.7/dist-packages/plotly/plotly/plotly.py", line 632, in write
    stream_object.update(trace)
TypeError: cannot convert dictionary update sequence element #0 to a sequence

この場合、ploltyを使ってグラフを描画するコードは、ストリームからデータを受け取るときは問題ないのですが、テーブルプロットを描画するときは問題が発生します。

ここでグラフ化するにはどうしたらいいのでしょうか? とても気になります。教えてください。

どのように解決するのですか?

この例外は、イテラブルからディクトを作成しようとしていて、そのイテラブルの最初の要素がシーケンスでないことを意味します。この例外は ドキュメント の説明では、2つの方法でディクトを構築することができます。

  • マッピングから、または
  • キーと値のペアの反復処理可能なものから

では、例えば数字の集合から構成しようとすると。

>>> dict({1, 2, 3})
TypeError: cannot convert dictionary update sequence element #0 to a sequence

... これは、最初の要素をキーと値のペア、つまり2つの値のシーケンスとして使おうとしているのですが、この数字を解釈する方法がないのです。 1 をキー・バリュー・ペアとして使用するために TypeError .


一方、Plotlyのストリーミングについては全く知らないのですが、何が載っているかというと このページ しかし、このコードは明らかに間違っています。

stream1.write({dateTime,tempt,humty})

セットをストリーミングする理由がわからない。

さらに、この例ではすべてdictか、dictをJSONエンコードした文字列を使用しています。

つまり、このAPIはあなたがdictかdictコンストラクタに渡すものを期待しているのです。しかし、あなたはセットを渡しています。それで、そのセットを dict コンストラクタに渡すと、この例外が発生します。

ここで実際に何をしようとしているのか、私にはわからないので ディクショナリーを送信する必要があります。しかし、間違いなく dict を渡すべきです。


また、これを修正しても sign_in の呼び出しは、Plotly Cloudを使用しているようですね。しかし、同ページにあるように

Plotly Cloudでは、ストリーミングはサポートされなくなりました。

つまり、Plotly Cloudでストリーミングを使おうとしている場合、コードを修正してうまくいったとしても、おそらく失敗することになります。 TypeError のように、無意味なものを渡すということです。