2018MCM/ICM-1

概述

  最近在参加MCM/ICM,我们选择的是MCM的C题,是一道数据分析题目,以下是第一天的一点收获,主要是关于数据处理方面的。

代码实现

数据分组

  由于数据给出的是6美国4个州605个指标的数据,我的第一个目标是将数据进行划分,可以提取出任意州任意指标的数据。其中有些指标是从1960年到2009年的20组数据的50组数据,有的则是40组或者30组数据。我一开始以为每个指标的数据恒定为50组,因此直接定长计算,运行后发现部分数据比较奇怪,因此检查后发现是因为有部分数据的长度非定长50,而是30或者40,并且位置不定,因此改用索引的方法进行提取,经实验发现,由于数据数量约为10000左右,因此python进行索引的效果尚可。
  还有一个小问题是在索引的时候发现直接匹配指标名称的字符串的化,并没有正确匹配,我觉得应该是编码格式的问题,我尝试直接提取表格中的作为索引的目标发现匹配正常,因此直接提起表格中的名称进行索引,并进行画图处理。代码如下:

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
30
31
# get the Name of State
def getNameOfState(Num):
if Num == 1:
return sheet1.cell(1,1).value
elif Num == 2:
return sheet1.cell(51,1).value
elif Num == 3:
return sheet1.cell(152,1).value
elif Num == 4:
return sheet1.cell(101,1).value

#get the num
# stateNum is the num of the stateNum
# MSNNum is the num of the stateNum
def getPhoto(stateNum,MSNNum):
MSNName = sheet2.cell(MSNNum,0).value
stateName = getNameOfState(stateNum)
#print stateName
oriX = 0
oriY = []
for i in range(1,105744):
if sheet1.cell(i,0).value == MSNName and sheet1.cell(i,1).value == stateName:
oriX = oriX + 1
oriY.append(sheet1.cell(i,3).value)


xcord1 =range(1,oriX+1)
ycord1 = oriY

plt.plot(xcord1,ycord1,'bo-')
plt.plot(xcord1, ycord1, marker='o', mec='r', mfc='w',label=u'test1')

批量绘图

  第二个任务是想把每个指标的4个州的数据用一张折线图表示,然后导出605张图,其中需要注意的是图片的命名操作,我是直接利用字符创的“+”运行,用保存的位置的字符创“+”名称,作为输出的位置即可,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
if __name__ =="__main__":
#plt.subplot(211)
for i in range(1,605):
for j in range(1,5): #attention
getPhoto(j,i)
print '第' + str(i) + '种' + '.png'
f_name = '第' + str(i) + '种' + '.png'
f_path = source + f_name
plt.savefig(f_path)
plt.close()

plt.show()

小结

  以上为数据提取的一些步骤。