如何根据列值从 sql 导出以分隔 csv

问题描述

我正在查询原始 OHLC、成交量和股票代码所在的 sql,并使用 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': 'XYZ\XYZ','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))

解决方法

您可以使用窗口函数直接在 SQL 中执行此操作,但我不清楚您是否真的想要对结果进行分组(需要 <div class="d-flex"> ... <!-- size xs: use text above input. --> <div class="d-block d-sm-none mx-auto my-0 text-center"> LABEL TEXT <div class="d-flex flex-row"> <input id="input-narrow" class="mx-auto my-0 p-1 text-center"> </div> </div> <!-- size sm and up: use placeholder --> <div class="d-none d-sm-flex flex-row flex-nowrap mx-auto my-0"> <input id="input-wide" class="mx-auto my-0 p-1 text-center" placeholder="LABEL TEXT"> </div> ... </div> 子句),或者在整个结果集中获取它:

PARTITION BY

请注意,这仅适用于行编号,而不适用于实际日期跨度,因此如果您在同一天有多个股票代码,则需要更复杂的解决方案。

此外,前 29 行不会有 30 行数据需要平均,因为没有那些行。您可能仍然想要结果。