V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yellowtail
V2EX  ›  问与答

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

  •  
  •   yellowtail · 2020-09-18 14:14:38 +08:00 · 1299 次点击
    这是一个创建于 1513 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://imgchr.com/i/wh0yqK

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

    12 条回复    2020-09-20 02:10:53 +08:00
    yech1990
        1
    yech1990  
       2020-09-18 14:21:50 +08:00 via Android   ❤️ 4
    大概这样

    df.rolling(window=2).agg(lambda x : x.prod()<0)
    yellowtail
        2
    yellowtail  
    OP
       2020-09-18 15:31:06 +08:00
    没有看懂,但是确实实现了...谢谢大哥!
    yellowtail
        3
    yellowtail  
    OP
       2020-09-18 15:31:38 +08:00
    @yech1990 没有看懂,但是确实实现了...谢谢大哥!
    zxCoder
        4
    zxCoder  
       2020-09-18 15:33:08 +08:00
    @yech1990 好强啊
    imn1
        5
    imn1  
       2020-09-18 15:55:59 +08:00
    凡是有序的列(主要指 index 有序),值有前后相关的,用 rolling/window 函数就对了
    yellowtail
        6
    yellowtail  
    OP
       2020-09-18 16:05:42 +08:00
    @imn1 反正这一套 rolling 后接 agg 加 lambda prod 的操作看得我高山仰止 钦佩之情滔滔不绝...
    clf
        7
    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
        8
    imn1  
       2020-09-18 16:29:30 +08:00
    @yellowtail #6
    我是觉得奇怪,macd 就是证券计算,那基本上都离不开移动函数,应该都会呀,不然你是怎么算移动平均的?
    yellowtail
        9
    yellowtail  
    OP
       2020-09-18 16:46:32 +08:00
    @imn1 网上看到的都是 rolling 加 sum 和 mean... 我有样学样抄的 知其然不知其所以然的差距啊
    kifile
        10
    kifile  
       2020-09-18 17:19:15 +08:00   ❤️ 1
    x[(x*x.shift(1)) < 0]
    yellowtail
        11
    yellowtail  
    OP
       2020-09-19 19:57:30 +08:00
    @yech1990 再追问个问题,用 resample 处理 k 线合并(比如一分钟数据的 k 线,按 5 分周期取样,得到 5 分钟 k 线),但是 60 分钟以上的失败了,可能是因为中午休市时间的干扰,想问一下:有没有类似 rolling 的函数可以一段一段切分 df 的,比如窗口是 5,第一段就是 0-4,第二段是 5-9 这样的 谢谢!
    yech1990
        12
    yech1990  
       2020-09-20 02:10:53 +08:00 via Android   ❤️ 1
    不是很清楚“但是 60 分钟以上的失败了”是什么意思。如果 resample 函数不行,你可以试试用 pd.cut 函数
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2614 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:58 · PVG 12:58 · LAX 20:58 · JFK 23:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.