2017-09-13 7 views
2
import dataset 
db = dataset.connect(....) 
table = db[...] 

Mysqlテーブルに値を挿入しようとすると、このエラーが発生しました。私は、テーブルに挿入しています'numpy.float64'オブジェクトに 'translate'属性がありませんPythonでMysqlに値を挿入

サンプル値:

print("Buy", ticker, price, date, OType, OSize) 
Buy AAPL 93.4357142857 2016-05-12 Market 200 
data = dict(Order_Side='Buy',Ticker=ticker, Price=price, 
          Order_Date= date, Order_Type = OType, Volume = OSize) 
table.insert(data) 

エラーメッセージ:

このエラーを引き起こした何
Traceback (most recent call last): 

    File "<ipython-input-3-b7ab0c98f72f>", line 1, in <module> 
    runfile('C:/Users/SwigelUser/Documents/GitHub/Trading/Strategies/strat_MA_ExecTest.py', wdir='C:/Users/SwigelUser/Documents/GitHub/Trading/Strategies') 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 880, in runfile 
    execfile(filename, namespace) 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile 
    exec(compile(f.read(), filename, 'exec'), namespace) 

    File "C:/Users/SwigelUser/Documents/GitHub/Trading/Strategies/strat_MA_ExecTest.py", line 69, in <module> 
    MA_Stra(start_length=7,end_length=10,start_date=date(2016,5,12),end_date=date(2016,6,18)) 

    File "C:/Users/SwigelUser/Documents/GitHub/Trading/Strategies/strat_MA_ExecTest.py", line 66, in MA_Stra 
    table.insert(data1) 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\dataset\persistence\table.py", line 87, in insert 
    res = self.database.executable.execute(self.table.insert(row)) 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 945, in execute 
    return meth(self, multiparams, params) 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\sqlalchemy\sql\elements.py", line 263, in _execute_on_connection 
    return connection._execute_clauseelement(self, multiparams, params) 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1053, in _execute_clauseelement 
    compiled_sql, distilled_params 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1189, in _execute_context 
    context) 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1405, in _handle_dbapi_exception 
    util.reraise(*exc_info) 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py", line 187, in reraise 
    raise value 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1182, in _execute_context 
    context) 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\sqlalchemy\engine\default.py", line 470, in do_execute 
    cursor.execute(statement, parameters) 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\pymysql\cursors.py", line 164, in execute 
    query = self.mogrify(query, args) 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\pymysql\cursors.py", line 143, in mogrify 
    query = query % self._escape_args(args, conn) 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\pymysql\cursors.py", line 123, in _escape_args 
    return dict((key, conn.literal(val)) for (key, val) in args.items()) 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\pymysql\cursors.py", line 123, in <genexpr> 
    return dict((key, conn.literal(val)) for (key, val) in args.items()) 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\pymysql\connections.py", line 821, in literal 
    return self.escape(obj, self.encoders) 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\pymysql\connections.py", line 814, in escape 
    return escape_item(obj, self.charset, mapping=mapping) 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\pymysql\converters.py", line 27, in escape_item 
    val = encoder(val, mapping) 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\pymysql\converters.py", line 110, in escape_unicode 
    return u"'%s'" % _escape_unicode(value) 

    File "C:\Users\SwigelUser\Anaconda3\lib\site-packages\pymysql\converters.py", line 73, in _escape_unicode 
    return value.translate(_escape_table) 

AttributeError: 'numpy.float64' object has no attribute 'translate' 

?どのように私はこれを解決することができます。 私はここにあまりにも多くのコードを入力したようですので、私は提出するために何も意味のない多くを入力する必要があります。

私の価格と日付変数は、データフレームから来ている:

for i in range(len(All_Tickers)-1-len(Current_Date),len(All_Tickers)-1): 
    price = All_Tickers[str(length) + 'day_MA'][i] 
    date = All_Tickers['Date'][i+1] 

以下の回答によると、問題は価格のタイプでなければなりませんが、私はこの変数がfloat型に変換できるか、np.float64のですか?

+0

パンダが関与していることが判明して以来、['to_sql()'](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_sql.html)メソッドはあなたに興味があるかもしれません。 – Unatiel

答えて

2

あなたのライブラリは、提供された引数をMySQLが理解できるフォーマットにフォーマットしようとします。これを行うために、各引数のタイプをチェックして、入力をどのようにフォーマットするかを決定します。

しかし、libはnumpy.float64を認識しないため、の文字列(unicode)の場合はデフォルトのエンコーダにフォールバックします。 Here is the relevent piece of code

def escape_item(val, charset, mapping=None): 
    if mapping is None: 
     mapping = encoders 
    encoder = mapping.get(type(val)) 

    # Fallback to default when no encoder found 
    if not encoder: 
     try: 
      encoder = mapping[text_type] 
     except KeyError: 
      raise TypeError("no default type converter defined") 

    if encoder in (escape_dict, escape_sequence): 
     val = encoder(val, charset, mapping) 
    else: 
     val = encoder(val, mapping) 
    return val 

このエンコーダは、入力が実際の文字列であると仮定すると、この文字列にtranslate()メソッドを呼び出そう。しかし、このメソッドはfloat64では定義されていないため、このエラーが発生します。

float64を通常のフロートに変換してください。

または、独自のエンコーダを作成して、デフォルトのPythonタイプのエンコーダへのマッピングとして使用されるencoders dictに追加することができます。このlibをfloat64でたくさん使うつもりなら、それは価値があるかもしれません。

+0

ありがとうございます、私はフォローアップを求めるために私の質問を更新します – Dylan

+0

@Dylanあなたのサンプルから、はい、これは問題を引き起こしているfloat64である可能性が非常に高いです。ですから、 'price = float(All_Tickers [str(length)+ 'day_MA'] [i])'を試してみてください。 – Unatiel

関連する問題