pandas or sql计算前后两行数据间的增值方法


Posted in Python onApril 20, 2018

遇到这样一个需求,有一张表,要给这张表新增一个字段delta,delta的值等于每行的c1列的值减去上一行c1列的值。

我的解决方案,可以通过python的pandas的diff来实现,也可以通过sql来实现,如下

import pandas as pd

srcTable = pd.read_csv('pos1.csv')
print(srcTable)
destTable = srcTable.loc[srcTable.tid == 1, ['ts1', 'ts2']].sort_values(by='ts1')
destTable.columns = ['deltaTs1', 'deltaTs2']
destTable = destTable.diff()
destTable = destTable.fillna(0)
destTable['delay'] = destTable['deltaTs2'] - destTable['deltaTs1']
print(destTable)

出来的效果如下:

tid   ts1   ts2
0 1 1500443161000 1500443161240
1 1 1500443162000 1500443162994
2 1 1500443163000 1500443163067
3 1 1500443164000 1500443164993
 deltaTs1 deltaTs2 delay
0  0.0  0.0 0.0
1 1000.0 1754.0 754.0
2 1000.0  73.0 -927.0
3 1000.0 1926.0 926.0

若是用sql语句,我用的是mysql,自己构造行号rn

mysql> select main.t_id,
main.ts1,
ifnull(main.ts1-sub.ts1,0) deltaTs1,
main.ts2,
ifnull(main.ts2-sub.ts2,0) deltaTs2 from
(SELECT t_id,ts1,ts2,(@r1 :=@r1 + 1) rn FROM pos1,(SELECT @r1 := 0) r where t_id=1 ORDER BY ts1) main
left join 
(SELECT t_id,ts1,ts2,(@r2 :=@r2 + 1) rn FROM pos1,(SELECT @r2 := 0) r where t_id=1 ORDER BY ts1) sub 
on main.rn-1=sub.rn;
+------+---------------+----------+---------------+----------+
| t_id | ts1   | deltaTs1 | ts2   | deltaTs2 |
+------+---------------+----------+---------------+----------+
| 1 | 1500443161000 |  0 | 1500443161240 |  0 |
| 1 | 1500443162000 |  1000 | 1500443162994 |  1754 |
| 1 | 1500443163000 |  1000 | 1500443163067 |  73 |
| 1 | 1500443164000 |  1000 | 1500443164993 |  1926 |
+------+---------------+----------+---------------+----------+

测试数据如下

pos1.csv

1,1500443161000,1500443161240
1,1500443162000,1500443162994
1,1500443163000,1500443163067
1,1500443164000,1500443164993
CREATE TABLE `pos1` (
 `t_id` int(11) DEFAULT NULL,
 `ts1` bigint(22) DEFAULT NULL,
 `ts2` bigint(22) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO pos1 VALUES (1, 1500443161000, 1500443161240);
INSERT INTO pos1 VALUES (1, 1500443162000, 1500443162994);
INSERT INTO pos1 VALUES (1, 1500443163000, 1500443163067);
INSERT INTO pos1 VALUES (1, 1500443164000, 1500443164993);

貌似有些数据库有这种当前行减去上一行数据的函数,具体我没有研究过。有知道的朋友可以告诉我一下,我印象中像Sqlserver好像有。

Python 相关文章推荐
Tornado服务器中绑定域名、虚拟主机的方法
Aug 22 Python
跟老齐学Python之大话题小函数(2)
Oct 10 Python
python中的文件打开与关闭操作命令介绍
Apr 26 Python
NumPy 数学函数及代数运算的实现代码
Jul 18 Python
Python字典中的键映射多个值的方法(列表或者集合)
Oct 17 Python
python遍历文件夹找出文件夹后缀为py的文件方法
Oct 21 Python
用Python+OpenCV对比图像质量的几种方法
Jul 15 Python
opencv导入头文件时报错#include的解决方法
Jul 31 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
Mar 31 Python
Python3操作YAML文件格式方法解析
Apr 10 Python
Python3实现打印任意宽度的菱形代码
Apr 12 Python
jupyter notebook 实现matplotlib图动态刷新
Apr 22 Python
对pandas进行数据预处理的实例讲解
Apr 20 #Python
pandas 两列时间相减换算为秒的方法
Apr 20 #Python
详谈pandas中agg函数和apply函数的区别
Apr 20 #Python
Python使用pip安装pySerial串口通讯模块
Apr 20 #Python
pandas apply 函数 实现多进程的示例讲解
Apr 20 #Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
Jul 20 #Python
Python查找两个有序列表中位数的方法【基于归并算法】
Apr 20 #Python
You might like
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
win10环境PHP 7 安装配置【教程】
2016/05/09 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
2018/05/12 PHP
JavaScript入门教程(11) js事件处理
2009/01/31 Javascript
javascript跟随滚动效果插件代码(javascript Follow Plugin)
2013/08/03 Javascript
javascript将浮点数转换成整数的三个方法
2014/06/23 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
2014/10/29 Javascript
javascript浏览器窗口之间传递数据的方法
2015/01/20 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
Angular.js中$apply()和$digest()的深入理解
2016/10/13 Javascript
Bootstrap Table使用方法解析
2016/10/19 Javascript
vue 使用自定义指令实现表单校验的方法
2018/08/28 Javascript
webpack中如何使用雪碧图的示例代码
2018/11/11 Javascript
VUE v-model表单数据双向绑定完整示例
2019/01/21 Javascript
ES6之Proxy的get方法详解
2019/10/11 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
使用Python装饰器在Django框架下去除冗余代码的教程
2015/04/16 Python
Python保存MongoDB上的文件到本地的方法
2016/03/16 Python
Python3.6 Schedule模块定时任务(实例讲解)
2017/11/09 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
使用TensorFlow搭建一个全连接神经网络教程
2020/02/06 Python
jupyter notebook 实现matplotlib图动态刷新
2020/04/22 Python
python调用摄像头的示例代码
2020/09/28 Python
aden + anais官方网站:婴儿襁褓、毯子、尿布和服装
2017/06/21 全球购物
Clarks其乐鞋荷兰官网:Clarks荷兰
2019/07/05 全球购物
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
2014/09/09 面试题
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
理工大学毕业生自荐信
2013/11/01 职场文书
开朗女孩的自我评价
2014/02/10 职场文书
检讨书模板
2015/01/29 职场文书
因身体原因离职的辞职信范文
2015/05/12 职场文书
新郎新娘致辞
2015/07/31 职场文书
车辆安全隐患排查制度
2015/08/05 职场文书
实习报告范文
2019/07/30 职场文书
Oracle 区块链表创建过程详解
2021/05/15 Oracle
tensorflow中的数据类型dtype用法说明
2021/05/26 Python