在我当前的项目中,我正在对森林资源清查数据进行数据分析,并通过最大似然估计对数据进行统计分布拟合。在
我计算每个所需数据子集的每个数据集的结果,得到估计的分布参数和我需要的其他指标,然后将它们全部存储在pandas数据帧中。在
到目前为止,我在一个大for循环中遍历每个数据子集,然后将结果逐行分配给dataframe。在
我想知道的是,有没有一种更有效的方法?我也不想有太多的数据拷贝,因为我经常有一百万个数据点。在
我已经创建了一个非常简化的例子,其中包含人工数据,没有最大似然估计,但它显示了基本结构
import pandas as pd
import scipy as sp
import numpy.random as sprd
def Gen_UniformDist(seed=5, size=1000000):
""" Create a set of random numbers uniformly distributed between 0 and 1 """
sprd.seed(seed)
return sprd.uniform(size=size)
# Generate some test data
dataSet = Gen_UniformDist()
# Create an array of truncation vales
truncValue_arr = sp.linspace(0., 0.9, 20)
df_Output = pd.DataFrame(index=truncValue_arr, columns=['mean', 'NumObs'])
for i, truncValue in enumerate(truncValue_arr):
# Truncate the data using the truncation value
truncated_DataSet = dataSet[ dataSet >= truncValue]
# In my real code the function here is more complex max likelihood
# rather than simple mean used for simplicity here
mean = sp.mean(truncated_DataSet)
numObs = len(truncated_DataSet)
# Real code would calculate more than 2 values for each row
df_Output.iloc[i] = [mean, numObs]
我想做的是在不使用for循环的情况下高效地填充数据帧,同时避免周围有大量的数据副本。这可能吗?在
您的算法有两个方面可以直接优化:
for
循环替换为列表理解。在iloc
调用不同,构建一个元组列表并直接提供给pd.DataFrame
。在下面是一些伪代码:
可以通过重构每个循环中发生的
^{pr2}$dataSet >= truncValue
进一步优化。考虑以下因素:因此,您可以执行以下操作:
相关问题 更多 >
编程相关推荐