我很難想出正確的查詢來獲取我需要的資料,我想知道它是否可以使用 SQL 實際完成,或者我是否應該在 Python 中處理它。
我的第一個表(api_results)看起來像這樣
| 股票代碼 | 入口 | 日期 | 改變 |
|---|---|---|---|
| 蘋果 | 2 | 2022-06-09 | 1.05 |
| 特斯拉 | 7 | 2022-09-09 | -0.34 |
第二個(historical_data)看起來像這樣,不包括不相關的列。
| 股票代碼 | 日期 | 改變 |
|---|---|---|
| 蘋果 | 2022-06-09 | 1.05 |
| 蘋果 | 2022-07-09 | -0.34 |
| 蘋果 | 2022-08-09 | 2.5 |
| 蘋果 | 2022-09-09 | 1.12 |
| 蘋果 | 2022-10-09 | ... |
| 蘋果 | 2022-11-09 | ... |
| 微軟 | 2022-06-09 | ... |
| 微軟 | 2022-07-09 | ... |
| 微軟 | 2022-08-09 | ... |
| 微軟 | 2022-09-09 | ... |
| 微軟 | 2022-10-09 | ... |
| 微軟 | 2022-11-09 | ... |
我正在嘗試為 api_results 中的每個代碼獲取 api_results.date 中的日期,并查看 api_results 中每個代碼在 10 天內的變化總和。非動態查詢如下:
SELECT ticker, Date, sum(change) as change FROM
(
SELECT change, ticker, Date FROM historical_data
WHERE ticker = 'T' AND date >= '2013-12-13 00:00:00'
limit 10
)
哪個回傳
| 股票代碼 | 日期 | 改變 |
|---|---|---|
| 噸 | 2013-12-13 | 3.76 |
結果是正確的,但是我怎樣才能對 api_results 中的每個日期代碼對做同樣的事情。這個想法是將函式應用于表的每一行。我會在 Python 中做的是:
import sqlite3
from config import db_path
import pandas as pd
connection = sqlite3.connect(db_path)
cursor = connection.cursor()
historical_data = pd.read_sql("SELECT Date, Ticker, Change from historical_data", connection)
api_results = cursor.execute("SELECT ticker, date from api_results").fetchall()
data = []
for ticker, date in api_results:
index = list(historical_data['Date'].index(date))
data.append(historical_data.iloc[index:index 10]['Change'].sum())
這似乎作業得很好,但它需要的時間太長了。兩個小時后,回圈仍在進行。請注意,歷史資料有 100 萬多行資料和 30 列。
我是否應該在 Python 中找到一種更好的方法,比如對歷史資料進行矢量化處理,或者甚至只是構建一個資料框并適當地轉移更改,或者這可以使用 SQL 來完成嗎?感謝您的時間和幫助。
uj5u.com熱心網友回復:
我提出的查詢如下:
SELECT
t1.ticker, t1.date, t2.change_10
FROM
api_results AS t1
INNER JOIN (
SELECT
ticker,
date,
SUM(change) OVER (
PARTITION BY ticker
ORDER BY date
RANGE BETWEEN 0 PRECEDING AND 10 FOLLOWING
) AS change_10
FROM
historical_data
ORDER BY
ticker, date
) AS t2
ON t1.ticker = t2.ticker AND t1.date = t2.date
其中子查詢為以下 10 個條目構建歷史資料變化的滾動總和,就像index:index 10我呼叫 change_10 所做的那樣。為了從子查詢中獲取相關位,我在查詢上使用內部連接api_results來獲取所需的代碼和日期組合。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/490804.html
