精华内容
下载资源
问答
  • 该库使构建频率变得容易,并简化了DataFrame中缺失值的简单汇总。 我发现它在开始对新数据集进行数据探索时是一个有用的工具,我希望其他人也发现它也有用。该项目也是说明如何使用pandas新API注册自定义...
    6af95a7533e38900aa91877c24eab281.png
    c08f9fc2e860a8cb18a3d8eab58cd369.png

    介绍

    今天,我很高兴地宣布发布一个名为sidetable的新pandas实用程序库。 该库使构建频率表变得容易,并简化了DataFrame中缺失值的简单汇总。 我发现它在开始对新数据集进行数据探索时是一个有用的工具,我希望其他人也发现它也有用。

    该项目也是说明如何使用pandas新API注册自定义DataFrame访问器的机会。 此API允许您构建用于处理pandas DataFrames和Series的自定义函数,并且对于构建自己的自定义pandas访问器函数库可能非常有用。

    sidetable

    sidetable 的核心是带有一些交叉表(crosstab)的pandas的 value_counts的超级版本。例如,让我们看一下“学校改善补助金”的一些数据,以便我们了解sidetable 如何帮助我们探索新的数据集和 找出进行更复杂分析的方法。

    唯一的外部依赖关系是 pandas 版本> = 1.0。 确保已安装,然后安装sidetable:

    python -m pip install sidetable

    一旦安装了sidetable,您需要将其导入以注册pandas访问器。

    import pandas as pdimport sidetabledf = pd.read_csv('https://github.com/chris1610/pbpython/blob/master/data/school_transform.csv?raw=True', index_col=0)
    49de9cb5f65d546ae50d76a587262aec.png

    现在已经导入了sidetable ,您在所有DataFrame上都有一个新的访问器-stb,可用于构建汇总表。 例如,我们可以使用.stb.freq()来构建频率表,以显示各州包括多少所学校,以及其总数和百分比:

    df.stb.freq(['State'])
    68bbfefc11418e8b59b01967b1ec8017.png

    此示例表明,CA发生了92次,占学校总数的12.15%。 如果将FL包括在内,则您现在共有163所学校,占总数的21.5%。

    从0.6版开始,sidetable 可以正确显示百分比。 此处显示的示例是比例而不是百分比。 较新的版本会将结果乘以100-这是表示百分比的正确方法。 sidetable 的最新版本也将小写标题用作列名。 鼓励用户使用最新版本。

    我们比较一下,value_counts(normalize = True).stb.freq()

    789bcd75d00d2dd63346977b35e1b75d.png
    6b226821212b814f3e84a2daf840a7d1.png

    我想您会同意sidetable 无需花费更多精力即可提供更多数据汇总。

    但是,等等,还有更多!

    如果我们想快速查看占总数约50%的州怎么办? 使用thresh参数将所有其余部分归为“其他”类别:

    df.stb.freq(['State'], thresh=.5)
    d207cecd8aa0ab58ee922604ce9b8b5a.png

    这很方便。 现在我们可以看到,有8个州几乎贡献了总数的50%,其他所有州则占了剩余的份额。

    如果需要,我们可以使用other_label重命名catch-all类别

    df.stb.freq(['State'], thresh=.5, other_label='Rest of states')

    sidetable 的有用功能之一是可以将列分组在一起以进一步了解分布。 例如,如果我们想看看如何将各种“转换模型”(Transformation Models)应用到整个地区,该怎么办?

    df.stb.freq(['Region', 'Model Selected'])
    d13483c1f85920407ef9858a63febada.png

    此视图是了解各种数据元素的交互和分布的快速方法。 我发现这是一种探索数据并获得可能需要进一步分析的见解的简便方法。 这样的表也很容易与他人共享,因为它相对容易理解。

    您绝对可以使用标准pandas (毕竟是幕后所有东西)执行此分析。 但是,记住代码很麻烦。 我的经验是,如果很难记住,那么您这样做的可能性就较小。 simpletable试图使这种类型的摘要非常容易实现。

    到目前为止,我们一直在计算实例数。 可能更有趣的是按Award Amount查看总细分。 sidetable 允许您传递可以求和的value列(而不是对出现的次数进行计数)。

    df.stb.freq(['Region'], value='Award_Amount')
    07274679cd176a25e3fb9b9765f4b4e9.png

    这种观点使我们了解到,东北地区在这些项目上花费的资金最少,而且总支出中的37%用于了南部地区的学校。

    最后,我们可以查看所选模型的类型并确定分配的美元的80/20细分:

    df.stb.freq(['Region', 'Model Selected'],             value='Award_Amount', thresh=.82,             other_label='Remaining')
    7ef6f10ebf2c70ce28a29d903cb2173f.png

    如果您熟悉pandas crosstab,那么查看sidetable的一种方法是,它是crosstab的扩展版本,具有一些方便的功能,可以更轻松地查看数据:

    e3bc48da3b3931dd748a5fd98d21dd4b.png
    3d2b05f106c65f7ad1a7ae8e6af796ae.png

    sidetable的目标之一是其输出易于解释。 如果您想利用 pandas style 熊猫样式的函数来格式化输出以提高可读性,则sidetable可以将Percentage和Amount列格式化为更具可读性。 默认情况下不使用它,但是可以通过将style = True传递给函数来看到:

    df.stb.freq(['Region'], value='Award_Amount', style=True)
    7c7007dd04f7ba9253d5588514471a3a.png

    到目前为止,我只展示了freq函数,但是为了展示如何向库中添加其他函数,下面是构建简单缺失值表的示例:

    df.stb.missing()
    acb312f6451c9437dc4021f08d1165ff.png

    在此表中,“Region”列中有10个缺失值,占该列总值的1.3%略少。

    您可以使用df.info()获得类似的信息,但是在快速识别缺失值时,我发现此表更易于解释:

    8ff87cdea2ccc91a1be449f689b4ab90.png

    该文档显示了有关用法和其他选项的更多信息。 请检查一下,让我知道它是否对您有用。

    我要做的一件事就是感谢三个人对sidetable 所做的贡献。

    Peter Baumgartner - 对于sidetable 的原始灵感(For the original inspiration in this tweet thread)Steve Miller - 对于说明频率分布价值的文章(For an article that illustrates the value of looking at frequency distribution article)Ted Petrou - 发表了sidetable,展示了如何在DataFrame中计算空值(Made this post showing how to count null values in a DataFrame.)

    最后,missing这个功能并不意味着可以替代出色的missingno模块。 sidetable 中包含的实现是一个快速的摘要版本,在missingno中未包含任何有用的可视化。

    pandas访问器API简介

    如果您想学习如何构建自己的访问器,则实际上相对简单。 作为参考,您可以在此处查看完成所有工作的文件。

    以下是有关入门的简短摘要。 在文件顶部,导入熊猫以访问装饰器:

    import pandas as pd@pd.api.extensions.register_dataframe_accessor("stb")class SideTableAccessor:    def __init__(self, pandas_obj):        self._validate(pandas_obj)        self._obj = pandas_obj

    这部分代码创建访问器类并定义我选择为stb的访问器值。 一旦安装到位,任何时候导入包含此代码的python模块,您都将获得访问器的注册,并在所有DataFrame上可用。

    当实例化该类时,将通过_validate()方法验证当前的熊猫DataFrame,然后在随后的函数中使用self._obj引用该DataFrame。

    在这种情况下,我对validate方法的工作并不多,但是您可以选择添加更多逻辑:

    @staticmethoddef _validate(obj):    # verify this is a DataFrame    if not isinstance(obj, pd.DataFrame):        raise AttributeError("Must be a pandas DataFrame")

    所有工作都在freq and missing函数中完成。 在大多数情况下,这都是标准的pandas 代码。 您只需要确保返回有效的DataFrame。

    例如,这里是本文撰写时missing功能的完整版本:

    def missing(self, clip_0=False, style=False):    """ Build table of missing data in each column.        clip_0 (bool):     In cases where 0 counts are generated, remove them from the list        style (bool):     Apply a pandas style to format percentages    Returns:        DataFrame with each Column including total Missing Values, Percent Missing        and Total rows    """    missing = pd.concat([self._obj.isna().sum(),                         self._obj.isna().mean()],                        axis='columns').rename(columns={                            0: 'Missing',                            1: 'Percent'                        })    missing['Total'] = len(self._obj)    if clip_0:        missing = missing[missing['Missing'] > 0]    results = missing[['Missing', 'Total',                       'Percent']].sort_values(by=['Missing'],                                               ascending=False)    if style:        format_dict = {'Percent': '{:.2%}', 'Total': '{0:,.0f}'}        return results.style.format(format_dict)    else:        return results

    在您的“normal”pandas 代码中,您将使用df引用DataFrame,但是在这里,使用self._obj作为DataFrame来执行串联和排序。

    我认为这是构建您自己的熊猫函数自定义样式的非常有用的方法。 如果您要进行某些转换,清除或汇总数据,则可以考虑采用这种方法-而不是仅在文件之间复制和粘贴代码。

    摘要

    Pandas具有非常丰富的API,但有时可能需要大量的输入和拼写才能以易于理解的格式获取数据。 sidetable 可以通过在数据组合上建立频率表并确定数据中的差距来简化其中的一些摘要任务。

    sidetable 不会取代您可能需要做的任何复杂分析来回答复杂问题。 但是,它是一种方便的工具,可用于快速分析数据并确定您可能需要进一步调查的模式。

    另外,我希望sidetable 作为如何构建自己的Pandas访问器的示例,以简化常规分析过程。

    我希望sidetable 对您有所帮助。 如果您有改进或错误报告的想法,请转到github并告诉我。 我希望它可以随着时间的流逝而发展,并成为对许多其他人有用的有用工具。 我很好奇社区对此有何看法。

    展开全文
  • 交叉汇总分析,又称列联分析,是通过分析两个或两个以上变量之间的联合分布特征,来了解这些变量之间相互影响关系的一种统计分析技术。一般情况下,我们将某一变量分组后作为行,用其它变量或变量的组合作为列,...

    【摘要】

          交叉汇总作为数据统计的一种分类统计计算,用 MongoDB 实现比较困难,但可以利用集算器 SPL 语言来进行辅助实现。若想了解更多,请前往乾学院:协助 MongoDB 计算之交叉汇总!

     

           交叉汇总是数据统计中一种实用的分类统计计算。交叉汇总分析,又称列联表分析,是通过分析两个或两个以上变量之间的联合分布特征,来了解这些变量之间相互影响关系的一种统计分析技术。一般情况下,我们将某一变量分组后作为行,用其它变量或变量的组合作为列,形成数据库表进行统计分析。例如下面的表结构:

        成绩
    学校 学科 1 2 3 4 5
    A Sub1 人数 人数
    Sub2 人数      
    B Sub1 人数        
    Sub2 人数        

    如果将学科、成绩合并,则可进一步演化为:

      学科 - 成绩
    学校 sub1-1 sub1-2 sub1-5 sub2-1
    A 人数        
    B 人数          

           用 MongoDB 能够比较清晰、自然地存储类似的数据,但要实现交叉汇总却比较困难。如果将数据取出,用 Java 等其它高级语言来汇总的话,也相当复杂。对于这种情况,我们可以利用集算器 SPL 语言辅助 MongoDB,完美实现交叉汇总的功能,下面用例子说明。

           Student集合记录了学校、学生名称、学科及成绩,样例数据如下:
           db.student.insert  ({school:'school1', sname : 'Sean' , sub1: 4, sub2 :5})
           db.student.insert  ({school:'school1', sname : 'chris' , sub1: 4, sub2 :3})
           db.student.insert  ({school:'school1', sname : 'becky' , sub1: 5, sub2 :4})
           db.student.insert  ({school:'school1', sname : 'sam' , sub1: 5, sub2 :4})
           db.student.insert  ({school:'school2', sname : 'dustin' , sub1: 2, sub2 :2})
           db.student.insert  ({school:'school2', sname : 'greg' , sub1: 3, sub2 :4})
           db.student.insert  ({school:'school2', sname : 'peter' , sub1: 5, sub2 :1})
           db.student.insert  ({school:'school2', sname : 'brad' , sub1: 2, sub2 :2})
           db.student.insert  ({school:'school2', sname : 'liz' , sub1: 3, sub2 :null})

           希望能够统计出如下的交叉表:每行一个学校,第一列是sub1成绩为5的人数,第二列是sub1成绩为4的人数,以此类推。

    a_103png

    使用集算器SPL的代码如下:

      A
    1 =mongo_open("mongodb://localhost:27017/local?user=test&password=test")
    2 =mongo_shell(A1,"student.find()").fetch()
    3 =A2.group(school)
    4 =A3.new(school:school,~.align@a(5,sub1).(~.len()):sub1,~.align@a(5,sub2).(~.len()):sub2)
    5 =A4.new(school,sub1(5):sub1-5,sub1(4):sub1-4,sub1(3):sub1-3,sub1(2):sub1-2,sub1(1):sub1-1,sub2(5):sub2-5,sub2(4):sub2-4,sub2(3):sub2-3,sub2(2):sub2-2,sub2(1):sub2-1)
    6 =mongo_close(A1)

    A1: 连接MongoDB数据库,ip和端口号是localhost:27017,数据库是test,用户名和密码都是test。

    A2: 使用find函数从MongoDB中取出集合student,形成游标。SPL游标能够分批读取和处理数据,可以避免数据量过大,以防内存溢出因为数据量不大,所以这里可以直接 fetch 出游标的所有记录

    A3:首先按照学校分组。

    a_100png

     

    A4:分组之后,align函数实现每组内部按照[1,2,3,4,5]的序列对齐分组,再通过len函数求出每一个对齐分组序列的长度。

    a_101png

     

    A5:对A4的长度数按学科与成绩组合成列放入相应的位置,生成结果排列。

    结果如下:

    a_102png

    A6: 关闭mongodb连接。

           简言之,SPL 先得到分组数据,用函数 align() 按成绩分组,再得到每组数量,最后按需求进行显示就行了。这样,借助 SPL 语言实现交叉汇总功能, 对 MongoDB 的用户来说就再也不是一件令人头痛的事了。

           需要说明的是:集算器SPL并不包含mongodb的java驱动包。如果要用SPL访问mongodb,必须提前将mongodb的java驱动包(例如:mongo-java-driver-3.9.1.jar)放到集算器设置的外部库目录extLib\MongoCli下。

           除了在集算器中直接计算,上述使用SPL语言协助mongodb计算的脚本也很容易集成到java中,只要增加一行,写成return A5即可向java输出resultset形式的结果,具体的代码参考SPL教程。同样,用java调用SPL访问mongodb也必须将mongdb的java驱动包放到java程序的classpath中。

    展开全文
  • 利用Ureport2定义如下交叉报表: 现在希望在第一行的4和5之间以及7和51之间做分段汇总。 希望形式如下: 步骤一: 按要求做如上报表,其中D列和F列公式与B列一致。 步骤二: B1列定义如上...

    利用Ureport2定义如下交叉报表:

    现在希望在第一行的4和5之间以及7和51之间做分段汇总。

    希望形式如下:

     

     

     

     

    步骤一:

    按要求做如上报表,其中D列和F列公式与B列一致。

    步骤二:

    B1列定义如上过滤条件

    同理D1和F1分别定义过滤条件为:

    步骤三:

    D2格子设置左父格为A2。

    同理:F2的左父格也设为A2

    步骤四:

    C2填入表达式sum(B2),并设置左父格为A2

    同理E2设置如下:

    G2设置如下:

    步骤五:

    C列、E列、G列分别选择指定底色。

    预览后效果为:

     

    按上述处理即完成了交叉表的分段汇总展示。

     

    展开全文
  • 编号性别家庭地区月生活费月衣物支出买衣服因素1男大城市800200价格2女小城市600180品牌3男中城市500110样式4男小城市900140...1.选择插入-数据透视,点击确定则会出现如下的数据透视的初始状况。2.分别将右边的...

    编号性别家庭地区月生活费月衣物支出买衣服因素
    1大城市800200价格
    2小城市600180品牌
    3中城市500110样式
    4小城市900140价格
    5中城市500200样式
    6大城市600360品牌
    7大城市1100650皮牌
    8小城市6000200价格
    9中城市700410样式
    注意:数据源的首行必须有列标题。

    1.选择插入-数据透视表,点击确定


    则会出现如下的数据透视表的初始状况。


    2.分别将右边的“性别”、“买衣服因素”字段拖入右下角的下,“家庭地区”字段拖入下,“平均生活费拖入月”下。即可得出结果。

    4.删除数据透视表

        如果一开始创建透视图跟透视表的时候选择新表格,那直接删掉这个新表格就可以删除了

        如果一开始创建透视图跟透视表的时候选择使用现有表格,删除透视表的时候记得不要点中透视表的单元格,而是从透视表点一个单元格,左键拉取包含透视表的区域。选中区域后右键删除,选第一项 “右键单元格上移”即可。

    展开全文
  • 交叉分组表交叉分组是一种常用的分类汇总表格,可以显示多变量之间的关系。其表格形式的行和列标签为一个或多个变量。举个例子,下面数据为300家饭店的质量等级和餐价:300家饭店质量等级和餐价(部分)在该数据中...
  • 【摘要】 交叉汇总作为数据统计的一种分类统计计算,用 MongoDB ...交叉汇总分析,又称列联分析,是通过分析两个或两个以上变量之间的联合分布特征,来了解这些变量之间相互影响关系的一种统计分析技术。一般情况...
  • RS交叉表自动汇总后百分比列显示错误之解决方案 可以说在从事Cognos开发的过程中,仅仅对数据展现而言,大多数用户使用最多的工具便是Report Studio了,此工具可以帮助我们快速的构建一些可供用户自主...
  • 交叉表

    千次阅读 2012-11-16 00:15:08
    交叉表(Cross Tabulations)是一种常用的分类汇总表格。使用交叉表查询,显示源于中某个字段的汇总值,并将它们分组,其中一组列在数据的左侧,另一组列在数据的上部。行和列的交叉处可以对数据进行多种汇总...
  • 交叉分组表交叉分组是一种常用的分类汇总表格,可以显示多变量之间的关系。其表格形式的行和列标签为一个或多个变量。举个例子,下面数据为300家饭店的质量等级和餐价:300家饭店质量等级和餐价(部分)在该数据中,...
  • 交叉表是一种常用的分类汇总查询。使用交叉表查询,可以显示中某个字段的汇总值,并将它们分组,其中一组列在数据的左侧,另一组列在数据的上部。行和列的交叉处可以对数据进行多种汇总计算,如:求和、平均值...
  • 一、VBA中transform函数基本语法:Creates a crosstab query. Syntax TRANSFORM aggfunction selectstatement PIVOT pivotfield [IN ...The TRANSFORM statement has these parts:二、我们有”sales”交叉汇总到”
  • 透视交叉表

    千次阅读 2019-03-28 13:37:49
    透视交叉表透视表交叉表 透视 透视(pivot table)是常见的数据汇总工具,它根据一个或多个键对数据进行聚合,根据行和列上的分组键将数据分配到矩形区域中。pandas中使用pivot_table方法创建透视, ...
  • Pandas透视交叉表

    2019-03-01 09:50:55
    个人理解:透视表和交叉表都是可分组汇总表,透视表可以求平均值,求和等等,交叉表是透视表的一种,是计算分组频数的 参考:《利用Python进行数据分析》 透视表 pivot_table的参数 交叉表crosstab 总结 透视表 ...
  • 透视图和交叉表在数据分析中,数据透视是常见的工具之一,需要根据行或列对数据进行各个维度数据的汇总,在pandas中,提供了相关函数解决此类问题透视图相关函数pivot_table(data,index,colums,values,aggfunc,...
  • 交叉表和透视

    2019-08-02 21:11:00
    利用Python实现数据透视交叉表 1、透视 pivot table 透视(pivot table)是常见的数据汇总工具,它根据一个或多个键对数据进行聚合,根据行和列上的分组键将数据分配到矩形区域中。pandas中使用pivot_table...
  • 个人主页:http://office-access.cn公众号:DataMapHuanyuAccess使用技术2:使用交叉表查询向导进行每日汇总Access交叉表查询可以合并每日的量,日汇总功能对于大量数据统计是很有帮助的,Excel很难胜任。...
  • SQL交叉表

    2019-09-21 10:54:49
    之前做货品横向展示时,有看到评论说用到交叉表。 公司最近需要给订单做一个数据汇总的功能,同事给到一个参考SQL select * from (select COUNT(1) as 已锁定 from tbl_order where orderLock = 1) as A,(select...
  • <!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 494
精华内容 197
关键字:

交叉汇总表