看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在做财经股票数据分析时,经常会涉及数据的涨跌判断。通过 tushare 导入的数据后,当前数据与前一天的数据进行比较,得到一个差值,需要标注涨跌情况。
假定以下是我们的得到的某支股票每天的收盘数据:
import pandas as pd
import numpy as np
df = pd.DataFrame({'price': [5, 6, 3, 3, 6]},
                  index=pd.date_range('20210701', periods=5)
                 )
df
'''
            price
2021-07-01      5
2021-07-02      6
2021-07-03      3
2021-07-04      3
2021-07-05      6
'''
以上的数据是每天的股价,现在需要在当前行标注与前一日对比数据的涨跌情况,增加一列标注涨、平、跌文字。
先对价格字段求差值,这样会得到一个正负或者 0 值的列,大于 0 时为涨, 等于 0 时为平,小于 0 时为跌。
再判断这个值的正负性,可以使用 np.sign 函数来操作。最后将三种情况的文本映射到列上,完成需求。
接下来我们用代码进行实现,第一步增加一列求数据的前后差值,即为第二天价格的变化值:
# 增加一列,求与前一数据的差值
df.assign(change=df.price.diff())
'''
            price  change
2021-07-01      5     NaN
2021-07-02      6     1.0
2021-07-03      3    -3.0
2021-07-04      3     0.0
2021-07-05      6     3.0
'''
得到变化值后,np.sign 求变化值的符号:
(
    df.assign(change=df.price.diff())
    .assign(lable=lambda d: d.change.map(np.sign))
)
'''
            price  change  lable
2021-07-01      5     NaN    NaN
2021-07-02      6     1.0    1.0
2021-07-03      3    -3.0   -1.0
2021-07-04      3     0.0    0.0
2021-07-05      6     3.0    1.0
'''
最后用 map 方法映射文本:
label = {0: '平', 1:'涨', -1:'跌'}
(
    df.assign(change=df.price.diff())
    .assign(lable=lambda d: d.change.map(np.sign))
    .assign(lable=lambda d: d.lable.map(label))
)
'''
            price  change lable
2021-07-01      5     NaN   NaN
2021-07-02      6     1.0     涨
2021-07-03      3    -3.0     跌
2021-07-04      3     0.0     平
2021-07-05      6     3.0     涨
'''
另外还可以用替换的办法完成映射:
(
    df.assign(change=df.price.diff())
    .assign(lable=lambda d: d.change.map(np.sign))
    .assign(lable=lambda d: d.lable.replace([-1,0,1], ['跌','平','涨']))
)
这样就完成了需求。
(完)
更新时间:2024-08-18 15:37:49 标签:pandas python 标注