Python 快速计算增量的方法

2019-12-11 21:24:05 +08:00
 JCZ2MkKb5S8ZX9pq

假设表

data = [
  ['20:00', 100],
  ['20:10', 130],
  ['20:20', 190],
  ...
]

期望结果,只统计增量:

data = [
  ['20:00', 100],
  ['20:10', 30],
  ['20:20', 60],
  ...
]

正常写法我会,求一个最 pythonic 的搞法。
印象中好像 map 还是 reduce 啥的能搞这个,但是 py3 好像要导入模块,有点想不起来了。
谁给指点一下。

4493 次点击
所在节点    Python
32 条回复
necomancer
2019-12-11 23:03:30 +08:00
numpy 去官方文档看看那个入门了解一下各种数组的操作就可以了。你要是处理数据尤其是简单统计一类的比较多的话,多看看 pandas。有些像 dataframe.diff 不那么好用的场景毕竟还可以用 numpy.diff (prepend,append 和 axis ),毕竟数据应该是一样的。
dongxiao
2019-12-11 23:19:52 +08:00
1、
data[0:1] + list(map(lambda obj1, obj2: [obj1[0], obj2[1]-obj1[1]], data[0:-1], data[1:]))

2、
from pandas import DataFrame
frame = DataFrame(data)
pd.concat([frame.loc[:, 0], frame.loc[:, 1].map(int).diff()], axis=1).combine_first(frame)
JCZ2MkKb5S8ZX9pq
2019-12-11 23:24:27 +08:00
@necomancer 好的,我去了解一下。
JCZ2MkKb5S8ZX9pq
2019-12-11 23:26:31 +08:00
@dongxiao 这个是会玩 pandas 的,让我好好消化一下。
dongxiao
2019-12-11 23:42:25 +08:00
3、
import numpy as np
arr = np.array(data)
time_arr, num_arr = np.hsplit(arr, [1])
np.c_[time_arr, np.r_[num_arr[:1], np.diff(num_arr.astype(int), 1, 0)]]

# 如果要格式转换则
list(map(lambda obj: [obj[0], int(obj[1])], np.c_[time_arr, np.r_[num_arr[:1], np.diff(num_arr.astype(int), 1, 0)]].tolist()))
ClericPy
2019-12-12 01:46:31 +08:00
@JCZ2MkKb5S8ZX9pq #23 呃, 看了这么多回帖才知道你是要数据分析量级比较大的, 那走 pandas 肯定是最好的选择, 性能高一大截还不容易出错

@necomancer #10 好吧, 我还真没想到复杂度层面, 以前被 CTO 逮住教训了半天别太纠结语法糖, 写过太多屎山, 所以把 pythonic 就直接看作优雅的可读性了
dangyuluo
2019-12-12 07:15:15 +08:00
最 pythonic 的写法难道不是用 numpy 么哈哈,shift 第二列然后减一下
cassidyhere
2019-12-12 10:11:17 +08:00
from itertools import chain

l = [100, 130, 190]
[i - j for i, j in zip(l, chain([0], l[:-1]))]

这样吧,如果想用 map 还可以用 operator

import operator

map(operator.sub, l, chain([0], l[:-1]))
cassidyhere
2019-12-12 10:14:35 +08:00
涉及循环或序列里元素间的操作,可以看看 itertools, operator, functools
wliansheng
2019-12-12 11:22:06 +08:00
为什么楼上大部分回答都不能成功运行。除了 @cassidyhere 可以得到 [100, 30, 60]
JCZ2MkKb5S8ZX9pq
2019-12-12 13:40:04 +08:00
@cassidyhere
你这一写,我感觉以前看 cookbook 的时候都见过,太久不用都还回去了。/捂脸

不过这个题目我后来想想,还是有一些细节可以探讨。几种方法效率上还是有点区别。
cfwyy
2019-12-12 14:59:37 +08:00
不知道啥叫 pythonic,见笑了。

newdata=data[0:1]
newdata.extend([[data[i][0],data[i][1]-data[i-1][1]] for i in range(1,len(data))])

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/628147

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX