как экспортировать из sql в отдельные CSV-файлы на основе значения столбца

#sql #pandas #ta-lib

#sql #pandas #ta-lib

Вопрос:

Я запрашиваю sql, где указаны необработанные символы OHLC, Volume и Ticker, и вычисляю технические индикаторы с помощью библиотеки ta-lib. Я хочу записать фрейм данных в csv (df.to_csv) для каждого отдельного тикера в таблице. К сожалению, когда я пытаюсь вычислить скользящее среднее, оно объединяет все тикеры вместе и выполняет скользящее среднее по всем из них, а не для каждого символа тикера. Используя цикл FOR для каждого тикера, я надеюсь, что смогу правильно вычислять значения и записывать во многие разные csv. вот что у меня есть, и я хотел бы знать, как заменить «1.csv» на нужные мне несколько выходных файлов.

 import pandas as pd
import pyodbc
#import talib
from talib import (SMA)


DB_READ = {'servername': 'XYZXYZ',
      'database': 'olaptraderv4'}

conn = pyodbc.connect('DRIVER={SQL Server};SERVER='   DB_READ['servername']   ';DATABASE='       DB_READ['database']   ';Trusted_Connection=yes')


sql = """
SELECT [Ticker], [Date], [Open], [High], [Low], [Close], [Volume] FROM    olaptraderv4.dbo.MiscHistorical order by Ticker
    """

for Ticker in sql:
    df = pd.read_sql(sql, conn)
    df.groupby('Ticker')
    df['SMA'] = SMA(df['Close'], timeperiod=30).round(3)
    df.to_csv('1.csv', index=False, header=True)
    print(df.tail(7))
 

Ответ №1:

Вы можете сделать это непосредственно в SQL, используя функцию window, хотя мне неясно, действительно ли вы хотите сгруппировать результат ( PARTITION BY предложение needs) или получить его по всему результирующему набору:

 SMA = AVG(Close) OVER (ORDER BY Date ROWS BETWEEN 29 PRECEDING AND CURRENT ROW)
SMA = AVG(Close) OVER (PARTITION BY grouping_column ORDER BY Date ROWS BETWEEN 29 PRECEDING AND CURRENT ROW)
 

Обратите внимание, что это работает только с нумерацией строк, а не с фактическими промежутками дат, поэтому, если у вас несколько тикеров в один и тот же день, вам нужно более сложное решение.

Кроме того, в первых 29 строках не будет 30 строк данных для усреднения, потому что этих строк нет. Возможно, вам все еще нужен результат.

Комментарии:

1. Спасибо, но у меня на самом деле есть еще около 40 других технических индикаторов для расчета, поэтому мне нужно использовать ta-lib. Я просто привел SMA в качестве примера здесь.