双色球 python

对双色球数据探索

数据准备
爬取双色球的数据

# -*- coding: utf-8 -*-
import os
import os.path
import sys
reload(sys)
sys.setdefaultencoding("utf-8")  #开奖日期中的字符需要引入
import urllib2
from bs4 import BeautifulSoup

# 创建/打开一个文件放数据
def  fetchLottery():
 if os.path.exists("lottery.csv"):
    os.remove("lottery.csv")
 f = open("lottery.csv", "a")
 for i in range(3,16):
  print("正在获取"+"{:0>2d}".format(i)+"年数据")
  url = "http://www.lecai.com/lottery/draw/list/50?type=range_date&start=20"+"{:0>2d}".format(i)+"-01-01&end=20"+"{:0>2d}".format(i)+"-12-31"
  page = urllib2.urlopen(url)                                 # 打开目标url
  soup = BeautifulSoup(page,"html.parser")# 格式化标签
        #print(soup.find_all(attrs={"class":"historylist"}))
  foundAllTbody = soup.findAll(attrs={"class":"balls"})
  foundDate = soup.findAll("tbody")[0]
  num = 1
  if(foundAllTbody):
    for foundBalls in foundAllTbody[0:]:    
     foundAllTr = foundBalls.findAll("em")
     if(foundAllTr):
       ballStr = ""
       for foundTd in foundAllTr[0:]:
        if(foundTd):
            ballStr += ","
            ballStr += foundTd.string
              #print(foundTd.string)  
     date = foundDate.findAll("td")[(num-1)*10+num].string   #开奖日期
     print type(date)
     f.write(date +','+ ballStr+'\n')
     print(foundDate.findAll("td")[(num-1)*10+num].string)
     num = num + 1    
 print "数据抓取完成"
 f.close()

fetchLottery()
%matplotlib inline
import pandas as pd
from pandas import DataFrame
lottery=pd.read_csv('lottery.csv')
lottery.index=[date[:-9] for date in lottery.date]
lottery=lottery.drop(['date'],axis=1)
lottery.index.name='date'

lottery.to_csv('lottery_change.csv')
lottery.head(10)
转换成pandas.DataFrame格式
R1R2R3R4R5R6B
date
2003-12-2818192126273316
2003-12-253102122243312
2003-12-212345242813
2003-12-185121618263013
2003-12-14141112192714
2003-12-112671017333
2003-12-0713141826281
2003-12-047171819303114
2003-11-3012142629307
2003-11-279202425283010
lottery.hist()
lottery.shape
(1899, 7)

进行简单的数据探索,可以看书B{蓝色球}的分布让人很是蛋疼,然而R1-R6{红色球}的数据分布是傻子都能看的出来,R1一般比较小,R6一般分布在25-33之间。

这里写图片描述

lottery.ix[:,:'B'].sum(axis=1).hist()
<matplotlib.axes._subplots.AxesSubplot at 0x114319e8>

B的R1-R6之和的数据分布,看着貌似还是有点小规律,基本上分布在90-110之间。可是只又有什么卵用—-和下面随机选择的基本上算一致的(随机选择若是按照概率生成的话也许结果更有说服力)

这里写图片描述

import random
from pandas import DataFrame
seed=range(1,33)
random_select=[]
for i in range(1899):
    lotter=random.sample(seed,6)
    random_select.append(lotter)
sns.distplot(DataFrame(random_select).sum(axis=1))

这里写图片描述

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
sns.set_style('darkgrid')
g=sns.pairplot(lottery)
这是R1的概率密度分布图到10基本上到达0.9.
ax=sns.kdeplot(lottery.R1,shade=True,color='r',cumulative=True)

这里写图片描述

ax=sns.kdeplot(lottery.R2,shade=True,color='r',cumulative=True)

这是R2的概率密度分布图

这里写图片描述

sns.jointplot('R1','R4',data=lottery,kind='reg')
<seaborn.axisgrid.JointGrid at 0x2f0d2da0>

这里写图片描述

ax=sns.kdeplot(lottery.ix[:,:'B'].sum(axis=1))

这里写图片描述

ax=sns.kdeplot(lottery.ix[:,-3:-1].sum(axis=1))

这里写图片描述

ax = sns.distplot(lottery.ix[:,-3:-1].sum(axis=1))

观察尾和

这里写图片描述

lottery_sort=pd.read_csv('lottery_change.csv',index_col=0,parse_dates=0)
roll_mean=pd.rolling_mean(lottery_sort,20).dropna()
import  matplotlib.pyplot as plt


for i in range(1,7):
    plt.subplot(230+i)
    a='R'+str(i)
    sns.distplot(roll_mean[a])

观察R1-R6的概率密度分布图

这里写图片描述

sns.distplot(roll_mean['R1'])
<matplotlib.axes._subplots.AxesSubplot at 0x2bf19da0>

这里写图片描述

sns.distplot(lottery.R1)
<matplotlib.axes._subplots.AxesSubplot at 0x3000f9e8>

这里写图片描述

import numpy as np
tim=np.zeros((1899,50))
lottery_sort['BL']=lottery_sort.B.values+33
lottery_sort=lottery_sort.drop('B',axis=1)
loc=lottery_sort.values
lottery_sort.head()
R1R2R3R4R5R6BL
date
2003-02-2310111213262844
2003-02-27491920212645
2003-03-02171023283249
2003-03-0646710132536
2003-03-09461517303149

运用文本的分类的模式进行计算:

  • 将矩阵转换成词袋模型 就是[1,3,6]转换成[1,0,1,0,0,1]的形式
  • 计算每个feature出现的概率,或者设置窗口观察出现概率的变化
  • 简单的差分或者也可以采用其他你认为好的方法,目前所做的只能增加你的机会

窗口为33 R1概率的变化率,你会发现有一定的规律,对啥号有一定的帮助。

这里写图片描述

for i in range(1899):
    tim[i,loc[i]]=1
from pandas import DataFrame
# sns.jointplot(np.arange(34),tim.sum(axis=0)/1899.0,kind='reg')
def prob(x):
    prom=x.sum()/float(x.shape[0])
    return prom
for window in range(10,12,2):
    print "Window=:",window
    probBR=DataFrame(pd.rolling_apply(tim,window,prob),index=lottery_sort.index).dropna().diff(1)
    choose_blue=[]

    for i in range(probBR.shape[0]):
        max6=probBR.ix[i,:33].argsort()[-6:].tolist()
        maxB=probBR.ix[i,33:].argmax()
        choose_blue.append(sorted(max6)+[maxB])

    # print choose_blue
    prob33=DataFrame(choose_blue,index=probBR.index,columns=['R1','R2','R3','R4','R5','R6','BL']).shift(1).dropna()
    eq=(lottery_sort - prob33).ix[:,:-1].dropna()
    eq_count=eq[eq==0].count(axis=1)
    cnt=0.0
    print eq
    for i in eq[eq==0].count(axis=1):
        if i>4:
            cnt+=1.0
    print cnt/float(eq_count.shape[0])

#     scoring=eq_count.sum()/eq_count.shape[0]
#     print scoring
score
window_size
100.389095
120.409115
140.401592
160.381306
180.408825
200.392762
220.400639
240.394667
260.389749
280.373597
300.405029
320.395822
340.394638
360.395062
380.397098
400.401291
420.396338
440.400000
460.384242
480.416532
500.395890
520.419058
540.408672
560.383071
580.405215
600.418162
620.384322
640.395640
660.395526
680.401966
700.412794
720.399562
740.398356
760.419089
780.388797
800.391974
820.389653
840.403857
860.396580
880.419658
900.364290
920.397344
940.396676
960.382141
980.408662
lottery_sort.shift(1)
R1R2R3R4R5R6BL
date
2003-02-23NaNNaNNaNNaNNaNNaNNaN
2003-02-2710111213262844
2003-03-02491920212645
2003-03-06171023283249
2003-03-0946710132536
2003-03-13461517303149
2003-03-16131021262739
2003-03-20191921232640
2003-03-2358914172341
2003-03-27591820223042
2003-03-3012813172446
2003-04-03451112303248
2003-04-062121617273045
2003-04-108131721233245
2003-04-133578213135
2003-04-174111925263246
2003-04-2011172830313339
2003-04-24581823253139
2003-04-275161920252846
2003-05-01481213163342
2003-05-047102526273237
2003-05-0814151825263034
2003-05-11271112143241
2003-05-151102022263135
2003-05-18271517223047
2003-05-22151113142745
2003-05-258131526293149
2003-05-291111417272848
2003-06-016131620283240
2003-06-05271526293243
2015-10-2523512182734
2015-10-275132227303343
2015-10-2910111520232945
2015-11-017101922273339
2015-11-0313811222839
2015-11-05581116182737
2015-11-086141516172243
2015-11-1010121319222636
2015-11-12351128303334
2015-11-15231320222448
2015-11-17251419273137
2015-11-191121418263240
2015-11-22251223282934
2015-11-2414222327283145
2015-11-2612816192444
2015-11-291101318252742
2015-12-016202829303145
2015-12-03381925272835
2015-12-0613171920222544
2015-12-0813151920213237
2015-12-1014715283249
2015-12-13781519202446
2015-12-1516172128303248
2015-12-17891623243038
2015-12-209131422262740
2015-12-229102021223342
2015-12-2413811293146
2015-12-2756823313244
2015-12-2911181921293245
2015-12-318111522272936

1899 rows × 7 columns

import itertools  
list(itertools.permutations([1,2,3,4],2))   #排列
list(itertools.combinations([1,2,3,4],2))    #组合

总结

只是做了一下简单的数据探索,通过数据来看可预测性不强,但是可以通过转换的思路去理解数据(以窗口33为例):

  • 建立窗口,通过观察前后窗口概率的变化(差分)可以得出某个数字出现的概率的变化趋势(分析过中国的股市,变化的规律跟彩票差不多。。。。。不过有些基本面的信息做支撑)
  • 可以贝叶斯的思想模型,从第一部得出窗口概率,对33个数据的组合中找出最有可能出现的组合(双色球的组选模式)
  • 马尔科夫模型大部分是用在文本分析上面,可以用于彩票的预测
  • 神经网络模型入度6出度为6
    (11选5,10分钟开一次奖能更好的验证方法)
    以上只是谈疼的思考,若有不当之处,多批评。。。
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值