2017-03-07 20 views
0

私はmosquittoを使用してデータを受け取り、python pandasを使用してcsvファイルとして保存しようとしています。スクリプトを停止するまで、データは続きます。 mqtt_sub.pyスクリプト上からpandas.core.common.PandasError:DataFrameコンストラクタが正しく呼び出されていません

mqtt_pub.py

import paho.mqtt.client as mqtt 
import random 
import schedule 
import time 

mqttc = mqtt.Client("python_pub") 
mqttc.connect("localhost", 1883) 

def job(): 
    mqttc.publish("hello/world", random.randint(1, 10)) 

schedule.every(1).seconds.do(job) 

while True: 
    schedule.run_pending() 
    time.sleep(1) 

mqttc.loop(2) 

mqtt_sub.py

import paho.mqtt.client as mqtt 
import pandas as pd 

def on_connect(client, userdata, rc): 
    print("Connected with result code "+str(rc)) 
    client.subscribe("hello/world") 

def on_message(client, userdata, msg): 
    datas = map(int, msg.payload) 
    for num in datas: 
     df = pd.DataFrame(data=datas, columns=['the_number']) 
     df.to_csv("testing.csv") 

client = mqtt.Client() 
client.on_connect = on_connect 
client.on_message = on_message 

client.connect("localhost", 1883, 60) 

client.loop_forever() 

、私はこの

| the _number 
0 | 2 

2のように見えるtesting.csv取得するには、私がbefo受け取る最後の数字であります私はmqtt_sub.pyスクリプト

Connected with result code 0 
[3] 
[9] 
[5] 
[3] 
[7] 
[2] 
... 
... 
KeyboardInterrupt 

を停止し再私はdf = pd.DataFrame(data=num, columns=['the_number'])に次のdf = pd.DataFrame(data=datas, columns=['the_number'])を変更しようとすると、次のエラーが

pandas.core.common.PandasError: DataFrame constructor not properly called! 
を発生したことを達成するために testing.csv

このような
| the_number 
0 | 3 
1 | 9 
2 | 5 
... 
... 
5 | 2 

を得るために期待していました

エラーを解決する方法はありますか?私はまた、ここでforループを適切に使用しなかったと感じます。

ご協力いただきありがとうございます。

[UPDATE]

私はNulljackからの助けを借りてon_message方法

def on_message(client, userdata, msg): 
    datas = map(int, msg.payload) 
    df = pd.DataFrame(data=datas, columns=['the_number']) 

    f = open("test.csv", 'a') 
    df.to_csv(f) 
    f.close() 

に次の行を変更/追加し、私は

| the_number 
0 | 3 
    | the_number 
0 | 9 
    | the_number 
0 | 5 
    | the_number 
0 | 3 
    | the_number 
0 | 7 
ファイル私のCSVでこのような結果を得ることができています

私の目標は、CSVファイルでこれを実現することです。

| the_number 
0 | 3 
1 | 9 
2 | 5 
3 | 3 
4 | 7 

答えて

0

私は私の理解が間違っている場合私は謝罪する前にモスキートを使用したことがない。それはあなたのmqtt_sub.pyでON_MESSAGE方法のように私には思える

は毎回上書きされるこれはあなたのtesting.csvファイルを引き起こすあなたのmqtt_pub.pyがメッセージ(すなわち1秒毎)を公開するたびに実行されます私は、私はあなたのon_connect方法でデータフレームを初期化し、あなたが終了した後、その後ON_MESSAGEでcsvファイルに書き込むためのようdf.append

を経由してデータフレームに新しい値を追加します。この問題を解決するためのメッセージ

を公開不明

希望これは、他のスレッドが混雑していた

+0

私はへの接続方法の使用がon_connect'ある '、と信​​じて怒鳴るのコードを使用してみてくださいモスキットブローカー。 'on_message'は、mosquittoブローカ経由で受信したメッセージを表示するためのメソッドの使い方です。 – Fang

+0

ええ、 'on_message'メソッドは、あなたがメッセージを受け取るたびに呼び出さなければならないので、' df.to_csv( "testing.csv") 'を複数回呼び出すことになります。ファイルを上書きするのではなく、パンダを使用してCSVファイルに物を追加する方法について詳しくは、 – Nulljack

+0

http://stackoverflow.com/questions/17134942/pandas-dataframe-output-end-of-csv @Fang – Nulljack

0

はので、私はここに私の応答を移動できます

import paho.mqtt.client as mqtt 
import pandas as pd 

# Move df here 
df = pd.DataFrame(columns=['the_number']) 

def on_connect(client, userdata, rc): 
    print("Connected with result code "+str(rc)) 
    client.subscribe("hello/world") 

def on_message(client, userdata, msg): 
    datas = map(int, msg.payload) 

    # this adds the data to the dataframe at the correct index 
    df.iloc[df.size] = datas 

    # I reverted this line back to what you originally had 
    # This will overwrite the testing.csv file every time your subscriber 
    # receives a message, but since the dataframe is formatted like you want 
    # it shouldn't matter 
    df.to_csv("testing.csv") 


client = mqtt.Client() 
client.on_connect = on_connect 
client.on_message = on_message 

client.connect("localhost", 1883, 60) 

client.loop_forever() 
+0

スクリプトはエラー 'IndexError:単一の位置インデクサーが範囲外です'を返します – Fang

関連する問題