1. 首页
  2. > 税务筹划 >

pandas移动加权平均法(pandas分组计算加权平均数)

Applications of Deep Neural Networks with Keras


基于Keras的深度神经网络应用


著:Jeff Heaton 译:人工智能学术前沿


目录


1.Python基础


2.机器学习Python


3.TensorFlow简介


4.表格类数据的训练


5.正则化和Dropout


6.用于计算机视觉的卷积神经网络


7.生成对抗网络


8.Kaggle数据集


9.迁移学习


10.Keras的时间序列


11.自然语言处理与语音识别


12.强化学习


13.Advanced/Other Topics


14.其他神经网络技术




2.4 Apply 函数和 Map函数

Part 2.4: Apply and Map


如果你以前接触过大数据或函数式编程语言,你可能听说过map/reduce。Map和reduce是将创建的任务应用到数据帧(dataframe)的两个函数。Pandas支持函数式编程技术,允许您跨整个数据帧使用函数。除了您编写的函数外,Pandas还提供了几个用于数据帧的标准函数。


数据帧中Map函数的使用

Using Map with Dataframes


map函数允许您通过将列中的某些值映射到其他值来转换列。考虑Auto MPG数据集,其中包含一个字段origin_name,该字段包含一个介于1到3之间的值,该值指示每一辆汽车的地理来源。我们可以看到如何使用map函数将这个数字原点转换为每个原点的文本名称。
我们将开始加载自动MPG数据集。


import os import pandas as pd import numpy as np df = pd.read_csv( "https://data.heatonresearch.com/data/t81-558/auto-mpg.csv", na_values=[NA, ?]) pd.set_option(display.max_columns, 7) pd.set_option(display.max_rows, 5) display(df)




Pandas中的map方法操作单个列。为map提供一个值字典,用于转换目标列。映射键指定目标列中的哪些值应该转换为这些键指定的值。下面的代码展示了map函数如何将1、2和3的数值转换为北美、欧洲和亚洲的字符串值。Pandas中的map方法操作单个列。为map提供一个值字典,用于转换目标列。映射键指定目标列中的哪些值应该转换为这些键指定的值。下面的代码展示了map函数如何将1、2和3的数值转换为北美、欧洲和亚洲的字符串值。


# Apply the map df[origin_name] = df[origin].map( {1: North America, 2: Europe, 3: Asia}) # Shuffle the data, so that we hopefully see # more regions. df = df.reindex(np.random.permutation(df.index)) # Display pd.set_option(display.max_columns, 7) pd.set_option(display.max_rows, 10) display(df)


数据帧中Apply函数的使用

Using Apply with Dataframes


数据帧的apply函数可以在整个数据帧上运行一个函数。您可以使用传统的命名函数或lambda函数。Python将针对数据帧中的每一行或每一列执行所提供的函数。函数的轴参数指定是跨行或列运行的。对于axis = 1,使用行。下面的代码计算一个称为efficiency 的级数,它是displacement除以horsepower。


efficiency = df.apply(lambda x: x[displacement]/x[horsepower], axis=1) display(efficiency[0:10])

输出


45 2.345455


290 2.471831


313 1.677778


82 1.237113


33 2.320000


249 2.363636


27 1.514286


7 2.046512


302 1.500000


179 1.234694


dtype: float64


现在,您可以将该系列插入到数据框架中,作为新列或替换现有列。下面的代码将这个新系列插入到数据帧中。


df[efficiency] = efficiency



使用Apply和Map函数的特征工程

Feature Engineering with Apply and Map


在本节中,我们将看到如何使用map、apply和分组来计算复杂的特性。数据集为CSV格式:


https://www.irs.gov/pub/irs-soi/16zpallagi.csv




此URL包含美国政府“SOI税收统计-个人所得税统计”的公共数据。该网站的入口点在这里:


https://www.irs.gov/statistics/soi-tax-stats-inpidual-income-tax-statistics-2016-zip-code-data-soi




描述该数据的文档位于上面的链接。
对于这个特性,我们将尝试估计每个邮政编码的调整后总收入(AGI)。数据文件包含许多列;但是,您将只使用以下内容:


STATE - 国家(e.g., MO)


zipcode - 邮编 (e.g. 63017)


agi_stub - 年收入的六个不同等级 (1 through 6)


N1 - 每个agi_stub的纳税申报单的数量




注意,对于agi_stub括号中的每个邮政编码,该文件将有六行。您可以跳过邮政编码0或99999。
我们将用这些列创建一个输出CSV;但是,每个邮政编码只有一行。计算收入等级的加权平均值。例如,63017有以下6行:





我们必须把这六行合并成一行。出于隐私考虑,AGI被分成6个部分。我们需要将这些桶组合起来,并估计一个邮政编码的实际AGI。为此,考虑N1的值:


1 = 1 to 25,000


2 = 25,000 to 50,000


3 = 50,000 to 75,000


4 = 75,000 to 100,000


5 = 100,000 to 200,000


6 = 200,000 or more




这些范围的中位数约为:


1 = 12,500


2 = 37,500


3 = 62,500


4 = 87,500


5 = 112,500


6 = 212,500




使用这个你可以估计63017的平均AGI如下:




>>> totalCount = 4710 2780 2130 2010 5240 3510


>>> totalAGI = 4710 * 12500 2780 * 37500 2130 * 62500 2010 * 87500 5240 * 112500 3510 * 212500


>>> print(totalAGI / totalCount)




88689.89205103042




我们从读取政府数据开始。


import pandas as pd df=pd.read_csv(https://www.irs.gov/pub/irs-soi/16zpallagi.csv)



首先,我们修剪所有邮政编码0或99999。我们还选择了我们需要的三个字段。


df=df.loc[(df[zipcode]!=0) & (df[zipcode]!=99999), [STATE,zipcode,agi_stub,N1]] pd.set_option(display.max_columns, 0) pd.set_option(display.max_rows, 10) display(df)




我们使用map函数将所有agi_stub值替换为正确的中值。


medians = {1:12500,2:37500,3:62500,4:87500,5:112500,6:212500} df[agi_stub]=df.agi_stub.map(medians) pd.set_option(display.max_columns, 0) pd.set_option(display.max_rows, 10) display(df)




接下来,我们将数据帧按邮政编码分组。


groups = df.groupby(by=zipcode)

该程序应用一个lambda在组中应用,然后计算AGI估计。


df = pd.DataFrame(groups.apply( lambda x:sum(x[N1]*x[agi_stub])/sum(x[N1]))) .reset_index()

pd.set_option(display.max_columns, 0) pd.set_option(display.max_rows, 10) display(df)




现在可以重命名新的agi_estimate列。


df.clumns = [zipcode,agi_estimate]

pd.set_option(display.max_columns, 0) pd.set_option(display.max_rows, 10) display(df)




最后,我们检查63017的邮政编码是否得到了正确的值。


df[ df[zipcode]==63017 ]





版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至123456@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息