我有一个 DataFrame 来查找 python 中两个源之间的绝对差异百分比。但是当我使用下面的代码时,很少有列给出 -%(负百分比)
我已经检查了显示负百分比数据类型的列在两个源中是否相同。
任何人都可以帮助我找出答案为什么?
# Define the columns you want to process
columns = ['a', 'b', 'c', 'd']
# Create the results DataFrame
results_df = pd.DataFrame()
results_df['date'] = c_df['date']
results_df['id'] = c_df['id']
for col in columns:
# calculating the absolute difference
diff = np.abs(c_df[f'{col}_s1'] - c_df[f'{col}_s2'])
# calculating mean for snowflake columns
norm_diff = abs(c_df[f'{col}_s1'].mean())
# Avoid division by zero
if norm_diff == 0:
percentage = np.zeros(len(diff))
else:
# calculating percentage difference b/w the columns in both datasets
percentage = (diff / norm_diff) * 100
# Round the percentage_difference and add % symbol
results_df[col] = [f"{round(diff)}%" for diff in percentage]
display(results_df)
我为norm_diff添加了abs,它工作正常。
结果是这样的。
a | b | c | d |
---|---|---|---|
0%| ||5% | 10% | -5% | 10% |
100% | -50% | 200% | 200% |
出现负百分比是因为在计算
norm_diff
时
没有
考虑
c_df[f'{col}_s1']
的符号。如果
c_df[f'{col}_s1'].mean()
是负数,那么
norm_diff
也会是负数,从而导致最终百分比为负数。
已通过为
norm_diff
添加
abs()
函数解决了这个问题,这确保了除数始终为正数。
但是,的代码仍然存在一些问题:
-
格式化问题:
在循环的最后一行使用
f"{round(diff)}%"
来格式化百分比。这会导致问题,因为diff
包含实际差异,而不是百分比。 应该使用percentage
变量而不是diff
来格式化结果。 -
不必要的
zeros
数组 : 当norm_diff
为 0 时,创建了一个zeros
数组。 这可能会降低性能,尤其是在处理大型数据集时。 可以在计算百分比之前直接检查norm_diff
是否为 0,并相应地设置百分比。
以下代码修复了上述问题:
import pandas as pd
import numpy as np
# 示例数据
c_df = pd.DataFrame({
'date': ['2023-03-01', '2023-03-02'],
'id': [1, 2],
'a_s1': [10, 20],
'a_s2': [20, 10],
'b_s1': [100, 200],
'b_s2': [200, 100],
'c_s1': [-10, -20],
'c_s2': [-5, -40],
'd_s1': [10, 20],
'd_s2': [20, 40],
})
# 定义要处理的列
columns = ['a', 'b', 'c', 'd']
# 创建结果 DataFrame
results_df = pd.DataFrame()
results_df['date'] = c_df['date']
results_df['id'] = c_df['id']
for col in columns:
# 计算绝对差
diff = np.abs(c_df[f'{col}_s1'] - c_df[f'{col}_s2'])
# 计算 snowflake 列的平均值
norm_diff = abs(c_df[f'{col}_s1'].mean())
# 计算百分比差异
percentage = np.zeros(len(diff)) # 初始化为 0
mask = norm_diff != 0 # 找到 norm_diff 不为 0 的位置
percentage[mask] = (diff[mask] / norm_diff) * 100 # 只在这些位置计算百分比
# 将 percentage_difference 四舍五入并添加 % 符号
results_df[col] = [f"{p:.0f}%" for p in percentage]
print(results_df)
这个代码版本应该能够解决遇到的负百分比问题,并提供更准确的结果。
标签:python,databricks,percentage,spark-notebook From: 78584154