1. 程式人生 > >pandas or sql計算前後兩行資料間的增值

pandas or sql計算前後兩行資料間的增值

遇到這樣一個需求,有一張表,要給這張表新增一個欄位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 :
[email protected]
+ 1) rn FROM pos1,(SELECT @r1 := 0) r where t_id=1 ORDER BY ts1) main left join (SELECT t_id,ts1,ts2,(@r2 :[email protected] + 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好像有。

相關推薦

pandas or sql計算前後資料增值

遇到這樣一個需求,有一張表,要給這張表新增一個欄位delta,delta的值等於每行的c1列的值減去上一行c1列的值。 我的解決方案,可以通過python的pandas的diff來實現,也可以通過sql來實現,如下 import pandas as pd

資料進行對比-python

#!/usr/bin/python import difflib text1 = """text1: #定義字串1 This module provides classes and functions for comparing sequences. including HTML and cont

資料的差集;利用sql server取資料集的交、差、補集

差集: 需求:選出在t1表中但不在t2表中的資料 補集: A是B的子集,求A相對於B的補集。 SQLServer中通過intersect,union,except和三個關鍵字對應交、並、差三種集合運算。 他們的對應關係可以參考下面圖示 測試示例: 構造A,B

pandas 使用apply同時處理資料

df = pd.DataFrame ({'a' : np.random.randn(6), 'b' : ['foo', 'bar'] * 3, 'c' : np.random.randn(6)}) def my_test(

SQL Server中將多資料拼接為一個字串

--使用 自連線、for xml path('')和stuff合併顯示多行資料到一行中 --注 --1、計算列可以不用包含在聚合函式中而直接顯示,如下面語句的val。 --2、for xml path('') 應該應用於語句的最後面,繼而生成xml。 --3、for xml path('root')中的pa

oracle 怎麼將資料中合併從一行資料

在ORACLE10中可使用以下方法:SELECT n_sec_code, wmsys.wm_concat (c_researcher_code) as resultFROM m_researcher_stock_relGROUP BY n_sec_code

sql server2000 關於資料表的內容複製

http://www.cnblogs.com/freshman0216/archive/2008/08/15/1268316.html 這是一篇很不錯的文章,相信一看都會有很深的體會,雖然比較簡單,但是卻實比較省力~~~

MySQL實現把資料合併為一行

   在專案中遇到了這樣一個問題:某人上月投資N元錢,本月投資M元錢,現要求把本月和上月的投資金額放在一行顯示。如下圖:     解決方案:用left join on 詳細SQL指令碼如下: I

SQL Server中將多資料拼接為一行資料(一個字串)

SELECT @Users = @Users + ‘,’ + UserName FROM dbo.[User] WHERE RoleID = 1 SELECT @Users 方法二:使用for xml path(”) 和stuff –使用 自連線、f

SQL語句 拼接以上的

表:Customer select Power, UserName= stuff( ( select ',' + UserName from Customer t where Power = t2.Power for xml path('') ) , 1

sql中對資料進行運算作為新的列

select a1,a2,a1+a2 a,a1*a2 b,a1*1.0/a2 c from bb_sb 把a表的a1,a2列相加作為新列a,把a1,a2相乘作為新列b,注意: 相除的時候得進行型別轉換處理,否則結果為0. select a.a1,b.b1,a.a1+b.b1

sql裡將重複資料合併為一行,資料用逗號分隔(張高偉)

一.定義表變數 DECLARE @T1 table ( UserID int ,  UserName nvarchar(50), CityName nvarchar(50) ); insert into @T1 (UserID,UserName,CityName) values (1,'a','上海') i

SQL 計算全部資料數並LIMIT輸出資料

有時候會遇到資料過多需要分頁的情形(如論壇的樓蓋太高),通常是SQL_1先做COUNT,接著SQL_2做SELECT和LIMIT;此外還有一種方法是LIMIT的同時一起計算總資料量(沒有被LIMIT的數量),效率略低於前述SQL_2但優於SQL_1 + SQL_2的總和。 MySQL SEL

通過pl/sql計算程序的運時間

get mod tar ger this int || auth var 在sqlplus中運行sql語句或者pl/sql的時候如果需要統計運行的時間,只需要開啟set timing on選項即可。 SQL> set timing onSQL>SQL> s

pandas-同時處理數據

同時 item lambda ply ont one spa def ID pandas-同時處理兩行數據 假設數據集data如下所示: 如果我們想要將user_id 和 item_id兩列進行對應元素相加的操作,該怎麽辦呢? 顯然我們先定義一個加法函數,然後使用ap

命令】R語言讀取excel資料

安裝庫 安裝xlsx install.packages("xlsx") 使用 library(xlsx) ray = read.xlsx('D:/Code/R/Data in Excel/Chapter 8/gamma-ray.xls',1) 後面的引數,第一個放

oracle 分組取第一資料 ,查詢sql語句

oracle  分組取第一行資料 SELECT * FROM ( SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER BY y DESC) rn, t.* FROM test1 t ) WHERE rn = 1;   查詢oracle&nb

TLE(軌道資料)衛星行李資料格式解析

筆者在利用Cesium進行衛星顯示的時候遇到了衛星星曆資訊,衛星星曆資訊用TLE格式進行描述,初次看到這種資料很難看出描述的資料,所有在查詢了相關子類之後對TLE資料進行了介紹,如下所示: 衛星星曆的結構為三行,首行資料為衛星名稱;後面兩行則儲存了衛星相關資料,每行69個字元,包括0~9、A~Z

利用pandas計算DataFrame列日期相差秒數

import pandas as pd #先利用to_datetime轉換為時間格式,tm列的資料形式為'yyyy-MM-dd HH:mm:ss' df['tm_1'] = pd.to_datetime(df['tm_1']) df['tm_2'] = pd.to_datetime(df[

用ADO SQL查詢Excel表只能取到65535資料

作者:iamlaosong 同事在用ADO連線Excel用SQL查詢工作表的時候,發現只能查詢65535行資料,超過這個行數的資料就取不到了,其SQL語句如下: select  [單位] from [彙總$E:E] 開始以為是連線串的驅動不對,因為不同03和07版驅動是不一