一款很厉害的数据处理软件——受R语言支持 gnumetric


shiyiyyy
Yayoi拾一 2022-10-08 10:07:50 66088
分类专栏: 资讯
Gnumeric是一款免费开源的电子表格处理软件,能运行于windowslinux系统,是GNONE的一部分
自由软件:Gnu数字报表软件及其源代码均是自由使用的,并遵循GNU通用公共许可证(GPL)协议。[Tips:自由软件是一类由自由软件基金会定义,并受GPL约束的软件。]
          快速生成:Gnu数字报表启动快速,并且同时处理大量报表保持效能。
          准确应答:一个报表就应该具备计算准确的功能。这些研究(有链接说明哪些研究,但是无法访问)和研究人员(有链接介绍研究人员是谁,但是无法访问)表明Gun数字报表内置的函数和工具准确无误。
Gnumetric的大致操作和excel类似不同的是可以实现更多更为强大的功能来处理时数据 Gnumeric除实现了MSExcel所有的函数外,还实现了60多个Excel中不存在的函数和基本的金融方面函数,并已经具备了高级统计分析、可扩展的随机数产生器、线性或非线性求解的计算能力并且有以下四种特色功能
1、支持行列数自定义扩展。
2、基于hash的设计,效率较高。
3、与R语言的开发社区合作,提高计算精度。
4、支持多语言,包括中文
更神奇的是 可以在gnumetric源代码中直接编写算法实现函数,在这里python函数和c函数不做过多解释,我们只关注算法的实现,大致为以下三个步骤在这里
1. 创建Python函数源文件,如py_func.py
2. 根据创建的函数构建函数原型字典,如test_functions
3. 创建plugin.xml配置文件,配置文件名、函数分类、名字、原型字典等相关信息
在这里 由于我的专业知识有限 于是从网上搜到了一段代码给大家参考学习:
首先创建脚本文件exam.py,整个文件只有mark和cstr两个函数:mark函数的参数和返回值都是字符串,功能是根据其大小返回成绩的等级;cstr用来把字符串转换成utf-8编码,使Gnumeric能显示中文 (2) 。mark函数中的注释是提供给Gnumeric的函数信息,读者开发时只需要按着模板简单的修改就可以了。
代码 4 exam.py文件
  
1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
22
  
23
  
24
  
25
  
26
  
27
  
28
  
29
  
-*- coding: GB2312 -*-
  
def mark(score):
  
  '@FUNCTION=MARK_SCORE\n'\
  
  '@SYNTAX=mark_score(score)\n'\
  
  '@DESCRIPTION= determine  the level for a score\n'\
  
  '@EXAMPLES= To determine a  score in A1: \n'\
  
  '  mark_score(a1)\n'\
  
  '@SEEALSO='
  
  level='N/A'
  
  if score < 0:
  
    level = cstr('非法分数')
  
  elif score < 60:
  
    level = cstr('未及格')
  
  elif score < 80:
  
    level = cstr('及格')
  
  elif score < 90:
  
    level = cstr('良')
  
  elif score <= 100:
  
    level = cstr('优秀')
  
  else:
  
    level = cstr('非法分数')
  
  return level
  
def cstr(str):
  
  """  translate a chinese string into utf-8 string for GTK+
  
  """
  
  return unicode(str,'gbk').encode('utf8')
  
exam_functions = {
  
  'mark_score' : ('f','score',mark)
  
}
下一步就是就是注册函数,exam.py文件尾处的exam_functions函数原型字典向Gnumeric揭示了mark函数的原型信息,字典的键'mark_score'是mark在Gnumeric的名字映射,f表示参数类型为整数,score为参数名。plugin.xml (3) 是根据模板简单的改写的,主要注意的就是上面提到的几个属性,必须和插件对应,否则插件是无效的;另外一些属性,如category也加入了中文信息,以方便使用。
代码 5 exam.py的plugin.xml配置文件
  
1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
22
  
23
  
24
  
25
  
26
  
<?xml version="1.0" encoding="UTF-8"?>
  
<plugin  id="Gnumeric_PyFunc">
  
<information>
  
  <name>Exam  functions</name>
  
  <description> Determine  rank for exam score </description>
  
  <require_explicit_enabling/>
  
</information>
  
<loader  type="Gnumeric_PythonLoader:python">
  
  <attribute  value="exam" name="module_name"/>
  
</loader>
  
<services>
  
  <service  type="function_group" id=
  
     
  
    "exam">
  
   <category>
  
     
  
    Exam</category>
  
   <category  xml:lang="zh_CN">Exam</category>
  
   <functions>
  
    <function  name=
  
     
  
    "mark_score"/>
  
   </functions>
  
  </service>
  
</services>
  
</plugin>OK!现在启动Gnumeric (4) ,按图示在A列输入一列成绩,然后在B1单元格内输入公式:'=mark_score(A1)', 然后利用鼠标拖动复制公式的功能,把公式复制到对应的B列,就会发现所有标志在B列中已经自动生成了。
插图1 成绩分类
更进一步
如果只是对单元格数据简单计算的话,那么Python在Gnumeric中充其量是好玩的玩具罢了,但Python插件的功能远不只这些,Python可以控制读写单元格区域(Range)的数据,访问Gnumeric的全部函数,控制工作表的创建等,把这些功能有机地组合起来就能完成复杂的任务了。本节对全班成绩做进一步的处理,利用RPy (5) 的summary函数对所有的分数进行简单的统计,计算最值、均值、中位数和两个四分位数,并把所得计算结果打印到新的工作表中。
要想统计全班成绩,首要的任务就是从Gnumeric获取数据。对于大批量的数据,Gnumeric是用单元格区域(Range)来表示的,然而在调用过程中传递给Python的是单元格区域引用(RangeRef),所以需要对单元格区域引用(RangeRef)做相应的转换以便提取批量数据。不幸的是,Gnumeric的API正处于发展阶段,没有直接的转换方法。为此,笔者利用了Gnumeric自身的函数构建了一个PyGnmRange类。PyGnmRange对象以单元格区域引用(RangeRef)为初始化参数,为该单元格区域中的构建所有单元格的索引,即"_table"属性,同时提供几个方法来方便地访问,这样我们就可以配合Gnumeric模块中的Sheet对象操纵单元格数据了。
代码 6 类PyGnmRange的定义
  
1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
22
  
23
  
24
  
25
  
26
  
27
  
28
  class PyGnmRange:
  
def __init__(self, gnm_range_ref):
  
  get_cols = Gnumeric.functions['column']
  
  get_rows = Gnumeric.functions['row']
  
  get_col_num = Gnumeric.functions['columns']
  
  get_row_num = Gnumeric.functions['rows']
  
  cols = get_cols(gnm_range_ref)
  
  rows = get_rows(gnm_range_ref)
  
   column first table
  
  self._table = []
  
  self._col_num = get_col_num(gnm_range_ref)
  
  self._row_num = get_row_num(gnm_range_ref)
  
  for i in range(self._col_num):
  
    for j in range(self._row_num):
  
      self._table.append((cols[j]-1,  rows[j]-1))
  
def col_num(self):
  
  return self._col_num
  
def row_num(self):
  
  return self._row_num
  
def get_col(self,col):
  
  start = (col-1) * self._row_num
  
  end = col * self._row_num
  
  return self._table[start:end]
  
def get_row(self,row):
  
  indexes = [(i*self._row_num)+(row-1) for i in range(self._col_num)]
  
  return [self._table for i in indexes]
  
def __iter__(self):
  
  return iter(self._table)
另外PyGnmRange类定义需要注意两点:
1. 单元格下标采取了列优先的表示方法,从零开始计数,例如B3表示为(1,2),这样同时也是为了与Gnumeric规范保持一致,便于操纵单元格数据。
2. 类初始化函数使用了四个Gnumeric的函数,分别为column、columns、row、rows,其功能如下:
file:///C:/Users/21408/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif
有了前面的准备,我们就可以具体实现summary函数了。summary函数通过gnm_scores参数获得当前的单元格区域引用,并利用该参数创建PyGnmRange对象,计算所有单元格的下标;又通过Gnumeric模块的workbooks和sheets函数,取得工作表1的对象;从而结合工作表对象和单元格下标来操作单元格数据。而真正的计算R语言完成的,RPy模块则是联接Python和R语言的桥梁 (6) 。最后,summary函数取得R语言计算的结果并通过Gnumeric模块将其打印到一个新建的工作表里。
代码 7 exam.py 中summary函数定义
   
  
1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
<?xml version="1.0" encoding="UTF-8"?>
  
<plugin  id="Gnumeric_PyFunc">
  
<information>
  
  <name>Exam  functions</name>
  
  <description>Sample  Python plugin providing some (useless) functions.</description>
  
  <require_explicit_enabling/>
  
</information>
  
<loader  type="Gnumeric_PythonLoader:python">
  
  <attribute  value="exam" name="module_name"/>
  
</loader>
  
<services>
  
  <service  type="function_group" id="exam">
  
   <category>Exam</category>
  
   <category  xml:lang="zh_CN">Exam</category>
  
   <functions>
  
<function  name="mark_score"/>
  
<function  name="summerize_scores"/>
  
   </functions>
  
  </service>
  
</services>
  
</plugin>
函数编写完之后就是函数注册了,函数原型字典只有一行,唯一需要注意的是,单元格区域引用数据类型需要用"r"来表示。plugin.xml文件也只需要加入下面一行:
代码 8 summay函数的plugin.xml配置文件
  
1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
<?xml version="1.0" encoding="UTF-8"?>
  
<plugin  id="Gnumeric_PyFunc">
  
<information>
  
  <name>Exam  functions</name>
  
  <description>Sample  Python plugin providing some (useless) functions.</description>
  
  <require_explicit_enabling/>
  
</information>
  
<loader  type="Gnumeric_PythonLoader:python">
  
  <attribute  value="exam" name="module_name"/>
  
</loader>
  
<services>
  
  <service  type="function_group" id="exam">
  
   <category>Exam</category>
  
   <category  xml:lang="zh_CN">Exam</category>
  
   <functions>
  
<function  name="mark_score"/>
  
<function  name="summerize_scores"/>
  
   </functions>
  
  </service>
  
</services>
  
</plugin>
下面的两张是插件函数的运行效果图,输入数据是随机生成的80个100以内的浮点数,函数插在B1单元格内,由于该函数的目的是生成简单的报表而不是返回值,所以运行结束后B1单元格内依然空白,而所有的数据全部打印在新建的工作表4内(图2和图3)。
插图2 全班成绩和函数的输入
插件部署
Gnumeric插件部署及其简单,用户只需要在自己主目录下新建.gnumeric目录,放入插件函数即可,例如exam.py和plugin.xml就是位于 <HOME>/.gnumeric/<version> (7)/plugins/exam/,重新启动Gnumeric插件就生效了 (8) 。

  

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=17024
赞同 0
评论 0 条
Yayoi拾一L0
粉丝 0 发表 9 + 关注 私信
上周热门
Kingbase用户权限管理  2008
信刻全自动光盘摆渡系统  1738
信刻国产化智能光盘柜管理系统  1407
银河麒麟添加网络打印机时,出现“client-error-not-possible”错误提示  1002
银河麒麟打印带有图像的文档时出错  906
银河麒麟添加打印机时,出现“server-error-internal-error”  698
麒麟系统也能完整体验微信啦!  645
统信桌面专业版【如何查询系统安装时间】  616
统信操作系统各版本介绍  607
统信桌面专业版【全盘安装UOS系统】介绍  582
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

添加我为好友,拉您入交流群!

请使用微信扫一扫!