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版驅動是不一