Ошибка "У объекта 'Timestamp' нет атрибута 'translate'"
Недавно я начал работать над анализом цен на акции, чтобы оптимизировать свой портфель. Я начал с файла Excel и нескольких макросов VBA. Работает неплохо, но очень медленно. Итак, сейчас я пытаюсь активизировать и настроить надлежащую базу данных "котировок акций" на моем сервере (на основе этого сообщения).
В базе данных stock_prices есть таблица daily_price, в которой хранятся дневные цены на акции для некоторых тикеров. Для обновления таблицы "дневных цен" каждый день будет запускаться сценарий python, который включает следующие операторы Python / SQL.
df = pdr.get_data_yahoo(ticker, start_date)
for row in df.itertuples():
values = [YAHOO_VENDOR_ID, ticker_index[ticker]] + list(row)
cursor.execute("INSERT INTO daily_price (data_vendor_id, ticker_id, price_date, open_price, high_price, low_price, close_price, adj_close_price, volume) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)", tuple(values))
К сожалению, строка "cursor.execute..." возвращает следующую ошибку: "AttributeError: объект 'Timestamp' не имеет атрибута 'translate'"
Распечатка кортежа "значения": [1, 2, Timestamp('2004-08-19 00:00:00'), 49.81328582763672, 51.83570861816406, 47.80083084106445, 49.9826545715332, 49.9826545715332, 44871300]
Основываясь на том, что я мог прочитать в другом аналогичном посте, я проверил тип индекса даты, чтобы убедиться, что это не объект:
Print(df.index.dtype)
Это возвращает datetime64[ns], что кажется хорошим.
Наконец, в базе данных я попытался изменить тип данных с "Date" на "Datetime", но это не решило ошибку.
Может ли кто-нибудь поделиться советами о том, как решить эту ошибку?
С уважением,
Изменить 25/04/2020: Окончательное решение
df = pdr.get_data_yahoo(ticker, start_date)
df = df.reset_index()
df.columns = ['price_date', 'open_price', 'high_price', 'low_price', 'close_price', 'adj_close_price', 'volume']
df['data_vendor_id'] = YAHOO_VENDOR_ID
df['ticker_id'] = ticker_index[ticker]
df = df[['data_vendor_id','ticker_id','price_date', 'open_price', 'high_price', 'low_price', 'close_price', 'adj_close_price', 'volume']]
df['price_date'] = df['price_date'].dt.strftime('%Y-%m-%d %H:%M:%S')
print(df)
cursor.executemany("INSERT INTO daily_price (data_vendor_id, ticker_id, price_date, open_price, high_price, low_price, close_price, adj_close_price, volume) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)", df.to_numpy().tolist())
1 ответ
Рассмотрите возможность преобразования столбца даты и времени в строковое представление времени и используйте DataFrame.to_numpy()
вместо iterrows
подход:
df = pdr.get_data_yahoo(ticker, start_date)
# ADD NEW COLUMNS
df["data_vendor_id"] = YAHOO_VENDOR_ID
df["ticker_id"] = ticker_index[ticker]]
# CONVERT DATE TO STRING TIME
df["DATE"] = df["DATE"].dt.strftime('%Y-%m-%d %H:%M:%S')
sql = '''INSERT INTO daily_price (data_vendor_id, ticker_id, price_date,
open_price, high_price, low_price,
close_price, adj_close_price, volume)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
'''
# LIST
cursor.executemany(sql, df.to_numpy().tolist())
conn.commit()