首页 > 编程问答 >绝对差值减去百分比

绝对差值减去百分比

时间:2024-07-21 15:18:51浏览次数:11  
标签:python databricks percentage spark-notebook

我有一个 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() 函数解决了这个问题,这确保了除数始终为正数。

但是,的代码仍然存在一些问题:

  1. 格式化问题: 在循环的最后一行使用 f"{round(diff)}%" 来格式化百分比。这会导致问题,因为 diff 包含实际差异,而不是百分比。 应该使用 percentage 变量而不是 diff 来格式化结果。
  2. 不必要的 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

相关文章