我正在尝试计算大规模数据上的成对比例,其中每一列都是像这样的单独样本(这是一个小例子):
0 1 2
0 34.04 56.55 49.65
1 35.86 49.28 42.36
2 11.21 33.96 18.11
3 12.40 23.17 16.28
4 1087.51 93.37 166.75
5 494.39 182.15 893.23
6 11018.44 6044.63 17347.33
7 20.48 38.01 92.82
8 14866.34 9034.35 19625.89
9 21932.70 12289.75 43752.48
10 8561.40 3279.36 8717.61
11 1050.82 1302.27 1951.25
12 978.03 202.63 179.67
13 15.22 28.82 22.21
14 42.94 40.77 84.22
15 231.05 66.02 220.13
16 69.01 57.45 85.20
17 309.21 88.90 1394.35
18 13957.93 8632.00 35660.11
因此,对于每一列,我想分别获得一个系列,其中包含第一个值除以第二个值的结果,然后第一个值除以第三个值的结果,依此类推(仅在前几行上计算):
0 1 2
0 0.949 1.147 1.02
1 3.03 1.665 2.74
2 2.74 2.44 3.04
3 0.031 0.6 0.29
我正在使用 dask,这就是我到目前为止所做的:
def create_dask(df):
delayed_computations = []
# Convert each column to a Dask Series and then create a Dask DataFrame
for column_name in df.columns:
dask_series = dd.from_pandas(df[column_name],
npartitions=1) #keep each column in one partition
computation = dask_series.map_partitions(lambda df: calculate_ratios(df),
meta=pd.Series([], dtype='float64'))
delayed_computations.append(computation)
return dask_results
def calculate_ratios(data):
# Calculate pairwise ratios for each value in the column
file_len = 19
ratios = []
for i in range(file_len - 1):
ratio_values = data.iloc[i] / data.iloc[i + 1:]
ratios.append(ratio_values)
return dd.concat(ratios, axis=1, ignore_index=True)
if __name__ == '__main__':
df_lung = pd.read_excel(os.path.join(base_path, 'raw_data_49_lung_cluster90 - Copy.xls'))
dask_lung = create_dask(df_lung)
我的问题是,我似乎无法计算并查看“计算”的结果或之后的任何 dask 结构,我可以计算 dask_series 并查看我的数据,但之后需要很长时间来计算()任何东西否则,我不知道我的“calculate_ratios”功能是否真的有效,为什么会发生这种情况以及如何修复它?
谢谢!
您的
create_dask
函数不会返回任何内容,因此 dask_lung = create_dask(df_lung)
将返回 None
。在 calculate_ratios
中,您正在使用 dd.concat
,但您应该使用 pd.concat
,因为您正在 calculate_ratios
中开发 Pandas 系列。另外,您使用的 axis=1
对于系列来说是不正确的。应该是axis=0
。
另一件事是,您要循环访问 calculate_ratios
中的数据,这对于大数据来说可能效率低下。
变量file_len
被硬编码为19,这使得函数不太灵活。
import dask.dataframe as dd
import pandas as pd
import os
def create_dask(df):
delayed_computations = []
for column_name in df.columns:
dask_series = dd.from_pandas(df[column_name], npartitions=1)
computation = dask_series.map_partitions(lambda df: calculate_ratios(df),
meta=pd.Series([], dtype='float64'))
delayed_computations.append(computation)
return dd.concat(delayed_computations, axis=1)
def calculate_ratios(data):
ratios = []
file_len = len(data)
for i in range(file_len - 1):
ratio_values = data.iloc[i] / data.iloc[i + 1:]
ratios.append(ratio_values)
return pd.concat(ratios, axis=0, ignore_index=True)
if __name__ == '__main__':
base_path = 'your_base_path_here'
df_lung = pd.read_excel(os.path.join(base_path, 'raw_data_49_lung_cluster90 - Copy.xls'))
dask_lung = create_dask(df_lung)
computed_result = dask_lung.compute()
print(computed_result)