我想在 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 数据库以实现此目的?
感谢您的任何提示或指示。
一种选择是上传 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