Python:在 WRDS CRSP 查询中使用多个变量

问题描述 投票:0回答:1

我想在 WRDS SQL 查询中使用多个变量。 我正在寻求按 PERMNO 和日期搜索 CRSP 数据库,返回特定日期特定公司的股票价格。我有一个大型 DataFrame,将从中检索这些变量并用于搜索 CRSP 数据库。

在:

sql_query = """
 SELECT cusip, permno, date, prc
 FROM crsp_a_stock.dsf
 WHERE permno = 12490
 AND date in %(dates)s
 LIMIT 100
 """
 parm = {'dates': tuple([line for line in open('dates.txt', 'r')])}

 df = db.raw_sql(sql_query,  params=parm)
 df

输出:

    cusip       permno   date       prc
0   45920010    12490.0 1996-01-31  108.5

这将根据需要输出 1996 年 1 月 31 日 IBM (PERMNO 12490) 的数据。我的问题是,我还希望能够将 permno 条件链接到变量,这样我就可以运行查询并检索每个公司在特定日期的价格数据。

此代码基于此Answer

这可以通过 db.raw_sql 来完成吗? 我搜索了WRDS帮助站点(特别是向SQL传递参数部分),但无法解决这个问题。 我并不担心解决方案的细节(例如使用 .txt 输入文件而不是数据框),我只需要能够为多个 WHERE 条件实现变量。 如果无法通过 db.raw_sql 实现,是否有其他方法可以通过 Python 访问 WRDS 数据库以实现此目的?

感谢您的任何提示或指示。

python sql pandas wrds
1个回答
0
投票

一种选择是上传 pandas DataFrame,将其转换为字符串,然后将其添加到 sql 语句中。然后,您可以在该表上合并以获得所需的永久号和日期组合。

为最小示例制作数据框:

permnos=[14593,12490,12490]
dates=['2020-05-11','2012-01-03','2013-02-04']
df=pd.DataFrame(zip(permnos,dates),columns=['permno','date'])

定义一个函数将数据帧转换为可以作为sql表读取的字符串:

def upload_df(df,date_cols=[],df_name='uploaded'):
    """
    

    Parameters
    ----------
    df : pandas dataframe
        dataframe containing data you want to upload.
    date_cols : list, optional
        list of columns you want to convert to sql dates. The default is [].
    df_name : str, optional
        the name you want to call the table within the sql statement for merging, picking variables, etc. The default is 'uploaded'.

    Returns
    -------
    str
        dataframe converted to a string whcih will be readable as an sql table.
    """
    return "(VALUES "+str(tuple('('+"".join([("'" if type(df.iloc[r,c])==str else '')+str(df.iloc[r,c])+("'" if type(df.iloc[r,c])==str else '') +("::DATE" if df.columns[c] in date_cols else '')+("," if c+1<df.shape[1] else"") for c in np.arange(2)])+")" for r in np.arange(df.shape[0]))).replace('"','')[1:-1]+") AS "+df_name+" ("+','.join(df.columns)+")"

现在使用wrds sql下载。请注意,您需要指示哪些列是日期列,以便函数将这些列转换为可用于合并的日期:

df_download =conn.raw_sql("""
     SELECT a.cusip, a.permno, a.date, a.prc from
    crsp_a_stock.dsf as a
    
    right join """+upload_df(df,date_cols=['date'],df_name='uploaded')+"""
    on uploaded.permno=a.permno
    and uploaded.date=a.date
    """)

这会产生以下结果:

      cusip  permno        date        prc
0  03783310   14593  2020-05-11  315.01001
1  45920010   12490  2012-01-03  186.30000
2  45920010   12490  2013-02-04  203.78999
© www.soinside.com 2019 - 2024. All rights reserved.