python用float显示list index out of range_python专题(5)——实证分析小工具

好久没更新 python 专题了,这里介绍一个编写的小应用吧(能力有限,做得有点粗糙),写论文做实证分析用得到。

原 Github 项目地址请点击阅读原文

Introduction

在写论文的时候,我们经常要对各序列做描述性分析,例如下图所示:

7cf501b7d53dc96119c470f530e694e5.png

虽然没有什么技术难度,但是做起来总会有些繁琐,需要一个个汇总统计量,并判断显著性后标星,于是打算做一个统计性描述生成器,使用 pyqt5 生成 GUI 界面。

该工具可以按照你的预想排序各统计量,并自动添加显著性星标。

display

主要包括:

  • 工具栏:导入数据、开始运行、清空、初始化
  • 参数设定
    • date:勾选表示第一列为日期序列,在进行计算统计量时会将其删除;若取消勾选,则不会删除第一列数据
    • 各参数后的空格需要按照顺序,依次填入“1、2、3......",只能填入整数或不填,其他情况程序报错
  • 运行情况说明
7f734ae252802f5bb051da91d7ad0150.png

Usage

在当前路径下的命令行输入:

python main.py

第一步:导入数据

输入成功的话,会有导入成功的提示

第二步:设置顺序

需要从 1 开始,按顺序输入

第三步:开始运行

点击运行即可。

注意:最终结果保存在当前路径下的 output.xlsx 文件中,如需更改路径,需要修改源码

Code

代码主体主要有两部分:

  • func.py:各统计量计算
# -*- coding: utf-8 -*-
"""
Created on Sat Mar 28 12:33:10 2020
update_time:2020-3-28
@author: 经研学长
"""

import pandas as pd
import scipy.stats as stats
import arch.unitroot


class description():
    """
    创建统计性描述类
    """

    def __init__(self, opt, decimal):
        """
        初始化
        :param opt: 统计量顺序列表
        :param decimal: 保留小数点位数
        """
        self.stat = ['均值', '中位数', '众数', '最大值', '最小值', '方差', '标准差',
                     '偏度', '峰度', 'J-B检验量', 'ADF检验', 'PP检验', 'KPSS检验', '样本数', '总和']
        self.opt = opt
        self.decimal = decimal

    def run(self, df, save_path='output.xlsx'):
        """
        串接整个流程:
            1. 计算全部统计量
            2. 按顺序选择对应统计量
            3. 保存为excel数据
        :param df: 待处理数据,为pandas.DataFrame格式
        :param save_path: 保存路径
        """
        output = self.calculate_statistic(df)
        out = self.sorted_statistic(output)
        decimal_str = f'%.{self.decimal}f'
        out.to_excel(save_path, index=list(
            df.columns), float_format=decimal_str)

    def significance_level(self, statistic, p, decimal=3):
        """
        根据p值确定显著水平,并进行标星,其中1%水平为***,5%水平为**,10%水平为*
        :param statistic: 统计量值
        :param p: 统计量p值
        :param decimal: 保留小数点位数
        :return: 统计量标星
        """
        statistic = round(statistic, decimal)
        if p <= 0.01:
            return f'{statistic}***'
        elif p <= 0.05:
            return f'{statistic}**'
        elif p <= 0.1:
            return f'{statistic}*'
        else:
            return str(statistic)

    def calculate_statistic(self, df):
        """
        计算全部统计量
        :param df: 待处理数据
        :return output: 全部统计量
        """
        output = pd.DataFrame(index=self.stat)
        for column in df.columns:
            data = df[column]
            stat_value = [data.mean(), data.median(), data.mode()[0], data.max(
            ), data.min(), data.var(), data.std(), data.skew(), data.kurt()]
            statistic, p = stats.jarque_bera(data)   # JB检验
            stat_value.append(self.significance_level(
                statistic, p, self.decimal))
            a = arch.unitroot.ADF(data)
            stat_value.append(self.significance_level(
                a.stat, a.pvalue, self.decimal))   # ADF检验
            a = arch.unitroot.PhillipsPerron(data)
            stat_value.append(self.significance_level(
                a.stat, a.pvalue, self.decimal))   # PP检验
            a = arch.unitroot.KPSS(data)
            stat_value.append(self.significance_level(
                a.stat, a.pvalue, self.decimal))   # KPSS检验
            stat_value += [len(data), data.sum()]
            output[column] = stat_value
        return output.T

    def sorted_statistic(self, output):
        """
        按顺序选择对应统计量
        :param output: 待处理的全部统计量
        :return: 有顺序的统计量
        """
        opt_stat = []
        [opt_stat.insert(j-1, i)
         for i, j in zip(self.stat, self.opt) if j != 0]
        return output[opt_stat]


def deal_int(data):
    """
    处理GUI界面中各顺序量
    :param data: 顺序数字,列表形式
    :return out: 有则返回对应整数,无则返回0,形成的列表
    """
    out = []
    for i in data:
        try:
            out.append(int(i))
        except:
            out.append(0)
    return out


if __name__ == '__main__':
    opt = list(range(1, 16))
    stat = description(opt, 3)
    df = pd.read_excel(r'C:\Users\Administrator\Desktop\上证指数与沪深300.xlsx')
    df = df.drop(df.columns[0], axis=1)   # 删除第一列日期数据
    stat.run(df)

  • myMainWindow.py:GUI 界面

reference

  • 书籍《Python Qt GUI 与数据可视化编程》
已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页