免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: mpstat
打印 上一主题 下一主题

[文本处理] 码农的欧洲杯:欢迎各路神仙和高手挑战! [复制链接]

论坛徽章:
20
CU大牛徽章
日期:2013-03-13 15:29:072015亚冠之阿尔希拉尔
日期:2015-09-12 09:33:562015年亚冠纪念徽章
日期:2015-09-22 17:12:202015亚冠之本尤德科
日期:2015-10-29 16:18:18神斗士
日期:2015-11-23 13:37:23青铜圣斗士
日期:2015-12-07 10:14:28平安夜徽章
日期:2015-12-26 00:06:3015-16赛季CBA联赛之佛山
日期:2016-01-18 08:59:06shanzhi
日期:2016-06-17 17:59:3115-16赛季CBA联赛之同曦
日期:2016-11-03 14:43:552015七夕节徽章
日期:2015-08-21 11:06:17丑牛
日期:2014-12-30 16:06:17
21 [报告]
发表于 2012-06-01 20:20 |只看该作者
哈哈,好NB

论坛徽章:
13
技术图书徽章
日期:2014-04-29 14:15:42IT运维版块每日发帖之星
日期:2015-12-12 06:20:00IT运维版块每日发帖之星
日期:2015-08-30 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-08-02 06:20:002015年亚洲杯之澳大利亚
日期:2015-04-03 15:03:12申猴
日期:2015-03-20 09:00:292015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15季节之章:冬
日期:2015-01-20 17:08:47双子座
日期:2014-11-21 16:30:31技术图书徽章
日期:2014-07-11 16:29:08
22 [报告]
发表于 2012-06-01 21:06 |只看该作者
唉,没时间看这个呢

论坛徽章:
6
CU大牛徽章
日期:2013-03-14 14:14:08CU大牛徽章
日期:2013-03-14 14:14:26CU大牛徽章
日期:2013-03-14 14:14:29处女座
日期:2014-04-21 11:51:59辰龙
日期:2014-05-12 09:15:10NBA常规赛纪念章
日期:2015-05-04 22:32:03
23 [报告]
发表于 2012-06-02 15:31 |只看该作者
lkk_super 发表于 2012-06-01 18:08
回复 16# send_linux


我才400多分啊,一两把估计就输光了

论坛徽章:
7
天秤座
日期:2014-03-25 10:07:1115-16赛季CBA联赛之江苏
日期:2016-04-25 21:35:162015年亚洲杯之约旦
日期:2015-03-16 22:57:572015年亚洲杯纪念徽章
日期:2015-02-28 23:10:39狮子座
日期:2014-11-30 23:14:46申猴
日期:2014-03-28 09:57:25综合交流区版块每日发帖之星
日期:2016-07-19 06:20:00
24 [报告]
发表于 2012-06-02 15:37 |只看该作者
你们都是牛人

论坛徽章:
0
25 [报告]
发表于 2012-06-03 00:10 |只看该作者
本帖最后由 nmweizi 于 2012-06-03 14:02 编辑

不知道用python写算不算,代码写的比较丑陋,请大家多原谅
  1. header = True
  2. for i in f.readlines():
  3.     #d = []
  4.     i = i.strip()
  5.     if len(i) > 0 and len(i) <50:
  6.         if header:
  7.             d = []
  8.             
  9.             header = False
  10.         d.append(i)
  11.         #print d   
  12.     #else:
  13.     if len(i) > 50 :
  14.         #print d
  15.         header = True
  16.         if i[0]<>'#':
  17.             
  18.             i1 = re.sub('\s{2,}|\s+\(|\)\s+','|',i)
  19.             i2 = re.sub('\)\s*\||\(aged','',i1)
  20.         
  21.             i3 = re.sub('\|\s*\(','|',i2)
  22.             i4 = re.sub('\|\s*c\s*\|',' (c) |',i3)
  23.             
  24.             if len(d) ==2:
  25.                 d.insert(0,d1)
  26.             else:
  27.                 d1 =d[0]
  28.             g.write(i4+'|'+'|'.join(d) +'\n')
  29.         
  30. g.close()
  31. f.close()

  32. import datetime
  33. def date_converter(date_string):
  34.     return datetime.datetime.strptime(date_string, '%Y-%m-%d').date()
  35. df = read_csv('e:/temp/name3.txt',parse_dates=True,sep='\|',names=['#', 'Pos.', 'Player','Date of Birth', 'Age','Club','group','gj','jl'],converters={3:date_converter})
  36. df.head()
复制代码
Out[43]:
   # Pos.               Player Date of Birth  Age           Club    group      gj                                      jl    sr
0  1   GK    Wojciech Szczesny    1990-04-18   22        Arsenal  Group A  Poland  Head coach:  Franciszek Smuda (Poland)  4-18
1  2   DF   Sebastian Boenisch    1987-02-01   25  Werder Bremen  Group A  Poland  Head coach:  Franciszek Smuda (Poland)   2-1
2  3   DF  Grzegorz Wojtkowiak    1984-01-26   28    Lech Poznan  Group A  Poland  Head coach:  Franciszek Smuda (Poland)  1-26
3  4   DF       Damien Perquis    1984-10-04   27        Sochaux  Group A  Poland  Head coach:  Franciszek Smuda (Poland)  10-4
4  5   MF        Dariusz Dudka    1983-12-09   28        Auxerre  Group A  Poland  Head coach:  Franciszek Smuda (Poland)  12-9

1.年纪最小的人

  1. df.min(axis=0)
  2. df.Age.min()   #这个也可以
复制代码
(Age)                         18

2.年纪最大的人

  1. df.max(axis=0)
  2. df.Age.max()    #这个也可以
复制代码
(Age)                                 38

3.哪一天出生的人最多
  1. df.groupby(['Date of Birth']).count().sort('Date of Birth', ascending = False)['#']
复制代码
Date of Birth
1982-05-01       2
1987-01-27       2
1981-10-03       2
1986-09-08       2
1981-10-29       2
1984-06-28       2
1987-01-22       2
1987-07-28       2
1989-05-31       2
1983-07-07       2
1984-12-13       2
1985-08-20       2
1983-05-02       1
如果只比较天
  1. nian = lambda x: x.day
  2. df['sr'] = df['Date of Birth'].map(nian)
  3. df.groupby(['sr']).count().sort('Date of Birth', ascending = False)['#']
复制代码
sr
13    18
20    18
27    17
28    16
9     16
4     15
26    14
12    14
3     13
8     13
19    13
6     12
10    12
17    12
21    12

按月日计算
  1. nian = lambda x: str(x.month)+'-'+str(x.day)
  2. df['sr'] = df['Date of Birth'].map(nian)
  3. df.groupby(['sr']).count().sort('Date of Birth', ascending = False)['#']
复制代码
Out[29]:
sr
6-9      4
3-30     4
7-7      4
10-27    3
7-28     3
5-31     3
9-8      3


4.和你生日相同的人,如果有的话找出来
  1. nian = lambda x: x ==datetime(1983,12,9).date()
  2. df['sr'] = df['Date of Birth'].map(nian)
  3. print df[df['sr']]
复制代码
# Pos.         Player Date of Birth  Age     Club    group      gj                                      jl                   rq    sr
4  5   MF  Dariusz Dudka    1983-12-09   28  Auxerre  Group A  Poland  Head coach:  Franciszek Smuda (Poland)   True


如果不算年的话
  1. nian = lambda x: x.month ==12 and x.day==9
  2. df['sr'] = df['Date of Birth'].map(nian)
  3. print df[df['sr']]
复制代码
# Pos.         Player Date of Birth  Age         Club    group       gj                                      jl    sr
4    5   MF  Dariusz Dudka    1983-12-09   28      Auxerre  Group A   Poland  Head coach:  Franciszek Smuda (Poland)  True
276  1   GK   Maksym Koval    1992-12-09   19  Dynamo Kyiv  Group D  Ukraine     Head coach:  Oleh Blokhin (Ukraine)  True

5.给定一个球员名,列出国籍与教练,处在哪个小组
  1. print df[df['Player']=='Simon Cox'][['gj','jl','group']]
复制代码
gj                                       jl    group
249  Republic of Ireland  Head coach:  Giovanni Trapattoni(Italy)  Group C


6.哪个俱乐部的人最多
  1. df.groupby(['Club']).count().sort('Club', ascending = False)['#']
复制代码
Out[145]:
Club
Bayern Munich              13
Real Madrid                11
Dynamo Kyiv                10
Chelsea                     9
Zenit Saint Petersburg      8
Arsenal                     8
Barcelona                   8
Shakhtar Donetsk            8
Borussia Dortmund           8
Manchester City             8
Manchester United           7
Juventus                    7
CSKA Moscow                 7
Liverpool                   7
Olympiacos                  6

7.队长里打什么位置的最多
  1. f = lambda x: '(c)' in x
  2. df['dz'] = df['Player'].map(f)
  3. df.groupby(['dz','Pos.']).count().sort('Pos.', ascending = False)['Pos.']
复制代码
dz     Pos.
False  MF      124
       DF      112
       FW       71
       GK       45
True   MF        6
       FW        5
       GK        3
       DF        2


        
8.比你年纪大的有多少人
  1. nian = lambda x: x >datetime(1983,12,9).date()
  2. df['sr'] = df['Date of Birth'].map(nian)
  3. df[df['sr']].count()
复制代码
#                222


9.列出365天里所有人都不过生日的日期
  1. from datetime import datetime
  2. from pandas.core.datetools import *
  3. start = datetime(2012, 1, 1)
  4. end = datetime(2012, 12, 31)
  5. rng = DateRange(start, end, offset=BDay())
  6. nian = lambda x: datetime(2012,x.month,x.day)
  7. df['rq'] =df['Date of Birth'].map(nian)   
  8. (rng-df['rq']).map(lambda x: [str(x.month)+'-'+str(x.day)])
复制代码
Out[158]:
array([['1-1'], ['1-3'], ['1-7'], ['1-20'], ['1-21'], ['1-29'], ['1-30'],
       ['1-31'], ['2-6'], ['2-7'], ['2-8'], ['2-10'], ['2-17'], ['2-19'],
       ['2-22'], ['2-27'], ['3-1'], ['3-3'], ['3-5'], ['3-8'], ['3-14'],
       ['3-15'], ['3-22'], ['3-23'], ['3-24'], ['3-25'], ['3-31'], ['4-1'],
       ['4-11'], ['4-12'], ['4-14'], ['4-15'], ['4-17'], ['4-23'],
       ['4-24'], ['4-26'], ['5-3'], ['5-6'], ['5-10'], ['5-12'], ['5-14'],
       ['5-18'], ['5-25'], ['5-28'], ['6-1'], ['6-2'], ['6-5'], ['6-7'],
       ['6-11'], ['6-14'], ['6-16'], ['6-18'], ['6-23'], ['6-24'],
       ['6-26'], ['6-30'], ['7-1'], ['7-2'], ['7-4'], ['7-5'], ['7-13'],
       ['7-18'], ['7-19'], ['7-23'], ['7-25'], ['7-27'], ['7-29'],
       ['7-30'], ['7-31'], ['8-5'], ['8-7'], ['8-9'], ['8-10'], ['8-22'],
       ['8-25'], ['8-26'], ['8-29'], ['9-1'], ['9-7'], ['9-11'], ['9-16'],
       ['9-17'], ['9-23'], ['9-24'], ['9-25'], ['10-1'], ['10-2'],
       ['10-8'], ['10-11'], ['10-14'], ['10-17'], ['10-19'], ['10-21'],
       ['10-26'], ['10-30'], ['10-31'], ['11-2'], ['11-3'], ['11-7'],
       ['11-9'], ['11-13'], ['11-14'], ['11-16'], ['11-18'], ['11-19'],
       ['11-20'], ['11-22'], ['11-23'], ['11-24'], ['11-28'], ['11-29'],
       ['12-1'], ['12-4'], ['12-5'], ['12-10'], ['12-18'], ['12-22'],
       ['12-23'], ['12-25'], ['12-29'], ['12-31']], dtype=object)



10.打各个位置的人一共有多少
  1. df.groupby('Pos.').count().sort('Pos.', ascending = False)['Pos.']
复制代码
Out[418]:
Pos.
MF      130
DF      114
FW       76
GK       48

论坛徽章:
13
CU大牛徽章
日期:2013-04-17 11:20:3615-16赛季CBA联赛之吉林
日期:2017-05-25 16:45:4715-16赛季CBA联赛之福建
日期:2017-03-13 11:33:442017金鸡报晓
日期:2017-02-08 10:39:422017金鸡报晓
日期:2017-01-10 15:13:29IT运维版块每日发帖之星
日期:2016-03-15 06:20:01IT运维版块每日发帖之星
日期:2015-10-02 06:20:00CU十二周年纪念徽章
日期:2013-10-24 15:41:34CU大牛徽章
日期:2013-09-18 15:15:45CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-04-17 11:46:39CU大牛徽章
日期:2013-04-17 11:46:28
26 [报告]
发表于 2012-06-03 19:01 |只看该作者
都是一些超级强者啊

论坛徽章:
0
27 [报告]
发表于 2012-06-04 11:15 |只看该作者
本帖最后由 alang85 于 2012-06-04 11:16 编辑

回复 1# mpstat

论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
28 [报告]
发表于 2012-06-04 13:57 |只看该作者
我也来一个, 用MySQL来做。。。。。。码农么。。。。当然是包括无数数据库从业人员啊。。。

脚本运行环境
Linux

测试了几个不同的版本应该都没什么大问题

依赖环境, 有mysql running...
# yum install mysql-server

第一步,文本处理
sed/awk/tr/grep

第二步,mysql create database/table.
              mysqlimport

第三步, 建辅助表/视图, 表结构优化。。。(没分割多个表, 这样 不符合第三范式, 不过这里没问题的~~~)

然后就可以答题了。。

直接用附件的脚本跑就可以了。。。。

Before run the script...
修改脚本开头的变量$MSQLTOKEN 成为自己本地测试环境的用户名密码。。。

  1. #################################################################
  2. ##please modify following variable $MSQLTOKEN as your env. access
  3. ##if you connect your DB with
  4. ##   user:sesame
  5. ##   pswd:OPEN
  6. ##set
  7. ##   MSQLTOKEN=" -u sesame -p OPEN "
  8. #################################################################
  9. MSQLTOKEN=" -u root "
  10. #################################################################
复制代码
任何问题  欢迎指正

to407.zip (11.29 KB, 下载次数: 11)



论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
29 [报告]
发表于 2012-06-04 14:07 |只看该作者
回复 30# to407


1.    第一步做文本处理的时候还是调戏了比较长的时间, 测试了几遍没有什么大的bug。。。。具体的读代码吧,太长了。。。
   
2.    mysqlimport的时候会在groupin有两处warning,不过不影响导入, 这个warning是原文件有两处coach的国籍没有标注, 后面我用update语句设为同国家队名了。

3.    建了新数据库 eucup; 两个表player/team
  1. create table player(
  2.     P_id int(3) not null,
  3.     P_No int(2) not null,
  4.     P_position varchar(2),
  5.     P_name varchar(50),
  6.     P_iscapital int(1),
  7.     P_birthday date,
  8.     P_age    int(3),
  9.     P_club   varchar(50),
  10.     P_state  varchar(30)
  11. );

  12. create table team(
  13.     T_id int(2) not null,
  14.     T_name varchar(30),
  15.     T_coach_name varchar(50),
  16.     T_coach_state varchar(30)
  17. );
复制代码
另外一个临时用的表groupin在处理之后也并入了team表, 上面提过不满足第三范式, 这边不影响题意。

4. 建了一个视图
      CREATE VIEW  vPlayerBirth(P_id, P_name, P_birth) AS  select P_id,P_name, date_format(P_birthday, '%m-%d') from player;
    主要是因为题目有几处用到了"生日", 就提出来新作一列, 这样比较方便

5. 建了一个新表date2012
     该表在处理之后就是一年366天为一列, 另一列更新为是否有人生日。
     这样处理是为了第9题, 很直观地select语句就可以完成查询。



论坛徽章:
0
30 [报告]
发表于 2012-06-04 15:16 |只看该作者
to407 发表于 2012-06-04 14:07
回复 30# to407




lz牛啊.我得好好看看lz的代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP