【问题标题】:How can I speed up raw data computation如何加快原始数据计算
【发布时间】:2022-01-03 06:51:45
【问题描述】:

我有根据 x,y,z 作为原始数据的温度。

我想把x,y,z,t的原始数据变成网格数据。

在根据 z 将 t 值应用于 x 和 z 坐标来转换数据时,我创建了一个零数组并将其转换为 pandas 数据框。

之后用for语句改变每个位置的值来处理数据,耗时很长。

在100x100的情况下,for循环重复10000次,耗时16s到20s。 我想要更少的计算时间。

有没有有效的方法来做到这一点?

data = Data_load()

resolution = 100
step = 100 / resolution
zero = np.zeros((100,100))
zero_df = pd.DataFrame(zero)

for x in zero_df.index:
    for y in zero_df.columns:
        data.query('z == 0.25')
        t_data = data.query('{}< x <={} and {} < y <= {}'.format(x, x+step, y, y+step))

        if len(t_data) != 0:
            t = np.sum(t_data['T']) / len(t_data)
            zero_df[x][y] = t
      
print(zero_df)
print(np.max(zero_df))

fig, ax = plt.subplots()

im = ax.imshow(zero_df, cmap='jet',vmin=1000, vmax=2000)

ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('Layer : {}'.format(0.25))
ax.set_ylim(100, 0)
plt.tight_layout()
plt.colorbar(im)
plt.show()

数据示例

             x       y     z    c    a       T
32      16.300  15.501  0.00  0.0  0.0  1652.1
33      16.833  15.501  0.00  0.0  0.0  1750.2
34      17.367  15.501  0.00  0.0  0.0  1719.9
35      17.900  15.501  0.00  0.0  0.0  1714.4
36      18.433  15.501  0.00  0.0  0.0  1706.3
...        ...     ...   ...  ...  ...     ...
238242  84.500  84.500  9.75  0.0  0.0  1449.6
238243  84.500  84.500  9.75  0.0  0.0  1446.7
238244  84.510  84.500  9.75  0.0  0.0  1317.4
238245  84.510  84.500  9.75  0.0  0.0  1251.9
238246  84.510  84.500  9.75  0.0  0.0  1221.5

【问题讨论】:

  • data = Data_load()。请生成可重现的样本数据。
  • 抱歉,添加了我的数据示例

标签: python pandas heatmap


【解决方案1】:

好的,首先我将使用给定的z 创建临时数据集

t_data = data[data['z']==0.25]

然后,我将创建一个新的转换坐标(如果您想要分辨率为 1、0.1、0.01,这很容易):

t_data['x_new'] = t_data['x'].round(0)
t_data['y_new'] = t_data['y'].round(0)

否则,您将不得不创建自己的“圆形”,例如。 https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.KDTree.html

然后我会根据新坐标对数据进行分组并计算新坐标中的平均值。

t_data_gridded = t_data.groupby(('x_new', 'y_new'))['T'].mean().reset_index()

如果不是所有数据点都在您的网格中,您必须将其加入准备好的网格:

from itertools import product
zero_df = pd.DataFrame(list(product(range(0,100,1), range(0,100,1))), columns=('x', 'y'))
zero_df = zero_df.merge(t_data_gridded['x_new', 'y_new', 'T'], 
             left_on=('x', 'y'), 
             right_on=('x_new', 'y_new'), 
             how = "left")

最后,创建旋转矩阵(如果需要):

zero_df.pivot_table(values='T', index='x', columns='y')

这是很多操作,但它应该会快得多(你没有制作循环)。

【讨论】:

  • 谢谢。我认为参考你的代码可以开发出好的代码。
猜你喜欢
  • 2021-12-10
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 2011-03-08
  • 2018-11-28
  • 1970-01-01
  • 2014-03-26
  • 2018-04-22
相关资源
最近更新 更多