/OIer

A database for OIers

Primary LanguageHTMLApache License 2.0Apache-2.0

OIerDb

OIerDb is a database for Chinese OI participants.

OIerDb 是**信息学竞赛选手的一个数据库.

The following data are the unlicensed data gathered and formatted by fjzzq2002 from noi.cn. These data are modified and completed.

  • CTSC 2010-2017
  • APIO 2010-2017
  • NOI 2010-2017
  • NOI D类 2014-2017
  • WC 2015-2017
  • NOIP 2013-2017

The rest of the data are directly from noi.cn, including:

  • NOI 2009
  • NOI type D 2010-2013
  • NOIP 2010-2012 ( not complete)
  • WC2018-2019

这些数据是在开源项目中,由fjzzq2002整理的,并进行了部分完善

  • CTSC 2010-2017
  • APIO 2010-2017
  • NOI 2010-2017
  • NOI D类 2014-2017
  • WC 2015-2017
  • NOIP 2013-2017

其余数据来源于NOI官网,包括

  • NOI 2009
  • NOI D类 2010-2013
  • NOIP 2010-2012 提高组一等奖
  • WC2018-2019

将来会及时更新新数据,也可能会添加缺失数据。

捐赠记录

日期 金额 备注
2019-03-07 20.00元 杭心语 北京大学
2019-03-09 20.00元
2019-03-10 10.00元
2019-03-14 6.66元
2019-03-15 10.00元 小伙子加油啊
2019-03-16 5.00元 Level -1
2019-03-18 10.00元
2019-03-18 6.00元
2019-03-18 9.99元 白雪粉粉何所似
2019-03-21 30.00元
2019-03-22 10.00元 捐赠给OIerDb,并Orz
2019-03-23 17.00元
2019-03-24 10.00元 资瓷oierdb!
2019-03-24 100.00元 oierdb捐助
2019-03-25 6.00元 备注能留的也太少了⑧
2019-03-25 5.00元
2019-03-28 10.00元
2019-03-29 30.00元 enor2017
2019-03-30 5.00元
2019-03-30 23.33元 Orz 无限仰慕作者
2019-04-02 15.00元
2019-04-02 200.00元 西安铁一中教练aqx

搭建指南

这个项目是"OIerDb",但其实可以方便地改装成为任何一个学科竞赛获奖的数据库。项目由如下几部分组成:

合并及数据预处理

原始数据文件

data.txt

data.txt中是所有的获奖记录,实则为csv格式,每一行格式如下:

比赛名称,奖项,姓名,年级,学校,分数,省份,性别,

下面是一个例子

NOI2018,金牌,杨骏昭,高一,南京外国语学校,522,江苏,男,

需要注意的是,如果其中有一项缺省,逗号的数目不能减少,且每行最后还有一个逗号。

school_oped.txt

school_oped.txt中是表示学校合并信息的文件,同时记录有学校所属的省份。每一行格式如下:

省份,地市,学校名称1,学校名称2,(更多学校名称,结尾无逗号)

下面是一个例子

江苏,苏州市,江苏省苏州中学,江苏省苏州中学校,苏州中学

需要注意,每一个在data.txt中出现的学校名称都应当在这个文件中出现。 在getter.py中提供了一个基于百度地图api的从学校名称找定位的函数,通过这个函数可以初步地获得学校所在省份和地市,并合并一下定位相同的学校。这个效果并不充分,合并更多学校很大程度上基于人工判断,如果有人希望部署这个系统至其他位置,可参考本项目中school_oped.txt中做出的合并。

合并及数据处理脚本

两个脚本均是python3脚本,并需要pypinyin才能够正常运行。

new_merger.py

new_merger.py 是最重要的数据合并器。

new_merger.py 从 data.txtschool_oped.txt 读入数据,并输出csv格式到result.txt中。

school_analyzer.py

school_analyzer.py 是学校获奖记录统计及排名器。

new_merger.py 从 data.txtschool_oped.txt 读入数据,并输出csv格式到OI_school.txt中。

这个脚本将每个学校的获奖记录统计,并计算分数。分数由一个函数f(排名,比赛类型,比赛年份)得出

f(排名,比赛类型,比赛年份) = 0.8 ^ (今年年份-比赛年份) * g(排名*400/总参赛人数) * 比赛权重

g(x)在x = 0-60时为 100-40上的线性函数,x在60-250上为 36 - 7.5 上的线性函数,x在250-400上为7.5-0上的线性函数。

权重 = {"NOI":1,"NOID类":0.75,"CTSC":0.6,"WC":0.5,"APIO":0.4,"NOIP提高":0.1,"NOIP普及":0.04}

如果您有兴趣修改这个评分函数(或参数),请对比说明您的函数(或参数)的优越性。毕竟现在应用的也是一念之间的产物。

在线部署

作者的部署

作者的部署使用了MySQL,但实际上您使用什么数据库都可以(尽管这里只提供了php格式的查询MySQL数据库并返回的代码)。在更新/新添加数据时,先运行数据预处理的脚本,而后将生成的csv格式数据导入到数据库中,就结束了。

search.php 和 school.php

根据查询查表,而后返回 json 格式的数据。您需要更改php中的数据库信息以适应自己的设置。具体实现可能不是很漂亮。

欢迎您来作出贡献,提出意见和建议,或者自己搭一个玩玩。