python——python连接oracle数据库,并且比较数据之间的差别

本文介绍如何使用Python的Pandas库来对比分析两个包含日期、代码、最高价和最低价字段的DataFrame,通过内连接合并数据并找出不一致的记录。
部署运行你感兴趣的模型镜像

前几天同事问我一个问题,如何找出两份数据之间的不一样的值。这样描述问题不太好理解,举个例子:

两份数据是从oracle中两个不同的表读出来的,两份数据均有四个字段,其中两个字段日期和代码,另外两个字段代表最高价和最低价。现在想要找出两份数据相同日期和代码的记录是否最高价和最低价一致,有不一致的就找出来。

还原一下场景:

首先新建两个Dataframe:

import pandas as pd

df1 = pd.DataFrame({'date': ['2010', '2010', '2010', '2010', '2010', '2010'], 'symbol': [1, 2, 3, 4, 5, 6],
                    'maxprice': [100, 200, 300, 400, 500, 600], 'minprice': [10, 20, 30, 40, 50, 60]})
df2 = pd.DataFrame({'date': ['2010', '2010', '2010', '2010', '2010', '2010','2010'], 'symbol': [1, 2, 3, 4, 5, 6,7],
                    'maxprice': [100, 200, 300, 400, 500, 600,700], 'minprice': [10, 20, 30, 40, 50, 60,70]})

df1和df2如下:


思考了一下,用pandas的Dataframe可以很轻松解决。

首先是取数:

# encoding: utf-8
import pandas as pd
import cx_Oracle
from string import Template
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
database_oracle1 = {'user': 'xxx', 'password': 'xxx', 'ip': 'xxxx', 'port': 'xxxx','name': 'xxx'}
conn_oracle1 = cx_Oracle.connect(database_oracle1['user'], database_oracle1['password'],
                                 database_oracle1['ip'] + ':' + database_oracle1['port'] + '/' + database_oracle1['name'])
query = "select A,B,C,D from table where the_year = '$year'"
query = Template(query)
query = query.substitute(year='2010')
df1 = pd.read_sql_query(query, conn_oracle1)
这里只给出取一份数据的样例,假设我们两份数据都取出来了,并且就是上面定义的df1和df2。

现在需要比较两份数据的异同。

使用pandas的merge函数,可以轻松解决。

df3 = pd.merge(df1, df2, how='inner', on=['date', 'symbol'])
df3如下:


merge的使用方式和sql语言的join是一致的。因为此处merge的方式选择的是inner,所以只有5行。

随后怎么处理就很清楚了。

df4 = pd.DataFrame()
for i in range(1, 3):
    df4[i] = df3.icol(i)-df3.icol(i+3)
上面数据没有造好,所以结果都是0。


各位可以考虑一下如何优化代码,适用性能更强一些,我这里就不写了。


您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值