• 特征工程设计思路


    以前的设计

    面向对象:

    没有用类,不能复用,参数没有封装,要传递多个参数,而且是多次。

    数据处理:

    同一个数据源,加了新的数据源之后要去重,以前去重是依靠每次使用新的数据copy,但是加了新数据源后无法继续,现在是使用专门的去重功能,因为是组合特征,在但分支和合并后都去重。

    特征分类和特征数据的关系:

    以前特征数据复杂,现在特征数据根据数据的列来获取,特征分类和特征数据有映射关系,二者共同循环,统一记录。

    通过类DataProcessor 设计的好处,和不用类比较

    这样设计的好处在于将相关的功能和数据整合到一个类中,提供了更清晰的代码组织结构和更好的可维护性。以下是这种设计的一些好处和与不使用类进行比较的优势:

    1. **模块化和可复用性:**
       - 类封装了数据处理和特征计算的相关方法,使得代码更具模块化,每个方法负责一个特定的功能。这样设计使得方法可以在不同的上下文中被重复使用,提高了代码的可复用性。

    2. **数据封装和管理:**
       - 类将数据对象和处理方法封装在一起,使得数据管理更加简单和有效。可以在类的内部定义私有属性和方法,对外部隐藏实现细节,提高了数据的安全性和保密性。

    3. **代码组织和可读性:**
       - 类可以将相关的方法和属性组织在一起,形成逻辑上的整体。这种结构使得代码更易于阅读、理解和维护,特别是当项目规模较大时。

    4. **可扩展性和灵活性:**
       - 使用类可以方便地扩展和修改功能。可以通过继承和多态等面向对象的特性,实现新的特征计算方法或者修改现有方法的行为,而不会影响到其他部分的代码。

    5. **代码重用和维护:**
       - 类可以将一些通用的功能和方法封装起来,供多个模块或者项目共享使用。这样可以避免重复编写相同的代码,提高了代码的复用性和维护性。

    相比之下,如果不使用类而是直接编写一系列独立的函数,可能会导致以下问题:
    - 数据和功能之间的关联性不够明显,代码结构比较分散,阅读和理解难度增加。
    - 缺乏数据封装和管理机制,可能会导致数据安全性和可靠性问题。
    - 维护性较差,对代码的修改和扩展不够灵活和方便。
    - 可复用性较差,需要重复编写相同或类似功能的代码,增加了工作量和错误风险。

    因此,使用类对于组织和管理数据处理和特征计算等功能有着明显的优势,能够提高代码的质量、可维护性和可扩展性。

    函数之间的关系通过一个流程图来说明:

    这些函数之间的关系可以通过一个流程图来说明,流程图将展示这些函数之间的调用关系和数据流动情况。以下是一个示例流程图:

    1. +-----------------------+ +------------------+
    2. | | | |
    3. | get_df() | | get_vix_df() |
    4. | 获取数据对象 | | 获取VIX数据对象 |
    5. | | | | |
    6. +-----------------------+ +------------------+
    7. | |
    8. V V
    9. +-----------------------+ +------------------+
    10. | | | |
    11. | DataProcessor类初始化 | | DataProcessor类初始化|
    12. | 实例化DataProcessor类 | | 实例化DataProcessor类|
    13. | | | | |
    14. +-----------------------+ +------------------+
    15. | |
    16. V V
    17. +-----------------------+ +------------------+
    18. | | | |
    19. | calculate_features() | | calculate_feature_single_column() |
    20. | 处理多列特征计算结果 | | 处理单列特征计算结果 |
    21. | | | | |
    22. +-----------------------+ +------------------+
    23. | |
    24. V V
    25. +-----------------------+ +------------------+
    26. | | | |
    27. | process_data() | | calculate_typical_ma() |
    28. | 处理数据 | | 计算typical_ma特征 |
    29. | | | | |
    30. +-----------------------+ +------------------+
    31. | |
    32. V V
    33. +-----------------------+ +------------------+
    34. | | | |
    35. | calculate_ma_cross()| | calculate_rsi() |
    36. | 计算移动平均交叉 | | 计算RSI特征 |
    37. | | | | |
    38. +-----------------------+ +------------------+
    39. | |
    40. V V
    41. +-----------------------+ +------------------+
    42. | | | |
    43. | calculate_bollinger_bands()| | calculate_simple_moving_average() |
    44. | 计算布林带特征 | | 计算SMA特征 |
    45. | | | | |
    46. +-----------------------+ +------------------+

    在上面的流程图中,从左侧的"get_df()"和"get_vix_df()"开始,首先获取数据对象和VIX数据对象。然后通过实例化DataProcessor类,调用"calculate_features()"方法处理多列特征计算结果,或者调用"calculate_feature_single_column()"方法处理单列特征计算结果。

    在"calculate_features()"方法中,会调用"process_data()"方法处理数据,然后根据不同的特征计算方法调用相应的计算函数,如"calculate_ma_cross()"、"calculate_rsi()"、"calculate_bollinger_bands()"等。这些计算函数将生成特定的特征计算结果,最终返回给"calculate_features()"方法处理多列特征计算结果。

    整个流程中,数据经过一系列的处理和计算,最终得到多列或单列的特征计算结果。

    多数据源的处理

    当涉及到不同数据源的处理以及数据去重时,通常需要考虑以下几个方面:

    1. **不同数据源的处理**:
       - **数据源加载**:首先需要加载不同的数据源,可能是从不同的文件、数据库或API中获取数据。
       - **数据清洗和预处理**:针对每个数据源,可能需要进行数据清洗、缺失值填充、异常值处理等预处理步骤,以确保数据质量。
       - **数据特征提取**:根据业务需求和分析目的,从每个数据源中提取需要的特征或进行特征工程处理,比如计算移动平均、指数平滑等。

    2. **数据合并和去重**:
       - **数据合并**:如果需要将来自不同数据源的数据合并,可以使用Pandas的合并函数(如`merge`、`concat`)进行操作。合并时需要根据某个共同的键(比如日期、ID等)进行连接。
       - **数据去重**:合并后的数据可能会出现重复的列,需要进行去重操作。可以使用`drop_duplicates`方法删除重复的行,或者通过检查列是否重复来去除重复的列。

    3. **代码示例**:
       下面是一个简单的示例代码,展示了如何处理不同数据源的数据和去重操作:   
     

    1.  import pandas as pd
    2.    # 加载第一个数据源
    3.    df1 = pd.read_csv('data_source1.csv')
    4.    # 数据清洗和预处理
    5.    df1_cleaned = df1.dropna()  # 删除缺失值
    6.    # 特征提取
    7.    df1_features = df1_cleaned[['Date', 'Price', 'Volume']]  # 提取需要的特征
    8.    # 加载第二个数据源
    9.    df2 = pd.read_excel('data_source2.xlsx')
    10.    # 数据清洗和预处理
    11.    df2_cleaned = df2.fillna(method='ffill')  # 使用前向填充填充缺失值
    12.    # 特征提取
    13.    df2_features = df2_cleaned[['Date', 'Close', 'Volume']]
    14.    # 合并两个数据源的数据
    15.    merged_df = pd.merge(df1_features, df2_features, on='Date', how='inner')
    16.    # 数据去重
    17.    merged_df = merged_df.loc[:, ~merged_df.columns.duplicated()]  # 去重列

    这样的代码结构可以有效地处理来自不同数据源的数据,并且在数据合并和去重时能够确保数据的准确性和完整性。

  • 相关阅读:
    MySQL实践——MySQL权限
    浅谈分散式存储项目MEMO
    PTA 7-77 查找指定字符
    托盘四向车货架|海格里斯如何保证托盘四向穿梭车货架系统可以高效运转?
    Spring实现简单的Bean容器
    多功能神器,强劲升级,太极2.x你值得拥有!
    安装VMware和安装虚拟机Linux和网络配置
    用cygwin下载安装ncview(windows 下安装ncview)
    C/C++数据结构之中缀表达式转换为后缀表达式,删除堆栈元素
    GPU cuda cuDNN pytorch理解
  • 原文地址:https://blog.csdn.net/wenxi2367/article/details/138183667