#sql #pandas #pyodbc #ta-lib
#sql #pandas #pyodbc #ta-lib
Вопрос:
Мне нужна помощь с некоторой логикой здесь. Я использую pyodbc для запроса таблицы в SQL и создания фрейма данных, чтобы использовать ta-lib для расчета технических индикаторов, но происходит то, что он вычисляет индикатор по текущему счету всех акций, а не делает это для каждого тикера. Итак, для первого тикера в таблице все в порядке (я покажу пример), но когда тикер меняется, он не начинает пересчитывать снова. Сначала я запрашиваю таблицу, чтобы получить уникальный список биржевых тикеров в одном фрейме данных, затем использую этот список в моем заявлении «for», думая, что он выполнит вычисления для каждого тикера и начнет заново при обнаружении нового тикера. Вот как выглядят мои плохие результаты:
Вы можете видеть, что, когда он попадает в APTV-PA, он не запускается заново. Если бы это было так, SMA за этот первый день был бы более 100. (технически это будет нулевое значение, поскольку SMA является 30-дневной скользящей средней, поэтому первые 29 дней каждого тикера должны иметь нули. Для меня это еще один простой способ сказать, что он работает неправильно. Любая помощь приветствуется. Спасибо
import pandas as pd
import pyodbc
import talib
from talib import (WILLR,SMA)
path = 'H:\EOD_DATA_HISTORICAL\INDICATORS\MISC\'
DB_READ = {'servername': 'XYZXYZ',
'database': 'olaptraderv4'}
conn = pyodbc.connect('DRIVER={SQL Server};SERVER=' DB_READ['servername'] ';DATABASE=' DB_READ['database'] ';Trusted_Connection=yes')
sql1 = """
SELECT distinct [Ticker] FROM olaptraderv4.dbo.MiscHistorical order by Ticker
"""
ticker_list = pd.read_sql(sql1, conn)
print(ticker_list)
sql2 = """
SELECT [Ticker], [Date], [Open], [High], [Low], [Close], [Volume] FROM olaptraderv4.dbo.MiscHistorical order by Ticker
"""
df1 = pd.read_sql(sql2, conn)
print(df1.tail(2))
for Ticker in ticker_list:
#df1['WILLR'] = WILLR(df1['High'], df1['Low'], df1['Close'], timeperiod=14).round(3)
df1['SMA'] = SMA(df1['Close'], timeperiod=30).round(3)
df1.to_csv('3.csv', index=False, header=True)
Комментарии:
1. Примените фильтр к sql2, поскольку код перебирает ticker_list.
Ответ №1:
я решил просто написать просто групповое предложение «groupby», а затем записать .csv в отдельные файлы. Вот код. Только последние 5 строк
for Ticker, df1 in df1.groupby('Ticker'):
df1['SMA'] = SMA(df1['Close'], timeperiod=30).round(3)
df1['WILLR'] = WILLR(df1['High'], df1['Low'], df1['Close'], timeperiod=14).round(3)
df1.to_csv(path '{}.csv'.format(Ticker), mode='w', header=True, index=False, index_label=False)