Python计算累积频率——Origin绘制累积频率图

一、累计频率的定义

关于频率的定义参考:

复制代码
https://statorials.org/cn/%E7%B4%AF%E7%A7%AF%E9%A2%91%E7%8E%87/

二、计算累积频率-Python代码

复制代码
import collections

def calculate_frequencies_with_reverse_cumulative():
    # 定义文件名
    input_file = "2020-Perimeter.txt"
    
    # 生成输出文件名:原始文件名-Reverse-Frequency.txt
    if input_file.endswith('.txt'):
        output_file = input_file.replace('.txt', '-Reverse-Frequency.txt')
    else:
        output_file = input_file + '-Reverse-Frequency.txt'
    
    # 读取文件
    with open(input_file, 'r', encoding='utf-8') as f:
        lines = f.readlines()
    
    # 获取表头
    header = lines[0].strip()
    
    # 读取数据(跳过表头)
    data = [line.strip() for line in lines[1:] if line.strip()]
    
    # 计算频率
    freq_counter = collections.Counter(data)
    total_count = len(data)
    
    # 按值排序(数值或字母顺序)
    try:
        sorted_items = sorted(freq_counter.items(), key=lambda x: float(x[0]))
    except ValueError:
        sorted_items = sorted(freq_counter.items())
    
    # 计算正向累计频率
    results = []
    cum_abs = 0
    cum_rel = 0.0
    
    for value, count in sorted_items:
        cum_abs += count
        rel_freq = count / total_count
        cum_rel += rel_freq
        
        results.append({
            'value': value,
            'abs_freq': count,
            'cum_abs_freq': cum_abs,
            'rel_freq': rel_freq,
            'cum_rel_freq': cum_rel
        })
    
    # 计算反向累计频率(从最大值向最小值累计)
    rev_cum_abs = 0
    rev_cum_rel = 0.0
    
    # 反向遍历结果列表
    for i in range(len(results)-1, -1, -1):
        rev_cum_abs += results[i]['abs_freq']
        rev_cum_rel += results[i]['rel_freq']
        results[i]['rev_cum_abs_freq'] = rev_cum_abs
        results[i]['rev_cum_rel_freq'] = rev_cum_rel
    
    # 写入结果文件
    with open(output_file, 'w', encoding='utf-8') as f:
        f.write("值,绝对频率,累计绝对频率,反累计绝对频率,相对频率,累计相对频率,反累计相对频率\n")
        
        for result in results:
            f.write(f"{result['value']},{result['abs_freq']},{result['cum_abs_freq']},{result['rev_cum_abs_freq']},"
                   f"{result['rel_freq']:.4f},{result['cum_rel_freq']:.4f},{result['rev_cum_rel_freq']:.4f}\n")
    
    # 打印摘要信息
    print("="*80)
    print("频率统计摘要(包含反累计频率)")
    print("="*80)
    print(f"输入文件: {input_file}")
    print(f"输出文件: {output_file}")
    print(f"表头名称: {header}")
    print(f"总数据行数: {total_count}")
    print(f"不同值的数量: {len(sorted_items)}")
    print("-"*80)
    
    # 显示前几行结果
    print("\n前5行统计结果:")
    print("-"*80)
    print(f"{'值':<10} {'绝对频率':<10} {'累计绝对频率':<12} {'反累计绝对频率':<12} {'相对频率':<10} {'累计相对频率':<12} {'反累计相对频率':<12}")
    print("-"*80)
    
    for result in results[:5]:
        print(f"{result['value']:<10} {result['abs_freq']:<10} {result['cum_abs_freq']:<12} "
              f"{result['rev_cum_abs_freq']:<12} {result['rel_freq']:<10.4f} {result['cum_rel_freq']:<12.4f} "
              f"{result['rev_cum_rel_freq']:<12.4f}")
    
    if len(results) > 5:
        print(f"... 还有 {len(results) - 5} 行数据")
    
    print("\n" + "="*80)
    print("所有频率统计结果已保存到文件:", output_file)
    print("="*80)

# 执行函数
if __name__ == "__main__":
    calculate_frequencies_with_reverse_cumulative()

三、输出形式

复制代码
================================================================================
频率统计摘要(包含反累计频率)
================================================================================
输入文件: 2020-Perimeter.txt
输出文件: 2020-Perimeter-Reverse-Frequency.txt
表头名称: perimeter
总数据行数: 6634
不同值的数量: 6634
--------------------------------------------------------------------------------

前5行统计结果:
--------------------------------------------------------------------------------
值          绝对频率       累计绝对频率       反累计绝对频率      相对频率       累计相对频率       反累计相对频率
--------------------------------------------------------------------------------
10.73133702           1          1            6634         0.0002     0.0002       1.0000
30.65792608           1          2            6633         0.0002     0.0003       0.9998
31.21799034           1          3            6632         0.0002     0.0005       0.9997
31.75747989           1          4            6631         0.0002     0.0006       0.9995
31.82466565           1          5            6630         0.0002     0.0008       0.9994
... 还有 6629 行数据

================================================================================
所有频率统计结果已保存到文件: 2020-Perimeter-Reverse-Frequency.txt
================================================================================

四、Origin绘制累计频率曲线图





这样就差不多做好了。

接下来给他稍微修改一下就行。

就好了。

相关推荐
狗都不学爬虫_14 小时前
JS逆向 - 最新版某某安全中心滑块验证(wasm设备指纹)
javascript·爬虫·python·网络爬虫·wasm
阿杰 AJie14 小时前
Lambda 表达式大全
开发语言·windows·python
格鸰爱童话14 小时前
python基础总结
开发语言·python
tjjucheng14 小时前
小程序定制开发哪家有成功案例
python
先做个垃圾出来………15 小时前
Python try-except-else 语句详解
开发语言·python
PwnGuo15 小时前
Android逆向:在 Unidbg 中解决 native 函数内调用 Java 方法的报错
android·java·python
devnullcoffee15 小时前
2026年Amazon Listing优化完全指南:COSMO算法与Rufus AI技术解析
人工智能·python·算法·亚马逊运营·amazon listing·cosmo算法·rufus ai技术
python机器学习ML15 小时前
机器学习——16种模型(基础+集成学习)+多角度SHAP高级可视化+Streamlit交互式应用+RFE特征选择+Optuna+完整项目
人工智能·python·机器学习·分类·数据挖掘·scikit-learn·集成学习
Java程序员威哥15 小时前
Java应用容器化最佳实践:Docker镜像构建+K8s滚动更新(生产级完整模板+避坑指南)
java·开发语言·后端·python·docker·kubernetes·c#
资深设备全生命周期管理15 小时前
【实时显示画面在视频上,捕获轮廓】
python