看过来
《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 标注