Python + 数学建模
创作背景
逢周末休息,下午去剪头一资生院的打数模的学长问我一些python的问题,后来我一看感觉简单就答应帮学长做了,后来发现要求很多,很复杂,毕竟有上百组的数据要处理。
然后写到一半发现是为了计算结果,不是为了要代码,然后中途想转C++去实现(毕竟相对python来说C++还是熟悉太多,况且那会很自闭,备选庄家都没找到呢那会。)后来发现用C++也有困难的地方,就是名字中文的问题,问了半天舍友(C++dl,泽神)还是没有想出储存名字的好方法,然后就后来直接硬着头皮上了,接着用python,发现真的python的变量容错性好高,啥都能储存在一个变量里(有错的话dl指出,自己菜不知道见解对不对)
最后连着肝了六个小时的样子,就是这样,下面是这个整理
题目背景
给出如下表单
step1. 表单中筛选VIP单位(三个排名均上榜)→ 备选庄家;
step2. 备选庄家中找到(持仓量/成交量)大于Avg的VIP单位 → 主力庄家;
step3. ITS = (持买单量-持卖单量)/(持买单量+持卖单量)
解决方案
- 使用xlrd进行从excel中读取信息
- 使用xlwt进行将数据写入excel
- 定义class类来记录所有公司的成交量,持买持卖
- 使用item来对从表格中存储的数据进行
- 使用var来对表格中的部分数据进行处理(如在中信期货的成交量是4,098,就要想办法半中间的逗号删去。)中间这一部分卡了有将近半小时才发现是因为这个的原因,查资料改正又画了半小时左右。改正方法是利用转换为var,然后将中间的“,”去掉即可。
- 利用矩阵存放类的对象成员。(一开始头昏脑热一直以为存的是结构体成员,人都傻了查了了半天才发现自己用的是class,而且python根本没有struct)
代码部分
由于时间仓促,代码可以说太零散太分散了,有的很赘余,还有将近一半调试代码,真正起作用的也就一百来行。
好多语法都是现学现编,感觉原来都不知道的那种
import xlrd
import xlwt
data=xlrd.open_workbook('20190107_i1909.xls')
table=data.sheets()[0]
class company1:
def _init_(self,name,val,change):
self.Name = name
self.Val = val
self.Change = change
# c1 = [company1]*25
c1 = [company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1(),company1()]
class company2:
def _init_(self,name,val,change):
self.Name = name
self.Val = val
self.Change = change
# c2 = [company2]*25
c2 = [company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2(),company2()]
class company3:
def _init_(self,name,val,change):
self.Name = name
self.Val = val
self.Change = change
# c3 = [company3]*25
c3 = [company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3(),company3()]
for i in range(1000):
c1.append(company1)
c2.append(company2)
c3.append(company3)
nrows = table.nrows
ncols = table.ncols
data_list = []
tem_list = []
for i in range(ncols+12):
if i == 1:
tem_list.extend(table.row_values(i))
if i >= 4:
data_list.extend(table.row_values(i))
cnt = cnt1 = cnt2 = cnt3 = 1
total_cnt = 1
average = 0
for item in tem_list:
if total_cnt == 2:
var5 = item
if var5[1] == ',':
var5 = var5[:1] + var5[2:]
if var5[2] == ',':
var5 = var5[:2] + var5[3:]
print var5
average += int(var5)
if total_cnt == 4:
var5 = item
if var5[1] == ',':
var5 = var5[:1] + var5[2:]
if var5[2] == ',':
var5 = var5[:2] + var5[3:]
print var5
average += int(var5)
if total_cnt == 6:
var5 = item
if var5[1] == ',':
var5 = var5[:1] + var5[2:]
if var5[2] == ',':
var5 = var5[:2] + var5[3:]
print var5
average =float(average*1.0/int(var5))
total_cnt += 1
for item in data_list:
print item
for item in data_list:
# print cnt
# print cnt1
# print cnt2
# print cnt3
# print "^^^^^^^^^^"
if cnt == 3:
var56 = item
if cnt % 12 == 2:
c1[cnt1].Name = item
if cnt % 12 == 3:
var1 = item
if var1[1] == ',':
var1 = var1[:1]+var1[2:]
c1[cnt1].Val = int(var1)
if cnt % 12 == 4:
c1[cnt1].Change = item
cnt1 += 1
if cnt % 12 == 6:
c2[cnt2].Name = item
if cnt % 12 == 7:
var2 = item
if var2[1] == ',':
var2 = var2[:1]+var2[2:]
c2[cnt2].Val = int(var2)
if cnt % 12 == 8:
c2[cnt2].Change = item
cnt2 += 1
if cnt % 12 == 10:
c3[cnt3].Name = item
if cnt % 12 == 11:
var3 = item
if var3[1] == ',':
var3 = var3[:1] + var3[2:]
c3[cnt3].Val = int(var3)
if cnt % 12 == 0:
c3[cnt3].Change = item
cnt3 += 1
# print item
cnt += 1
for i in range(1,21):
print i
print c1[i].Name
print c1[i].Val
print c1[i].Change
print "***********"
print c2[i].Name
print c2[i].Val
print c2[i].Change
print "***********"
print c3[i].Name
print c3[i].Val
print c3[i].Change
print "------------------------------"
# print "check "
# print c2[2].Val
# print c3[3].Val
# print int(c2[2].Val)+int(c3[3].Val)
pre_banker = []
pre_banker_chengjiao = []
pre_banker_num = 0
is_pre_banker = [1]*21
for i in range(1,21):
for j in range(1,21):
if c2[j].Name == c1[i].Name:
is_pre_banker[i] += 1
for i in range(1,21):
for j in range(1,21):
if c3[j].Name == c1[i].Name:
is_pre_banker[i] += 1
# print "!!!!!!!!!!!!!!!"
for i in range(1,21):
# print i
# print is_pre_banker[i]
if is_pre_banker[i] == 3:
pre_banker_num += 1
pre_banker.append(c1[i].Name)
pre_banker_chengjiao.append(c1[i].Val)
total_hold = [0]*20
its_fenzi = [0]*20
its_fenmu = [0]*20
its = [0]*20
for i in range(pre_banker_num):
for j in range(1,21):
if pre_banker[i] == c2[j].Name:
total_hold[i] += c2[j].Val
its_fenzi[i] += c2[j].Val
its_fenmu[i] += c2[j].Val
for j in range(1,21):
if pre_banker[i] == c3[j].Name:
total_hold[i] += c3[j].Val
its_fenzi[i] -= c3[j].Val
its_fenmu[i] += c3[j].Val
its[i] = float(its_fenzi[i]*1.0/its_fenmu[i])
total_hold[i] = float(total_hold[i]*1.0/pre_banker_chengjiao[i])
final = 0
final_banker = [0]*20
final_banker_its = [0]*20
# print "pre_banker_num total"
f = xlwt.Workbook()
sheet1 = f.add_sheet(u'sheet1', cell_overwrite_ok=True)
for i in range(pre_banker_num):
if total_hold[i] >= average:
print pre_banker[i]
print total_hold[i]
print its[i]
sheet1.write(0, i, pre_banker[i])
sheet1.write(1, i, its[i])
print "^^^^^^^^^^^^^^^^^^^^^^"
final_banker.append(pre_banker[i])
print final_banker[final]
final_banker_its.append(its[i])
print final_banker_its[final]
final += 1
f.save('0107.xls')
# for i in range(final):
# print final_banker[i]
# print final_banker_its[i]
# sheet1.write(0, i, final_banker[i])
# sheet1.write(1, i, final_banker_its[i])
# print final
#
#
#
# class company1:
# def _init_(self,name,val,change):
# self.Name = name
# self.Val = val
# self.Change = change
# c1 = [company1(),company1(),company1()]
# # c1 = []
# # for i in range(1,24):
# # c1.append(company1)
#
# c1[1].Name = "name2"
# c1[1].Val = 200
# c1[1].Change = 24
#
# c1[0].Name = "name1"
# c1[0].Val = 100
# c1[0].Change = 12
#
# c1[2].Name = "name3"
# c1[2].Val = 300
# c1[2].Change = 48
#
# for i in range(0,3):
# print i
# print c1[i].Name
# print c1[i].Val
# print c1[i].Change
# print "----------"
# print var56
# print var56[1]
# if var56[1] == ',':
# var56 = var56[:1]+var56[2:]
# a = int(var56)
# print a
# if var56[]
# for i in range(var56):
# o = 1
# print ";;;;;;;;;;;;;;"
补个运行结果
这个是最一开始筛选出备选庄家(随便截取的,可能与样例表单中的数据不匹配)
这个图是筛选出了最后的庄家,下面那一行是持仓/成交,再下边那一行是its
2020.1.12补充
这种数据结构,那元组和字典做他不香吗,,,省着再用class来实现公司了,直接通过元组的固定结构来放一个公司的固定量(公司名称、),然后通过字典来对应每个需要后续计算的元素的值(如果多的话list[]索引往里边堆叠即可)……可能往后还能想到更好的数据结构来表示