如何解决如何迭代同一列的前几行的结果?
从包含 A B D P 列的数据框开始:
import numba
import numpy as np
import pandas as pd
import vaex
d = {'A':[0,1,2,3,4,5,6],'B':[30,35,32,31,39,37],'D':[12,10,13,19,12,21,13],'P':[3,3]}
df = pd.DataFrame(data=d)
df['C'] = 0
df
导出到 hdf5:
df.to_csv("v_df",index=False)
df = vaex.from_csv("v_df",convert=True,chunk_size=5_000_000)
我需要计算每一行的“C”列,得到所需的结果,如下所示:
'C': [0,1.666666667,0.552380952,2.333630952,0.962202381,6.38155722,5.714890553]
为了达到这个结果,我需要从第 (1) 行开始迭代每一行并计算如下:
%%time
@numba.njit
def func(B,D,C,b_0=0):
n = len(B)
b = np.full(n,b_0,dtype=np.float64)
for i in range(1,n):
b[i] = ((((B[i] - B[i - 1]) / B[i - 1])) * D[i]) + C[i-1]
return b
df['C'] = func(df['B'].to_numpy(),df['D'].to_numpy(),df['C'].to_numpy())
df
但它不起作用。
第一行和第二行结果正常:
'C': [0,-1.114286,1.781250,-1.371429,5.419355,-0.666667]
我已经尝试过“转变”(sammywemmy 的建议)。对于'vaex.from_csv'之前的这个示例数据框,它可以正常工作,但是当通过 vaex 将概念实施到大数据框时,shift 不起作用。
因此,问题是:是否有一种“良好实践”的方法来执行此演算(考虑到 'C' 中的前几行,迭代列 'C' 中的一行的结果)与大数据源 (I´ m 使用 vaex 从 100 万行 csv 导入)?
提前致谢。
解决方法
我不确定它是否是最佳解决方案,但至少它是有效的:您可以使用 apply 方法并将 vectorize
设置为 True
。
这是完整的片段:
import numba
import numpy as np
import pandas as pd
import vaex
d = {'A':[0,1,2,3,4,5,6],'B':[30,35,32,31,39,37],'D':[12,10,13,19,12,21,13],'P':[3,3]}
df = pd.DataFrame(data=d)
df['C'] = 0
df
# I removed the b_0 for simplicity
def my_func(B,D,C):
n = len(B)
b = np.full(n,dtype=np.float64)
for i in range(1,n):
b[i] = ((((B[i] - B[i - 1]) / B[i - 1])) * D[i]) + C[i-1]
return b
df_vaex = vaex.from_pandas(df)
df_vaex.apply(my_func,arguments=[df_vaex["B"],df_vaex["D"],df_vaex["C"]],vectorize=True)
它给出了预期的输出:
0 0
1 1.66667
2 -1.11429
3 1.78125
4 -1.37143
5 5.41935
6 -0.666667
基本上,apply
方法允许逐行应用函数,如果您将 vectorize
设置为 True
,将传递完整数组而不是行值。在您的情况下,它是强制性的,因为您需要前几行的值来计算给定行中的 C 值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。