PandasTA 源码解析(二十一)(1)

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: PandasTA 源码解析(二十一)

.\pandas-ta\tests\test_indicator_performance.py

# 导入所需的模块和函数
from .config import sample_data
from .context import pandas_ta
# 从 unittest 模块中导入 TestCase 类
from unittest import TestCase
# 从 pandas 模块中导入 Series 类
from pandas import Series
# 定义测试类 TestPerformace,继承自 TestCase 类
class TestPerformace(TestCase):
    # 在所有测试方法执行之前执行的设置方法
    @classmethod
    def setUpClass(cls):
        # 从配置文件中获取示例数据
        cls.data = sample_data
        # 获取示例数据中的 close 列作为测试数据
        cls.close = cls.data["close"]
        # 判断 close 列是否大于其简单移动平均值的 Series 对象,并转换为整数类型
        cls.islong = (cls.close > pandas_ta.sma(cls.close, length=8)).astype(int)
        # 计算 close 列的非累积百分比收益率的 Series 对象
        cls.pctret = pandas_ta.percent_return(cls.close, cumulative=False)
        # 计算 close 列的非累积对数收益率的 Series 对象
        cls.logret = pandas_ta.percent_return(cls.close, cumulative=False)
    # 在所有测试方法执行之后执行的清理方法
    @classmethod
    def tearDownClass(cls):
        # 清理示例数据、close 列、islong 列、pctret 列和 logret 列
        del cls.data
        del cls.close
        del cls.islong
        del cls.pctret
        del cls.logret
    # 设置测试方法前的准备工作,此处不需要执行任何操作,因此留空
    def setUp(self): pass
    # 设置测试方法后的清理工作,此处不需要执行任何操作,因此留空
    def tearDown(self): pass
    # 测试对数收益率计算的方法
    def test_log_return(self):
        # 调用对数收益率计算函数,获取结果
        result = pandas_ta.log_return(self.close)
        # 断言结果类型为 Series 类型
        self.assertIsInstance(result, Series)
        # 断言结果的名称为 "LOGRET_1"
        self.assertEqual(result.name, "LOGRET_1")
    # 测试累积对数收益率计算的方法
    def test_cum_log_return(self):
        # 调用累积对数收益率计算函数,获取结果
        result = pandas_ta.log_return(self.close, cumulative=True)
        # 断言结果类型为 Series 类型
        self.assertIsInstance(result, Series)
        # 断言结果的名称为 "CUMLOGRET_1"
        self.assertEqual(result.name, "CUMLOGRET_1")
    # 测试百分比收益率计算的方法
    def test_percent_return(self):
        # 调用百分比收益率计算函数,获取结果
        result = pandas_ta.percent_return(self.close, cumulative=False)
        # 断言结果类型为 Series 类型
        self.assertIsInstance(result, Series)
        # 断言结果的名称为 "PCTRET_1"
        self.assertEqual(result.name, "PCTRET_1")
    # 测试累积百分比收益率计算的方法
    def test_cum_percent_return(self):
        # 调用累积百分比收益率计算函数,获取结果
        result = pandas_ta.percent_return(self.close, cumulative=True)
        # 断言结果的名称为 "CUMPCTRET_1"
        self.assertEqual(result.name, "CUMPCTRET_1")

.\pandas-ta\tests\test_indicator_statistics.py

# 从.config模块中导入error_analysis,sample_data,CORRELATION,CORRELATION_THRESHOLD,VERBOSE变量
# 从.context模块中导入pandas_ta模块
from .config import error_analysis, sample_data, CORRELATION, CORRELATION_THRESHOLD, VERBOSE
from .context import pandas_ta
# 从unittest模块中导入skip,TestCase类
from unittest import skip, TestCase
# 导入pandas的测试模块
import pandas.testing as pdt
# 从pandas模块中导入DataFrame,Series类
from pandas import DataFrame, Series
# 导入talib库,并重命名为tal
import talib as tal
# 定义测试Statistics类,继承自TestCase类
class TestStatistics(TestCase):
    # 类方法,用于设置测试类的初始状态
    @classmethod
    def setUpClass(cls):
        # 将sample_data赋值给类属性data
        cls.data = sample_data
        # 将data的列名转换为小写
        cls.data.columns = cls.data.columns.str.lower()
        # 分别将open、high、low、close列赋值给对应的类属性
        cls.open = cls.data["open"]
        cls.high = cls.data["high"]
        cls.low = cls.data["low"]
        cls.close = cls.data["close"]
        # 如果data的列中包含volume列,则将volume列赋值给类属性volume
        if "volume" in cls.data.columns:
            cls.volume = cls.data["volume"]
    # 类方法,用于清理测试类的状态
    @classmethod
    def tearDownClass(cls):
        # 删除类属性open、high、low、close
        del cls.open
        del cls.high
        del cls.low
        del cls.close
        # 如果类中有volume属性,则删除volume属性
        if hasattr(cls, "volume"):
            del cls.volume
        # 删除类属性data
        del cls.data
    # 空的setUp方法
    def setUp(self): pass
    # 空的tearDown方法
    def tearDown(self): pass
    # 测试entropy方法
    def test_entropy(self):
        # 调用pandas_ta模块中的entropy方法,计算close列的熵
        result = pandas_ta.entropy(self.close)
        # 断言result的类型为Series
        self.assertIsInstance(result, Series)
        # 断言result的名称为"ENTP_10"
        self.assertEqual(result.name, "ENTP_10")
    # 测试kurtosis方法
    def test_kurtosis(self):
        # 调用pandas_ta模块中的kurtosis方法,计算close列的峰度
        result = pandas_ta.kurtosis(self.close)
        # 断言result的类型为Series
        self.assertIsInstance(result, Series)
        # 断言result的名称为"KURT_30"
        self.assertEqual(result.name, "KURT_30")
    # 测试mad方法
    def test_mad(self):
        # 调用pandas_ta模块中的mad方法,计算close列的绝对平均偏差
        result = pandas_ta.mad(self.close)
        # 断言result的类型为Series
        self.assertIsInstance(result, Series)
        # 断言result的名称为"MAD_30"
        self.assertEqual(result.name, "MAD_30")
    # 测试median方法
    def test_median(self):
        # 调用pandas_ta模块中的median方法,计算close列的中位数
        result = pandas_ta.median(self.close)
        # 断言result的类型为Series
        self.assertIsInstance(result, Series)
        # 断言result的名称为"MEDIAN_30"
        self.assertEqual(result.name, "MEDIAN_30")
    # 测试quantile方法
    def test_quantile(self):
        # 调用pandas_ta模块中的quantile方法,计算close列的分位数
        result = pandas_ta.quantile(self.close)
        # 断言result的类型为Series
        self.assertIsInstance(result, Series)
        # 断言result的名称为"QTL_30_0.5"
        self.assertEqual(result.name, "QTL_30_0.5")
    # 测试skew方法
    def test_skew(self):
        # 调用pandas_ta模块中的skew方法,计算close列的偏度
        result = pandas_ta.skew(self.close)
        # 断言result的类型为Series
        self.assertIsInstance(result, Series)
        # 断言result的名称为"SKEW_30"
        self.assertEqual(result.name, "SKEW_30")
    # 测试stdev方法
    def test_stdev(self):
        # 调用pandas_ta模块中的stdev方法,计算close列的标准差(talib=False)
        result = pandas_ta.stdev(self.close, talib=False)
        # 断言result的类型为Series
        self.assertIsInstance(result, Series)
        # 断言result的名称为"STDEV_30"
        self.assertEqual(result.name, "STDEV_30")
        # 尝试使用tal.STDDEV方法计算close列的标准差
        try:
            # 期望的结果使用tal.STDDEV方法计算
            expected = tal.STDDEV(self.close, 30)
            # 断言result与expected相等,忽略名称检查
            pdt.assert_series_equal(result, expected, check_names=False)
        except AssertionError:
            try:
                # 如果断言失败,计算result与expected之间的相关性
                corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION)
                # 断言相关性大于阈值CORRELATION_THRESHOLD
                self.assertGreater(corr, CORRELATION_THRESHOLD)
            except Exception as ex:
                # 如果出现异常,则调用error_analysis函数,并传递result,CORRELATION,异常信息ex
                error_analysis(result, CORRELATION, ex)
        # 重新调用pandas_ta模块中的stdev方法,计算close列的标准差
        result = pandas_ta.stdev(self.close)
        # 断言result的类型为Series
        self.assertIsInstance(result, Series)
        # 断言result的名称为"STDEV_30"
        self.assertEqual(result.name, "STDEV_30")
    # 测试 TOS_STDEVALL 函数
    def test_tos_sdtevall(self):
        # 调用 TOS_STDEVALL 函数,计算标准差
        result = pandas_ta.tos_stdevall(self.close)
        # 断言结果为 DataFrame 类型
        self.assertIsInstance(result, DataFrame)
        # 断言结果列名为 "TOS_STDEVALL"
        self.assertEqual(result.name, "TOS_STDEVALL")
        # 断言结果列数为 7
        self.assertEqual(len(result.columns), 7)
        # 调用 TOS_STDEVALL 函数,计算长度为 30 的标准差
        result = pandas_ta.tos_stdevall(self.close, length=30)
        # 断言结果为 DataFrame 类型
        self.assertIsInstance(result, DataFrame)
        # 断言结果列名为 "TOS_STDEVALL_30"
        self.assertEqual(result.name, "TOS_STDEVALL_30")
        # 断言结果列数为 7
        self.assertEqual(len(result.columns), 7)
        # 调用 TOS_STDEVALL 函数,计算长度为 30,标准差为 1 和 2 的标准差
        result = pandas_ta.tos_stdevall(self.close, length=30, stds=[1, 2])
        # 断言结果为 DataFrame 类型
        self.assertIsInstance(result, DataFrame)
        # 断言结果列名为 "TOS_STDEVALL_30"
        self.assertEqual(result.name, "TOS_STDEVALL_30")
        # 断言结果列数为 5
        self.assertEqual(len(result.columns), 5)
    # 测试 Variance 函数
    def test_variance(self):
        # 调用 Variance 函数,计算方差
        result = pandas_ta.variance(self.close, talib=False)
        # 断言结果为 Series 类型
        self.assertIsInstance(result, Series)
        # 断言结果列名为 "VAR_30"
        self.assertEqual(result.name, "VAR_30")
        try:
            # 使用 Talib 计算期望结果
            expected = tal.VAR(self.close, 30)
            # 断言结果与期望结果相等
            pdt.assert_series_equal(result, expected, check_names=False)
        except AssertionError:
            try:
                # 计算结果与期望结果的相关性
                corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION)
                # 断言相关性大于阈值
                self.assertGreater(corr, CORRELATION_THRESHOLD)
            except Exception as ex:
                # 分析错误
                error_analysis(result, CORRELATION, ex)
        # 调用 Variance 函数,默认使用 Talib 计算,计算方差
        result = pandas_ta.variance(self.close)
        # 断言结果为 Series 类型
        self.assertIsInstance(result, Series)
        # 断言结果列名为 "VAR_30"
        self.assertEqual(result.name, "VAR_30")
    # 测试 Z-Score 函数
    def test_zscore(self):
        # 调用 Z-Score 函数,计算 Z 分数
        result = pandas_ta.zscore(self.close)
        # 断言结果为 Series 类型
        self.assertIsInstance(result, Series)
        # 断言结果列名为 "ZS_30"
        self.assertEqual(result.name, "ZS_30")


PandasTA 源码解析(二十一)(2)https://developer.aliyun.com/article/1506316

相关文章
|
2月前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
19天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
23天前
|
开发工具
Flutter-AnimatedWidget组件源码解析
Flutter-AnimatedWidget组件源码解析
|
19天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
174 37
|
11天前
|
编解码 开发工具 UED
QT Widgets模块源码解析与实践
【9月更文挑战第20天】Qt Widgets 模块是 Qt 开发中至关重要的部分,提供了丰富的 GUI 组件,如按钮、文本框等,并支持布局管理、事件处理和窗口管理。这些组件基于信号与槽机制,实现灵活交互。通过对源码的解析及实践应用,可深入了解其类结构、布局管理和事件处理机制,掌握创建复杂 UI 界面的方法,提升开发效率和用户体验。
56 12
|
2月前
|
测试技术 Python
python自动化测试中装饰器@ddt与@data源码深入解析
综上所述,使用 `@ddt`和 `@data`可以大大简化写作测试用例的过程,让我们能专注于测试逻辑的本身,而无需编写重复的测试方法。通过讲解了 `@ddt`和 `@data`源码的关键部分,我们可以更深入地理解其背后的工作原理。
30 1
|
2月前
|
开发者 Python
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
72 1
|
2月前
|
开发者 Python
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
128 1
|
2月前
|
NoSQL Redis
redis 6源码解析之 ziplist
redis 6源码解析之 ziplist
25 5
|
2月前
|
算法 安全 Java
深入解析Java多线程:源码级别的分析与实践
深入解析Java多线程:源码级别的分析与实践

推荐镜像

更多
下一篇
无影云桌面