数据清洗(1)

1.庄家和赔率
   计算赔率
   某促销活动拼团人数当时是1026人,上有两天结束,根据历史经验,假定1天参团人数为100人,则最终参团人数为1226人,考虑 [ 1180 , 1230 ] [1180,1230] [1180,1230]。计算该区间的素数和合数,以及公正赔率。代码如下:

# -*- coding: utf-8 -*-

import numpy as np
from time import time
import math

def is_prime(x):
    return 0 not in [ x % i for i in range(2,int(math.sqrt(x))+1)]

def is_prime3(x):
    p_list2 = []
    flag = True
    for p in range(2,int(math.sqrt(x))+1):
        if x % p == 0:
            flag = False
            break
    if flag:
        p_list2.append(x)
    return flag

if __name__ == "__main__":
    a = 2
    b = 10000

    # 方法1:直接计算
    # 返回当前时间的时间戳
    t = time()
    p = [p for p in range(a,b) if 0 not in [p % d for d in range(2,int(math.sqrt(p))+1)]]
    print(p)
    print(time()-t)

    # 方法2:利用filter
    t = time()
    # 返回迭代器对象
    iter = filter(is_prime,range(a,b))
    print(iter)
    list = [it for it in iter]
    print(list)
    print(time() - t)

    # 方法3:利用filter和lambda
    t = time()
    is_prime2 = (lambda x: 0 not in [x % i for i in range(2,int(math.sqrt(x)+1))])
    p = filter(is_prime2,range(a,b))
    p_list = [i for i in p]
    print(p_list)
    print(time() - t)

    print('--------------------------------')
    a = 1180
    b = 1230
    p=filter(is_prime3,range(2,b+1))
    p_list = [iter for iter in p]
    print(p_list)
    p_list2 = [i for i in p_list if i >= a]
    print(p_list2)
    print(len(p_list2))
    print(b-a+1)
    p_rate = float(len(p_list2))/float(b-a+1)
    print('素数的概率:', p_rate, '\t')
    print('公正赔率:', 1 / p_rate)
    print('合数的概率:', 1 - p_rate, '\t')
    print('公正赔率:', 1 / (1 - p_rate))

运行结果如下:
在这里插入图片描述
2.Nagel-Schreckenberg交通流模型
   路面上有 N N N辆车,以不同的速度向前行驶,模拟堵车问题。有如下假设:
   (1)假设某辆汽车当前速度为v;
   (2)若前方可见范围内没车,则它在下一秒钟的车速提升到v+1,直到达到规定的最高速度;
   (3)假设某辆汽车当前速度为v;
    若前方有车,前车的距离为d,且d<v,则他的速度降低到d-1;
   (4)每辆车会以概率p随机减为v-1。
代码如下:
#-- coding: utf-8 --

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt


def clip(x,path):
    for i in range(len(x)):
        if x[i] >= path:
            x[i] %= path


if __name__ == "__main__":
    # 自定义样式
    mpl.rcParams['font.sans-serif'] = [u'SimHei']
    mpl.rcParams['axes.unicode_minus'] = False

    path = 5000  #环形公路长度
    n = 100   #公路中的车辆数目
    v0 = 50 #车辆初始速度
    p = 0.3
    Times = 3000

    np.random.seed(0)
    # numpy.random.rand()生成0到1之间的随机数
    x = np.random.rand(n) * path
    x.sort()
    # umpy.tile()把数组沿各个方向复制,[50]*100
    v = np.tile([v0],n).astype(np.float)

    # figsize:指定figure的宽和高,单位为英寸
    plt.figure(figsize=(10,8),facecolor='w')
    for t in range(Times):
        plt.scatter(x,[t]*n,s=1,c='k',alpha=0.05)
        for i in range(n):
            if x[(i+1)%n] > x[i]:
                # 距离前车的距离
                d = x[(i+1) % n] - x[i]
            else:
                d = path - x[i] + x[(i+1) % n]
            if v[i] < d:
                if np.random.rand() > p:
                    v[i] += 1
                else:
                    v[i] -= 1
            else:
                v[i] = d - 1
            # clip这个函数将将数组中的元素限制在a_min, a_max之间,大于a_max的就使得它等于 a_max,小于a_min
            # 的就使得它等于a_min
        v = v.clip(0,150)
        x += v
        clip(x,path)
    plt.xlim(0,path)
    plt.ylim(0,Times)
    plt.xlabel(u'车辆位置',fontsize=16)
    plt.ylabel(u'模拟时间',fontsize=16)
    plt.title(u'环形公路车辆堵车模型',fontsize=20)
    plt.tight_layout(pad=2)
    plt.show()

运行结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值