

扩展:有了这个之后,就可以构造Alpha158的因子了, 可以做为深度学习,机器学习的特征值
二.实现
1.核心思想就是用到了eval,将因子字符串表达式 变成可计算的表达式
from datafeed.expr_funcs import *
import pandas as pd
def expr_transform(df, expr):
"""
将表达式中的列名替换为DataFrame列引用的字符串表示。
参数:
df (pd.DataFrame): 包含数据的DataFrame。
expr (str): 需要转换的表达式字符串。
返回:
str: 转换后的表达式字符串,列名被替换为DataFrame列引用的字符串表示。
close/shift(close,5) -1 => df["close"]/shfit(df["close"] -1
"""
# 遍历DataFrame的列名
for col in df.columns:
# 将列名替换为DataFrame列引用的字符串表示
expr = expr.replace(col, 'df["{}"]'.format(col))
return expr
def calc_expr(df: pd.DataFrame, expr: str) -> pd.Series:
"""
计算表达式并返回结果。
参数:
df (pd.DataFrame): 包含数据的DataFrame。
expr (str): 需要计算的表达式字符串。
返回:
pd.Series: 计算结果的Series对象。
"""
# 如果表达式是DataFrame的列名,直接返回该列
if expr in df.columns:
return df[expr]
# 将表达式转换为DataFrame列引用的字符串表示
expr = expr_transform(df, expr)
# 使用eval函数计算表达式
# 注意:使用eval可能会带来安全风险,因为它会执行任何传递给它的代码
# 在实际应用中,你应该确保expr只包含你信任的表达式,或者使用更安全的方法来解析和执行表达式
se = eval(expr)
return se
if __name__ == '__main__':
df = pd.DataFrame({'close': [1, 2, 3, 4, 5]})
expr = 'close/shift(close,1)-1'
result = calc_expr(df, expr)
print(result)
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/268147
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!