etl数据处理部分代码优化(一)

文章讲述了代码重构的过程,从原始代码生成特定格式字符串,到第一稿尝试使用dataframe但未成功,再到第二稿的改进但仍有不足,最终稿通过优化筛选和数据处理,确保返回结果与原始代码一致且符合JSON格式。强调了代码优化应保持结果一致、关注细节、提升效率,并提供了相关Python方法的使用示例。
摘要由CSDN通过智能技术生成

原始代码:

def get_indicator_params(self, keys, Indicator):
        indicators = []
        for index, key in enumerate(keys):
            tmp_value = index + 1
            indicators.append(
                json.dumps({"index": tmp_value, "value": key, "text": Indicator[key], "selected": True}, ensure_ascii=False))
        return ",".join(indicators)

返回结果:

'{"index": 1, "value": "APV", "text": "浏览量-全部渠道", "selected": true},{"index": 2, "value": "PPV", "text": "浏览量-PC", "selected": true},{"index": 3, "value": "ApPV", "text": "浏览量-APP", "selected": true},{"index": 4, "value": "MPV", "text": "浏览量-M端", "selected": true},{"index": 5, "value": "WPV", "text": "浏览量-微信", "selected": true},{"index": 6, "value": "QPV", "text": "浏览量-手Q", "selected": true},{"index": 7, "value": "AUV", "text": "访客数-全部渠道", "selected": true},{"index": 8, "value": "PUV", "text": "访客数-PC", "selected": true},{"index": 9, "value": "ApUV", "text": "访客数-APP", "selected": true}'

第一稿:

def get_indicator_params(self, Indicator):
        data = {'value': Indicator.keys(), 'text': Indicator.values(), 'selected': True}
        df = pd.DataFrame(data)
        df.index += 1
        return df

返回结果:

问题:1. 返回结果类型是dataframe与原始代码返回类型不一致

2. dataframe没有做筛选操作,返回数据量不一致

第二稿:

def get_indicator_params1(self, keys, Indicator):
        a = []
        for key in keys:
            a.append(Indicator[key])
        data1 = {'index': list(range(1, len(keys)+1)), 'value': keys, 'text': a, 'selected': True}
        dfdata1 = pd.DataFrame(data1)
        dfdata1["merge"] = "{"+'"index": '+dfdata1["index"].map(str) + ', "value": "' + dfdata1["value"].map(str) + '", "text": "' + dfdata1["text"].map(str)+'", "selected": ' + dfdata1["selected"].map(str)+"}"
        dfdata1drop = dfdata1.drop(['index', 'value', 'text', 'selected'], axis=1)
        todictmergevalueslist = list(dfdata1drop.to_dict()['merge'].values())
        return ",".join(todictmergevalueslist)

返回结果:

'{"index": 1, "value": "APV", "text": "浏览量-全部渠道", "selected": True},{"index": 2, "value": "PPV", "text": "浏览量-PC", "selected": True},{"index": 3, "value": "ApPV", "text": "浏览量-APP", "selected": True},{"index": 4, "value": "MPV", "text": "浏览量-M端", "selected": True},{"index": 5, "value": "WPV", "text": "浏览量-微信", "selected": True},{"index": 6, "value": "QPV", "text": "浏览量-手Q", "selected": True},{"index": 7, "value": "AUV", "text": "访客数-全部渠道", "selected": True},{"index": 8, "value": "PUV", "text": "访客数-PC", "selected": True},{"index": 9, "value": "ApUV", "text": "访客数-APP", "selected": True}'

问题:

  1. dfdata1drop一行没有必要,第九行可以直接用dfdata1

  1. 第九行 写的太烦 思维固化 死板的按照dataframe->dict->str->list步骤写,完全没考虑到可以有更简单的写法。list(dfdata1drop.to_dict()['merge'].values()) <=> list(dfdata1['merge']

  1. 返回的结果不一样。原始结果返回的是小写的true,这里返回的是True.自己完全没关注到这个地方的不一样,导致在其他地方调用此方法request返回500.原因:没有json.dumps()操作,True不符合json格式规范,所以报错。

第三稿(最终稿):

def get_indicator_params1(self, keys, df: pd.DataFrame):
        df = df[df['value'].isin(keys)]
        df.loc[:, 'index'] = list(range(1, len(keys)+1))
        df.loc[:, 'merge'] = df.apply(lambda row: json.dumps({"index": row['index'], "value": row['value'], "text": row['text'], "selected": row['selected']}, ensure_ascii=False), axis=1)
        return ",".join(list(df['merge']))

改进:

  1. 在这个方法之外就做了数据放入dataframe的操作,参数直接引用

  1. 此方法是所有数据的dataframe构建完之后做筛选操作,第二稿是在构建dataframe的时候在data里用for循环做筛选操作,提高了运行效率,代码也更简便了

  1. 做了json.dumps操作,使最后返回的结果符合json格式规范

总结:

  1. 代码优化的首要前提是返回的result一致:数据一致且类型一致,第一稿返回的就是数据量不一样,格式也不一样

  1. 数据处理需要格外仔细,第二稿自己完全没关注到大小写不一样,有一点不一样也会导致结果的偏差

  1. python中命名多使用 '_' ,养成编码习惯

  1. 做开发不仅要实现需求,也要关注代码的简便 清晰 易懂 和 效率

  1. 提升自己的开发水平:多了解python的方法,了解并清楚方法该如何使用 //遇到问题少百度,可以自己尝试通过. 的操作看可以调用哪些方法来解决,只有自己用了这个方法才知道这个方法返回的是什么以及该怎么使用。& 自己尝试在debug里敲代码,尝试,不要怕报错,可以通过学会看报错信息知道自己该如何调整代码。

  1. 后续代码优化步骤:1.看懂原始代码,了解返回的结果,本地测试原始代码中用到的自己不会的方法,看方法源码,了解方法及参数含义然后在本地测试。2.重写方法,此步骤需要做到返回的结果和原始代码返回的结果一致,锻炼自己写代码的逻辑思维,学习独立编程,要有自己的编码习惯。3.优化自己的代码。第二步仅仅做到了实现基本需求,第三步需要着重考虑代码的简洁,清晰,易懂,及开发效率。

此方法优化学习的方法:

  1. enumerate():同时列出数据和数据下标,一般用于for循环中

  1. json.dumps(): 将obj序列化为json格式的str,参数ensure_ascii=False表示返回值可以包含非ASCII字符

  1. join(): 调用字符串插入给定字符串之间,结果作为新字符串返回

  1. 创建dataframe:1.从list创建 2.从ndarrays/lists创建 3. 从dict创建 4. 从series组成的dict创建

  1. dataframe->dict: (1) to_dict() (2)zip() (3)set_index()

  1. dict->str: (1)json.dumps() (2)str()

  1. str->list: (1)ast.literal_eval() (2)list() (3)json.loads()

  1. apply( , axis=1): 把一行数据作为Series的数据 结构传入给自己实现的函数中,在函数中实现对Series不同属性之间的计算,返回一个结果,apply函数 会自动遍历每一行DataFrame的数据,最后将所有结果组合成一个Series数据结构并返回

  1. any()函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值