优化Python代码Pandas/numpyusag

2024-05-15 00:13:12 发布

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

我有一个python程序需要很长时间才能运行,很可能是因为我使用的是循环,我希望我可以得到一些帮助,在一个部分中使用Pandas或Numpy来加速它。似乎第一个FOR循环可以用熊猫或者纽比来优化。也就是说,我不太熟悉熊猫和纽普瑞的复杂结构来实现这个循环。如有任何帮助,请告诉我,如果有任何问题,谢谢!在

df = data below    
df2 = pandas.DataFrame()

for i in df.index:
    if df.V[i]>1:
        for f in range(0,df.V[i]):
            df2 = df2.append(df.loc[i],ignore_index=True)
    elif df.V[i]==1:
        df2 = df2.append(df.loc[i],ignore_index=True)


df2.V = 1
df2['Grouper']=""


bv=10
y=bv
x=len(df2)


for d in range(0,x,y):
    z = d+y
    df2['Grouper'][d:z]=d


df3 = df2.groupby('Grouper').agg({'Date_Time':'first','L1':'last','H':'max','L2':'min','O':'first'})
df3 = df3.reset_index(drop=True)
df3 = df3[['Date_Time','O','H','L1','L2']]

这是我在这个程序(df)中使用的数据示例:

^{pr2}$

Tags: in程序truedffordateindexrange
1条回答
网友
1楼 · 发布于 2024-05-15 00:13:12

for循环当然非常慢:首先,索引到数据帧中在计算时间上相当昂贵。另外,df.V[i]中的链式索引还有一个小的性能损失;如果改为df.loc[i,'V'],则速度会稍快一些。尽管如此,按索引遍历一个数据帧是非常缓慢的,并且通常可以避免大多数问题(如果您绝对必须这样做,df.iterrows()会给您一个稍微快一点的迭代器)。代码慢的另一个原因是每次调用.append()方法时都会创建一个数据帧的副本,这对于大数据集来说很难处理。对于这个例子,我们可以避免做几乎所有这些。在

{6}我们可以用时间序列的方法来处理时间序列的数据。在

df['v'] = pd.to_datetime(df.V.cumsum()) # assign times to each datapoint; in this case, nanoseconds after the start of Unix time.
r = df.set_index('v').resample('10N') # the 'N' stands for nanoseconds
df3 = r.agg({'Date_Time':'first','L1':'last','H':'max','L2':'min','O':'first'})
df3.interpolate(method = 'zero', inplace = True)
df3.reset_index(drop = True, inplace = True)
to_fix = df3.index[df3.Date_Time.isnull()]
for i in to_fix:
    df3.loc[i,'Date_Time'] = df3.loc[i-1,'Date_Time']

一些评论:

  1. 当你有一个大的V时,需要插值方法 “交叉”聚合句点;参数method='zero'告诉 熊猫只是在它前面一排。但是,它不起作用 对于字符串,因此需要手动替换它们;最好的I 可以想到的是一个for循环,希望不会重复太多次。在
  2. inplace = True参数表示直接修改数据,而不是创建数据帧的修改副本并用它替换旧的副本
  3. .agg()方法允许您在要聚合的对象上使用多个函数,因此如果您想要'min'和{}的{'L':['min','last']}或{},那么可以传递参数{'L':['min','last']}或{}。结果是这会产生一个嵌套的列索引,其中最简单的扁平化方法是直接修改dataframe的.columns属性(但是要注意名称的顺序,因为传递到.agg()方法的字典没有顺序!在

相关问题 更多 >

    热门问题