求教 pandas 相关,最快找到某列中与上一行不同正负号的行,不用 for 应该怎么写?

2020-09-18 14:14:38 +08:00
 yellowtail

https://imgchr.com/i/wh0yqK

也就是找到 macd 出现金叉的位置

1173 次点击
所在节点    问与答
12 条回复
yech1990
2020-09-18 14:21:50 +08:00
大概这样

df.rolling(window=2).agg(lambda x : x.prod()<0)
yellowtail
2020-09-18 15:31:06 +08:00
没有看懂,但是确实实现了...谢谢大哥!
yellowtail
2020-09-18 15:31:38 +08:00
@yech1990 没有看懂,但是确实实现了...谢谢大哥!
zxCoder
2020-09-18 15:33:08 +08:00
@yech1990 好强啊
imn1
2020-09-18 15:55:59 +08:00
凡是有序的列(主要指 index 有序),值有前后相关的,用 rolling/window 函数就对了
yellowtail
2020-09-18 16:05:42 +08:00
@imn1 反正这一套 rolling 后接 agg 加 lambda prod 的操作看得我高山仰止 钦佩之情滔滔不绝...
clf
2020-09-18 16:20:44 +08:00
对 1 楼大佬写的语句的简单解析:

df.rolling(window=2).agg(lambda x : x.prod()<0)

df.rolling(window=2) :window 是计算统计量的观测值的数量,这里是当前量和前一个数值(上一行)。

x.prod() 返回乘积,相当于当前行乘以上一行,小于 0 表示符号不一样。

.agg(lambda x : x.prod()<0) 对传入的数值按 lambda 表达式进行计算。
imn1
2020-09-18 16:29:30 +08:00
@yellowtail #6
我是觉得奇怪,macd 就是证券计算,那基本上都离不开移动函数,应该都会呀,不然你是怎么算移动平均的?
yellowtail
2020-09-18 16:46:32 +08:00
@imn1 网上看到的都是 rolling 加 sum 和 mean... 我有样学样抄的 知其然不知其所以然的差距啊
kifile
2020-09-18 17:19:15 +08:00
x[(x*x.shift(1)) < 0]
yellowtail
2020-09-19 19:57:30 +08:00
@yech1990 再追问个问题,用 resample 处理 k 线合并(比如一分钟数据的 k 线,按 5 分周期取样,得到 5 分钟 k 线),但是 60 分钟以上的失败了,可能是因为中午休市时间的干扰,想问一下:有没有类似 rolling 的函数可以一段一段切分 df 的,比如窗口是 5,第一段就是 0-4,第二段是 5-9 这样的 谢谢!
yech1990
2020-09-20 02:10:53 +08:00
不是很清楚“但是 60 分钟以上的失败了”是什么意思。如果 resample 函数不行,你可以试试用 pd.cut 函数

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

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

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

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

© 2021 V2EX