python Namedtuple+pandas实现的数据分析工具

class AnalyticTool:

    """数据分析工具类

    使用示例:
        aly = AnalyticTool(
            ("goods_id", "storage"),
            [
                (1, 2),
                (2, 10),
                (2, 500)
            ]
        )
        result = aly.filter("goods_id IN (1, 2, 3) or storage < 600").order_by("goods_id desc, storage").limit(0, 1).all()
        result = aly.filter("col_name.str.contains('diy_string')")

    :param header: 表头
    :param table: 数据行组成的列表
    """

    @staticmethod
    def my_name_tuple(tuplename, filed_list):
        def __setattr__(self, key, value):
            self.__dict__[key] = value

        tuple_class = namedtuple(tuplename, filed_list)
        my_tuple = type(tuplename, (tuple_class,), {"__setattr__": __setattr__})
        return my_tuple

    def __init__(self, header: tuple, table: list):
        self.df = pd.DataFrame(table, columns=header).fillna(0)
        self.Result = self.my_name_tuple("Result", header)

    def sum_columns(self, columns: tuple) -> namedtuple:
        """ 多列求和 """
        Result = self.my_name_tuple("Result", columns)
        return Result._make(self.df[list(columns)].sum())

    def filter(self, sql: str):
        """ 过滤 """
        sql = re.sub(r"[A-Za-z ]+(=)?", lambda mo: mo.group(0).replace("=", "=="), sql)
        self.df.query(sql.lower(), inplace=True)
        return self

    def order_by(self, sql: str):
        """ 根据某列对数据排序 """
        if not sql:
            raise ValueError("必须传入有效条件")
        conditions = sql.split(",")
        by = []
        ascending = []
        for condition in conditions:
            cond = list(filter(None, condition.split(" ")))
            if len(cond) == 1:
                by.append(cond[0])
                ascending.append(True)
            elif len(cond) == 2:
                by.append(cond[0])
                if cond[1] == "asc":
                    ascending.append(True)
                elif cond[1] == "desc":
                    ascending.append(False)
                else:
                    raise ValueError("排序条件语法错误")
            else:
                raise ValueError("排序条件语法错误")

        self.df = self.df.sort_values(by=by, ascending=ascending)
        return self

    def limit(self, offset: int, page_size: int):
        """ 分页 """
        self.df = self.df.iloc[offset : offset + page_size]
        return self

    def distinct(self, col: str) -> set:
        """去除重复项,可以用来做表头筛选

        :param col: 需要进行去重的列
        """
        return {_ for _ in self.df[col].unique() if not np.isnan(_)}

    def count(self) -> int:
        """ 计数 """
        return len(self.df)

    def all(self) -> list:
        """ 获取全部数据 """
        return list(map(self.Result._make, self.df.values))

    def join(self, analytic_obj, how: str = "outer"):
        """在内存中进行 join, 对 pandas merge 方法的封装
        默认为外连接, 主要用来解决 MySQL 不支持 full outer join 语法
        两个对象 join 的时候, 必须确保有同名键

        :param analytic_obj: `AnalyticTool`对象
        :param how: 连接方式, 默认为外连接, 同时支持 inner left right

        :return: `AnalyticTool`对象
        """
        r = self.df.merge(analytic_obj.df, how=how)
        return AnalyticTool(tuple(r.columns), np.array(r))

    def append_column(self, col_name: str, rule: typing.Callable):
        """给DataFrame增加一列

        :param col_name: 新列的名字
        :param rule: 计算规则的函数
        """
        if len(self.df) > 0:
            self.df[col_name] = self.df.apply(rule, axis=1)
        else:
            self.df[col_name] = 0
        return AnalyticTool(tuple(self.df.columns), np.array(self.df))

    def serailize(self, *args, **kwargs):
        """ 序列化结果 """
        raise NotImplementedError

    def group_by(self, *args):
        """
        :params args: 需要分组的列
        注意会把分组求和只会有数字, 字符串会过滤掉
        """
        gdf = self.df.groupby(args).sum().reset_index()
        return self.__class__(tuple(gdf.columns), np.array(gdf))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个Python+pandas+matplotlib的数据分析与可视化案例。 这个案例涉及到一个名为"World Happiness Report"的数据集,该数据集包含了157个国家的幸福指数及其对应的各项因素数据,例如经济、社会、健康等。 首先,我们需要导入相关的库和数据集: ```python import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('world_happiness_report.csv') ``` 接下来,我们可以先看一下数据集的基本信息: ```python print(df.head()) print(df.info()) ``` 然后,我们可以通过绘制柱状图来比较不同国家的幸福指数: ```python plt.figure(figsize=(15, 10)) plt.bar(df['Country'], df['Happiness Score']) plt.xticks(rotation=90) plt.title('World Happiness Report') plt.xlabel('Country') plt.ylabel('Happiness Score') plt.show() ``` 接着,我们可以通过散点图来探究幸福指数与经济因素之间的关系: ```python plt.figure(figsize=(10, 8)) plt.scatter(df['Economy (GDP per Capita)'], df['Happiness Score']) plt.title('Happiness Score vs. GDP per Capita') plt.xlabel('Economy (GDP per Capita)') plt.ylabel('Happiness Score') plt.show() ``` 最后,我们可以通过热图来展示不同因素对幸福指数的影响情况: ```python factors = ['Economy (GDP per Capita)', 'Family', 'Health (Life Expectancy)', 'Freedom', 'Trust (Government Corruption)', 'Generosity'] corr_matrix = df[factors].corr() plt.figure(figsize=(10, 8)) plt.imshow(corr_matrix, cmap='coolwarm', interpolation='none') plt.colorbar() plt.xticks(range(len(factors)), factors, rotation=90) plt.yticks(range(len(factors)), factors) plt.title('Correlation Matrix') plt.show() ``` 以上就是一个简单的Python+pandas+matplotlib数据分析与可视化案例,希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值