功能异常

2024-04-25 15:18:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我在寻找巴西股市的历史数据,在Bovespa's找到了 网站。 问题是数据的格式很糟糕,它混合了各种各样的数据 任何特定股票的其他信息! 到现在为止,一直都还不错!一个很好的机会来测试我新的python技能(或者我是这么想的)! 我设法用几行代码“组织/解析”了几乎所有的数据, 然后偶然发现了一个关于数据的非常恼人的事实。我所需要的信息,股票价格(开盘,高点,低点,收盘价),没有逗号,格式如下:0000000011200,相当于小数点前的11位数字。 所以基本上0000000011200=11200。。。你明白要点了。。你知道吗

我写了几行代码来编辑它,然后噩梦开始了。 整个数据集大约有358K行长,使用我当前的脚本,数据集就越深 在列表中运行以编辑它每次编辑所需的时间越长。你知道吗

这是我用的代码:

@profile
def dataFix(datas):
    x = 0
    for entry in datas:
        for i in range(9, 16):
            data_org[datas.index(entry)][i] = entry[i][:11]+'.'+entry[i][11:]
        x += 1
        print x

有人介意把这件事说清楚吗?你知道吗


Tags: 数据代码in信息编辑for网站格式
2条回答
datas.index(entry)

这是你的问题。datas.index(entry)要求Python一次遍历datas列表中的一个元素,搜索entry。这是一种非常慢的处理方式,列表越大,速度越慢,甚至不起作用,因为重复的元素总是在它们的第一次出现时被发现,而不是在您正在处理的出现时。你知道吗

如果要使用循环中元素的索引,请使用^{}

for index, entry in enumerate(datas):
    ...

首先,可能更容易将价格直接转换为更有用的格式。 例如,十进制格式允许您在不损失精度的情况下进行简单的计算。 其次,我认为你甚至不需要索引,只需要使用append。 第三,说欢迎列表理解和切片:P

from decimal import Decimal

data_org = []
for entries in datas:
    data_org.append([Decimal(entry).scaleb(-2) for entry in entries[9:16]])

甚至:

data_org = [[Decimal(entry).scaleb(-2) for entry in entries[9:16]] for entries in datas]

或以生成器形式:

data_org = ([Decimal(entry).scaleb(-2) for entry in entries[9:16]] for entries in datas)

或者如果您想保留文本形式:

data_org = [['.'.join((entry[:-2], entry[-2:])) for entry in entries[9:16]] for entries in datas]

(将[:11]替换为[:-2]允许独立于输入大小并从结尾处获得2个小数点)

相关问题 更多 >

    热门问题