Baru-baru ini, saya mulai mengerjakan analisis harga saham untuk mengoptimalkan portofolio saya. Saya mulai dengan file Excel dan beberapa makro VBA. Ini bekerja cukup baik tetapi sangat lambat. Jadi, saya sekarang mencoba untuk meningkatkan dan menyiapkan database "harga saham" yang tepat di server saya (berdasarkan postingan ini).

Dalam database "stock_prices", ada tabel "daily_price" yang menyimpan harga saham harian untuk beberapa ticker. Untuk memperbarui tabel "harga harian", skrip python akan diluncurkan setiap hari dan menyertakan pernyataan Python / SQL di bawah ini.

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))

Sayangnya, baris "cursor.execute..." mengembalikan kesalahan di bawah ini: "AttributeError: objek 'Timestamp' tidak memiliki atribut 'translate'"

Hasil cetak dari tupel "nilai" adalah: [1, 2, Timestamp('2004-08-19 00:00:00'), 49.81328582763672, 51.83570861816406, 47.80083084106445, 49.9826545715332, 49.9826545715332, 44871300]

Berdasarkan apa yang dapat saya baca di pos serupa lainnya, saya memeriksa jenis indeks tanggal untuk memastikan bahwa itu bukan objek:

Print(df.index.dtype)

Ini mengembalikan "datetime64[ns]" yang tampaknya bagus.

Akhirnya, di database, saya telah mencoba mengubah tipe data dari "Tanggal" menjadi "Waktu Tanggal", tetapi ini tidak menyelesaikan kesalahan.

Adakah yang bisa berbagi beberapa petunjuk tentang cara mengatasi kesalahan ini?

Salam Hormat,

Sunting pada 25/04/2020 : Solusi akhir

            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())
0
JeanYves 23 April 2020, 00:29

1 menjawab

Jawaban Terbaik

Pertimbangkan untuk mengonversi kolom waktu tanggal Anda menjadi representasi string waktu dan gunakan DataFrame.to_numpy() alih-alih pendekatan 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()
1
Parfait 22 April 2020, 22:53