繁簡切換您正在訪問的是FX168財經網,本網站所提供的內容及信息均遵守中華人民共和國香港特別行政區當地法律法規。

FX168财经网>人物频道>帖子

给DataFrame循环数据操作提提速

作者/asadadsa 2019-06-13 11:16 0 来源: FX168财经网人物频道

先import需要用到的库, 并初始化一个dataframe, 用于测试¶

import pandas as pd
import time

def timmer(func):
    def warpper(*args,**kwargs):
        start_time = time.time()
        func()
        stop_time = time.time()
        print ("the func run time is %s"%(stop_time - start_time))
    return warpper

def add(num):
    return num+2

df = pd.DataFrame(
    columns=['a','b','c','d','e','f'],
    index=['date','value'],
    data=[['1/1/13 0:00','1/1/13 1:00','1/1/13 2:00','1/1/13 3:00','1/1/13 4:00','1/1/13 5:00'],[0.1,0.2,3,4,5,0.6]]
).T
df
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
date value
a 1/1/13 0:00 0.1
b 1/1/13 1:00 0.2
c 1/1/13 2:00 3
d 1/1/13 3:00 4
e 1/1/13 4:00 5
f 1/1/13 5:00 0.6

确认我们使用的pandas版本

pd.__version__
'0.23.4'

先测试了字符串转换成datatime的时间,如文章中所说,加入format的确有帮助,速度提升明显,但是也并没有文中描述那么多,我想应该是pandas版本的差异,所以说还是需要自已动手验证一下啊¶

@timmer
def test_1():
    for x in range(1000):
        df['date'] = df['date'].apply(lambda x:'1/1/13 1:00')     
        df['date'] = pd.to_datetime(df['date'])                 
test_1()

@timmer
def test_2():
    for x in range(1000):
        df['date'] = df['date'].apply(lambda x:'1/1/13 1:00')
        df['date'] = pd.to_datetime(df['date'], format='%d/%m/%y %H:%M')
test_2()
the func run time is 3.329446315765381
the func run time is 2.2600209712982178

再来测试数据改写的速度,在这里我们使用了6种不同的方法:¶

从结果中可以发现, 矢量化test_8和.apply排名靠前, 是最佳选择, itertuples和iterrows排在第2梯队, loc速度最慢排在第3

@timmer
def test_3():
    for x in range(1000):
        for x in df.index:                  
             df.loc[x, 'value'] = df.loc[x, 'value'] + 0.002
@timmer
def test_4():
    for x in range(1000):
        for index,row in df.iterrows():                             
            row['value'] = row['value'] + 0.002
@timmer
def test_5():
    for x in range(1000):
        for index,date,value in df.itertuples():                       
            value = value + 0.002
@timmer
def test_6():
    for x in range(1000):
        df['value'] = df['value'].apply(add)    
@timmer
def test_7():
    for x in range(1000):
        df['value'] = df['value'].apply(lambda x:x+2)        
@timmer
def test_8():
    for x in range(1000):
        df['value']+=0.002      
        
test_3()
test_4()
test_5()
test_6()
test_7()
test_8()
the func run time is 5.793862819671631
the func run time is 1.096304178237915
the func run time is 0.9203734397888184
the func run time is 0.5614016056060791
the func run time is 0.5276052951812744
the func run time is 0.534296989440918

不仅了解了几种常用的数据操作方法,也找出了更优的方案¶

分享到:
举报财经168客户端下载

全部回复

0/140

投稿 您想发表你的观点和看法?

更多人气分析师

  • 金算盘

    人气2696文章7761粉丝124

    高级分析师,混过名校,厮杀于股市和期货、证券市场多年,专注...

  • 李冉晴

    人气2296文章3821粉丝34

    李冉晴,专业现贷实盘分析师。

  • 张迎妤

    人气1896文章3305粉丝34

    个人专注于行情技术分析,消息面解读剖析,给予您第一时间方向...

  • 指导老师

    人气1856文章4423粉丝52

    暂无个人简介信息

  • 梁孟梵

    人气2152文章3177粉丝39

    qq:2294906466 了解群指导添加微信mfmacd

  • 刘钥钥1

    人气2016文章3119粉丝34

    专业从事现货黄金、现货白银模似实盘操作分析指导

  • 张亦巧

    人气2144文章4145粉丝45

    暂无个人简介信息

  • 金帝财神

    人气4720文章8329粉丝118

    本文由资深分析师金帝财神微信:934295330,指导黄金,白银,...

  • 金泰铬J

    人气2320文章3925粉丝51

    投资问答解咨询金泰铬V/信tgtg67即可获取每日的实时资讯、行情...