1

回帰の結果をMySQLに書き戻そうとしていますが、近似値を反復処理し、NaNをnull値として書き込むのに問題があります。もともと、私はこのように反復を行いました。

for i in dataframe:
    cur = cnx.cursor()
    query = ("UPDATE Regression_Data.Input SET FITTEDVALUES="+(dataframe['yhat'].__str__())+" where timecount="+(datafrane['timecount'].__str__())+";")
    cur.execute(query)
    cnx.commit()
    cur.close()

.....次のように言って、どのSQLが私に返されますか。

 "mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NaN'

だから、私はyhatがNaNと等しくないときにPythonにコミットするように要求するだけでNaNを除外しようとしてきました:

for i in dataframe:
    if cleandf['yhat']>(-1000):
        cur = cnx.cursor()
        query = ("UPDATE Regression_Data.Input SET FITTEDVALUES="+(dataframe['yhat'].__str__())+" where timecount="+(datafrane['timecount'].__str__())+";")
        cur.execute(query)
        cnx.commit()
       cur.close()

しかし、私はこれを取得します:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

だから、私は上記の構文でこれを回避しようとします:

if cleandf['yhat'][i]>(-1000):

しかし、これを取得します:

ValueError: Can only tuple-index with a MultiIndex

次に、次のように両方にitterows()を追加してみました。

 for i in dataframe.iterrows():
        if cleandf['yhat'][i]>(-1000):

しかし、上記と同じ問題が発生します。

ここで何が間違っているのかはわかりませんが、PandasDataFramesでの反復によるものだと思います。しかし、反復が正しく行われたとしても、NaNが出現したSQLにNullを書き込みたいと思います。

それで、どうやって私がこれをすべきだと思いますか?

4

1 に答える 1

3

完全な答えはありませんが、役立つかもしれないヒントがいくつかあるかもしれません。dataframeあなたは自分をSQLレコードセットに似たオブジェクトとして 考えていると思います。

for i in dataframe

これにより、データフレーム内の列名の文字列が繰り返されます。 i行ではなく列名を使用します。

dataframe['yhat']

これにより、単一の値ではなく、列全体(pandas.Series、は)が返されます。numpy.ndarrayしたがって:

dataframe['yhat'].__str__()

人間が読むのに役立つ列全体の文字列表現を提供します。クエリ用に文字列に変換できるのは確かに単一の値ではありません。

if cleandf['yhat']>(-1000)

これもエラーになります。これcleandf['yhat']も、単一の値だけでなく、値の配列全体であるためです。単一の行の値ではなく、列全体と考えてください。

if cleandf['yhat'][i]>(-1000):

これは近づいていますがi、ここでは別の列名ではなく整数になりたいと考えています。

for i in dataframe.iterrows():
    if cleandf['yhat'][i]>(-1000):

使用iterrowsすることはあなたにとって正しいことのように思えます。ただし、列にインデックスを付けることができる整数(完全な列)iではなく、各行の値を取ります。cleandf['yhat']

また、パンダには、巨大な負の数に依存するよりも、欠落している値をチェックするためのより良い方法があることに注意してください。次のようなものを試してください。

non_missing_index = pandas.isnull(dataframe['yhat'])
cleandf = dataframe[non_missing_index]
for row in cleandf.iterrows():
    row_index, row_values = row
    query = ("UPDATE Regression_Data.Input SET FITTEDVALUES="+(row_values['yhat'].__str__())+" where timecount="+(row_values['timecount'].__str__())+";")
    execute_my_query(query)

execute_my_queryあなたは私が期待するよりもうまく実装することができます。ただし、このソリューションはあなたが望むものではありません。本当にすべての行を反復処理して、2種類の挿入を実行する必要があります。これを試して:

for row in dataframe.iterrows():
    row_index, row_values = row
    if pandas.isnull(row_values['yhat']):
        pass # populate the 'null' insert query here
    else:
        query = ("UPDATE Regression_Data.Input SET FITTEDVALUES="+(row_values['yhat'].__str__())+" where timecount="+(row_values['timecount'].__str__())+";")
    execute_my_query(query)

それが役に立てば幸い。

于 2013-02-06T20:15:59.947 に答える