python高效使用方法03_pandas中的rolling.mean滚动求均值效率究竟如何?

news2024/9/17 8:29:33

在这里插入图片描述
先上图来说明pandas.rolling(n).mean()滚动求均值的方法效率其实并不是最高的,我自己尝试使用cython把滚动求均值的方法重新编译了一下,发现效率总体上是pandas的三倍以上。
总结:pandas比较合适用于普通的研究分析工作,如果用到追求高效率的生产环境中,需要考虑要不要改写具体的函数。

代码:
效率对比代码:

import numpy as np
import pandas as pd
import time
from pyecharts import options as opts
from pyecharts.charts import Bar
from cal_rolling_mean_by_cython import cal_rolling_mean_by_cython

# n_rows = 100
# n_times = 1000
# np.random.seed(1)
# df = pd.DataFrame({i: np.random.randn(n_rows) for i in ['open', 'high', 'low', 'close', 'volume']})
# df['ma_1'] = df['close'].rolling(20).mean()
# df['ma_2'] = cal_rolling_mean_by_cython(df['close'].to_numpy(), 20)
# df = df.dropna()
# a = list(df['ma_1'])
# b = list(df['ma_2'])
# if not a[0] == b[0]:
#     print(a[0], b[0])
#     print(df[['ma_1', 'ma_2']])
# assert list(df['ma_1']) == list(df['ma_2'])
# 经过验证,发现数据精度存在不同,在无数位小数点之后,存在不一样的情况,如0.22949341595210063= 0.22949341595210065

def test_func_time(n_rows, n_times=1000):
    df = pd.DataFrame({i: np.random.randn(n_rows) for i in ['open', 'high', 'low', 'close', 'volume']})
    # 测试np.where的效率
    begin_time = time.perf_counter()
    for i in range(n_times):
        df['ma_1'] = df['close'].rolling(20).mean()
    end_time = time.perf_counter()
    consume_time_where = end_time - begin_time
    print(f"rolling.mean耗费的时间:{consume_time_where}")
    # 测试np.select的效率
    begin_time = time.perf_counter()
    for i in range(n_times):
        df['ma_2'] = cal_rolling_mean_by_cython(df['close'].to_numpy(), 20)
    end_time = time.perf_counter()
    consume_time_select = end_time - begin_time
    print(f"cal_rolling_mean_by_cythont耗费的时间:{consume_time_select}")
    # assert df['ma_1'].equals(df['ma_2']), "检查错误"
    return [consume_time_where, consume_time_select]


if __name__ == '__main__':
    r1 = test_func_time(n_rows=1000)
    r2 = test_func_time(n_rows=100000)
    r3 = test_func_time(n_rows=10000000)
    c = (
        Bar()
            .add_xaxis(["1千行", "十万行", "一千万行"])
            .add_yaxis("rolling_mean_by_pandas", [r1[0], r2[0], r3[0]])
            .add_yaxis("cal_rolling_mean_by_cython", [r1[1], r2[1], r3[1]])
            .reversal_axis()
            .set_series_opts(label_opts=opts.LabelOpts(position="right"))
            .set_global_opts(title_opts=opts.TitleOpts(title="耗费时间对比"))
            #.render("d:/result/夏普率耗费时间对比.html")
            .render("./rolling_mean_by_pandas和cal_rolling_mean_by_cython耗费时间对比.html")
    )

计算滚动平均的cython代码文件:cal.pyx

#cython: language_level=3
#distutils:language=c
#cython: c_string_type=unicode, c_string_encoding=utf8

import numpy as np
from numpy import NaN as nan
cimport numpy as np
cimport cython

@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(False)
cpdef cal_rolling_mean_by_cython(np.ndarray[np.double_t, ndim=1] arr,int look_back_days):
    cdef int data_len = arr.shape[0]
    cdef np.ndarray[np.double_t, ndim=1] result = np.empty(data_len)
    cdef int i
    cdef int j
    cdef double sum=0.0
    for i in range(look_back_days-1):
        result[i] = nan
    for i in range(look_back_days-1, data_len):
        sum = 0.0
        for j in range(i-look_back_days+1,i+1):
             sum += arr[j]
        result[i] = sum/look_back_days
    return result

#def

setup.py

from setuptools import setup, Extension
from Cython.Build import cythonize
import numpy as np
import sys


ext = Extension(
    "cal_rolling_mean_by_cython", sources=["cal.pyx"],
    include_dirs=[np.get_include()],
    language='c'
)

setup(name="cal_rolling_mean_by_cython", ext_modules=cythonize([ext]))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/660562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AcWing802:详解

原题引出 题解分析 首先毫无置疑的是本体需要用到离散化的知识,将输入的索引下标放到一个vector当中存起来,在该vector当中,利用其本身的索引我们对称构造两个数组a和s(用于求前缀和)。那么最关键的一个问题就是如何通…

NodeJS Socket编程⑩③

文章目录 ✨文章有误请指正,如果觉得对你有用,请点三连一波,蟹蟹支持😘前言Socket编程1、WebSocket VS HTTP请求2、浏览器支持3、WebSocket Practice4、WebSocket 授权验证5、SocketIO模块 🗡 Express~WebSokcetIOServ…

Java中不支持多重继承原因

在 Java 中回答这种棘手问题的关键是准备好相关主题, 以应对后续的各种可能的问题。 这是非常经典的问题,与为什么 String 在 Java 中是不可变的很类似; 这两个问题之间的相似之处在于它们主要是由 Java 创作者的设计决策使然。 为什么Java不支持类多重继承, 可以考…

UML基本图例

UML基本图例 软件流程和UML基本图例软件流程:下面是九种常用的UML图:1.用例图(UseCase Diagrams)2.类图(Class Diagram)3.对象图(Object Diagrams)4.状态图(Statechart D…

6道常见hadoop面试题

Q1.什么是Hadoop?   Hadoop是一个开源软件框架,用于存储大量数据,并发处理/查询在具有多个商用硬件(即低成本硬件)节点的集群上的那些数据。总之,Hadoop包括以下内容:   HDFS(Ha…

Chiplet技术概览

一、概览 chiplet技术顺应了芯片生产与集成技术发展的趋势,也开拓了半导体技术发展的新的发展方向,将创造出一种新的芯片设计和商业模式 1.1 芯片生产与集成技术发展的趋势 (1)低半径高带宽的物理连线(bandwidth / memory wall…

打开win10“启动”文件夹的2种方式

方式1:通过CMD命令 1.输入代码 按WinR键打开运行窗口,输入“shell:Common Startup”代码。 2.点击确定 点击下面的确定按钮,运行代码。 3.打开文件夹 弹出文件夹即为系统启动文件夹。 方式2:输入路径 1.打开文件管理器 打…

【城市开发者职业成长交流 - 重庆】加强交流,共创成长:重庆程序员的线下交流会总结

周五睡觉前,我把窗帘拉的严严实实,所有的闹钟全部取消,甚至另外一只电话直接关机掉,为的是第二天可以好好的躺到自然醒,我其实也不知道具体的几点,就感觉连上被踩!无奈的睁开眼睛,看…

基于WEB的院校课程管理系统设计与实现(论文+源码)_kaic

摘要 课程管理是学校管理工作的核心,是最为繁琐也最容易出错的工作,开发和 应用课程管理系统能够让课程管理工作人员从繁琐的工作中解脱出来,提高课程 管理的工作效率[1],实现课程管理的信息化。虽然目前高职院校应用的课程管理系…

bigdata.com《大数据计算框架》样题

容量单位从小到大的顺序依次为:TB、PB、EB、ZB。 . 用于设置环境变量的文件是 .bash_profile . 将HDFS文件下载到本地的命令是 hadoop fs -get。 . 不需要Java环境的支持是 MySQL . 通配符是用于模糊匹配的特殊字符,可以在关键字查询中使用。在MySQL…

助你面试一臂之力,认识银行测试

我们知道软件测试是为了保证软件的质量和可靠性而在新软件系统上线之前对软件进行的质量检测工作。通过软件测试这个过程找出软件中的错误,分析错误的产生原因和容易产生错误的区域,进而有针对性的设计测试方法提高软件测试的效率。 以上简单讲述了一下…

k8s 之网络组件-Calico(十九)

下载资源 :安装 kubernetes 网络组件-Calico 一,简介 Calico是Kubernetes生态系统中另一种流行的网络选择。虽然Flannel被公认为是最简单的选择,但Calico以其性能、灵活性而闻名。Calico的功能更为全面,不仅提供主机和pod之间的网…

【深入浅出密码学】离散对数

群相关知识点 离散对数相关 ## 蛮力搜索 对于解决 α x β \alpha^{x} \beta αxβ,我们不断地选取合适地 x x x,计算 a x a^x ax,直到找到满足这个等式的 x x x,时间复杂度 O ( ∣ G ∣ ) O(|G|) O(∣G∣). Baby-Step Giant-Step 对于解决 α x β…

卡尔曼滤波器使用一维与二维以及代码编写

注:要视频学习可以去B站搜索“DR_CAN”讲解的卡尔曼滤波器,深有体会! 链接: 1、【学习心得|基于卡尔曼滤波的MPU6050姿态解算】https://www.bilibili.com/video/BV1sL411F7fu?p2&vd_source3d0b47bb7325b7b3a156ba92207bbd6…

【人工智能】— 神经网络、M-P 神经元模型、激活函数、神经网络结构、学习网络参数、代价定义、总代价

【人工智能】— 神经网络 神经网络的历史Neural Network IntroM-P 神经元模型激活函数(Activation function)神经网络结构举例训练神经网络学习网络参数代价定义均方误差交叉熵(Cross Entropy) 总代价 神经网络的历史 第一阶段 ⚫ 1943年, McCulloch和Pi…

AES入门 万字详解(附推荐论文和研究领域)

目录 前言 加密过程 SubBytes(字节替换) ShiftRows(行移位) MixColumns(列混淆) AddRoundKey(轮密钥加) 轮密钥生成过程 概述 具体步骤 代码实现方式 Java Java Cryptog…

Build your own unconditional confidence

不要活在既定的社会价值体系中 人类的偏好大多数时候都是愚昧的 I play whatever gods give me 情绪价值稳定 解决问题的能力 Dont label yourself 真正的强者不会吝啬对他人的赞美 敬畏自然,敬畏未知事物 核心是你对这个事情是否感兴趣,觉得有价…

Java-三种基本控制结构及相关面试题

文章目录 前言一、 顺序控制结构1.1 概念1.2 代码1.3 NS图中体现 二、分支控制结构2.1 概念2.2 if语句2.3 switch语句2.4 NS图中的体现 三、循环控制结构3.1 概念3.2 for循环3.3 while循环3.4 do-while循环3.5 增强 for 循环NS图中的体现 四、相关面试题什么是控制流语句&#…

springboot解析@transaction注解原理

目录 第一步、全局搜索Transactional.class 第二步、查看哪里配置BeanFactoryTransactionAttributeSourceAdvisor 第四、SpringTransactionAnnotationParser是什么时候被注入的 第三、总结 先看一下transaction的官网文档 16. Transaction Management 第一步、全局搜索Tr…

Ansible-playbook-roles安装lnmp

使用roles安装lnmp 1、准备四台主机 192.168.142.10 192.168.142.20 192.168.142.30 192.168.142.40 2、10作为ansible管理端 首先ssh连接剩下三台主机 3、vim/etc/ansible/hosts 添加[nginxservers]配置nginx ip,[phpservers]php ip,[mysqlservers]mysql ip 4、cd /etc/ansibl…