Oracle截取小球点后,从Oracle读取数据并用python处理过程记录(构建BARRA因子遇到的问题)...

第一次用pycharm运行python语句,第一次从Oracle读数据,出现了无数的bug。。把过程记录一下以提升效率

1.数据读取并处理成dataframe格式:用逐行查询的方式

import cx_Oracle

import pandas as pd

import numpy as np

#连接数据库

db = cx_Oracle.connect('用户名','密码','位置')

# 获取游标

cr= db.cursor()

#查询数据并形成数据表

def get_df_from_sqldata(sql): #sql放sql语句

cr = db.cursor()

cr.execute(sql)

rs = cr.fetchall()

columnDes = cr.description

columnNames = [colunmDes[i][0] for i in range(len(columnDes))]

df = pd.DataFrame([list(i) for i in rs], columns = columnNames)

return df

2.SQL语句在Oracle中运行无误,但在python中报错“未找到要求的from关键字”,主要是一些小问题,比如多了逗号, 没加空格之类

我的问题在于where条件前面没有加上空格

网上还有一些问题,eg 查询的字段另起的中文名字中出现了各种不符合规则的字符,比如:/ 、\ - :这些字符,除此之外,中文名字过长,也会出现这种问题。

3.“ORA-00942: 表或视图不存在”,

原因一是自己起的表命没有全部大写。Oracle是大小写敏感的,在python中名字是小写的,执行代码Oracle就找不到了。。

原因二是调用的主表名不对。用以下语句查找表所属数据库:

select * from all_tables t where t.TABLE_NAME = upper(‘已知指标所在的表名’)

4.oracle not supported error: python处理的数据类型与Oracle中数据类型需要一一对应,不然没法写进Oracle。

参考:python与oracle(三)数据类型

这里需要用到显示DataFrame数据类型的代码

print(df.dtypes)

int32没法写进number类型列,需要在写入Oracle的语句前加int()

5.模糊查询与表拼接

select t.指标一, c.* from smdbgdata.CD_Macroindicator c,smdbgdata.C_ED_macroIndicatorData c where t.indicatorname like ‘%美国国债%’ and t.indicatorcode = c.indicatorcode and c.enddate >sysdate-10

6.建同义词与授权:有时候要跨库查询

Create public synonym 表名 for 库1.表名;

grant DELETE,INSERT,SELECT,UPDATE on 库1.表名 to 库2;

7.选取部分字段

substr(A.s_info_windcode,1,instr(a.s_info_windcode,’.’,1,1)-1)

8.更改日期格式

to_char(to_date(c.time,‘YYYY-MM-DD’),‘YYYYMMDD’) = A.TRADE_DT

9.groupby有问题:有股票被放进符合要求(非st pt股,上市时间>180天,A股)的股票列表,但在查询的时间区间内数据非整型,只有某几天有数据。

目前的解决方法是把出问题的天拿出来按股票代码循环,找出有问题的代码,在查询数据时删掉

10.跑循环有时候不知道跑到第几个,需要从Oracle里读最新日期看一下。

select *

from FOF_STOCK_ETOP T order by T.TIME DESC

原文链接:https://blog.csdn.net/Kiraaaaaaaaa/article/details/110959016

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值