三个数据库

numpy

随机抽样:

例1 :野外正在进行9(n=9)口石油勘探井的发掘工作,每一口井能够开发出油的概率是0.1(p=0.1)。请问,最终所有的勘探井都勘探失败的概率?

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
my_front=front_manager.FontProperties(fname="/System/Library/Fonts/Hiragino Sans GB.ttc")
np.random.seed(20200605)
n = 9# 做某件事情的次数
p = 0.1# 做某件事情成功的概率
size = 50000
x = np.random.binomial(n, p, size)
#使用binom.rvs(n, p, size=1)函数模拟一个二项随机变量,可视化地表现概率
y = stats.binom.rvs(n, p, size=size)#返回一个numpy.ndarray
print(np.sum(x == 0) / size)  # 0.3897
a=['随机变量:成功次数']
b=['样本中出现的次数']
plt.hist(x,size)
plt.xlabel(range(len(a)),fontproperties=my_font)
plt.ylabel(range(len(b)),fontproperties=my_font)
plt.show()
#它返回一个列表,列表中每个元素表示随机变量中对应值的概率
s = stats.binom.pmf(range(10), n, p)
print(np.around(s, 3))
# [0.387 0.387 0.172 0.045 0.007 0.001 0.    0.    0.    0.   ]

例2:模拟投硬币,投2次,请问两次都为正面的概率?

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
my_front = front_manager.FontProperties(fname="/System/Library/Fonts/Hiragino Sans GB.ttc")

np.random.seed(20200605)
lam = 42 / 6//平均值:平均每十分钟接到42/6次订票电话
size = 50000
x = np.random.poisson(lam, size)
'''或者
#模拟服从泊松分布的50000个随机变量
x = stats.poisson.rvs(lam,size=size)
'''
print(np.sum(x == 6) / size)  //0.14988

plt.hist(x)
a=['随机变量:每十分钟接到订票电话的次数']
b=['50000个样本中出现的次数']
plt.xlabel(range(len(a)), fontproperties=my_font)
plt.ylabel(range(len(b)), fontproperties=my_font)
plt.show()
//用poisson.pmf(k, mu)求对应分布的概率:概率质量函数 (PMF)
x = stats.poisson.pmf(6, lam)
print(x)  //0.1490027796743377

例3一共20只动物里有7只是狗,抽取12只有3只狗的概率(无放回抽样)。

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
my_front = front_manager.FontProperties(fname="/System/Library/Fonts/Hiragino Sans GB.ttc")

np.random.seed(20200605)
size = 500000
x = np.random.hypergeometric(ngood=7, nbad=13, nsample=12, size=size)
'''或者
#用rvs(M, n, N, loc=0, size=1, random_state=None)模拟
x = stats.hypergeom.rvs(M=20,n=7,N=12,size=size)
'''
print(np.sum(x == 3) / size)  //0.198664
a=['狗的数量']
b=['50000个样本中出现的次数']
c=['超几何分布']
plt.hist(x, bins=8)
plt.xlabel(range(len(a)), fontproperties=my_font)
plt.ylabel(range(len(b)), fontproperties=my_font)
plt.title(range(len(c)), fontproperties=my_font,fontsize=20)
plt.show()

"""
M 为总体容量
n 为总体中具有成功标志的元素的个数
N,k 表示抽取N个元素有k个是成功元素
"""
x = range(8)
//用hypergeom.pmf(k, M, n, N, loc)来计算k次成功的概率
s = stats.hypergeom.pmf(k=x, M=20, n=7, N=12)
print(np.round(s, 3))
//[0.    0.004 0.048 0.199 0.358 0.286 0.095 0.01 ]

例4 在low到high范围内,创建大小为size的均匀分布的随机数。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

np.random.seed(20200614)
a = 0
b = 100
size = 50000
x = np.random.uniform(a, b, size=size)
print(np.all(x >= 0))  # True
print(np.all(x < 100))  # True
y = (np.sum(x < 50) - np.sum(x < 10)) / size
print(y)  # 0.40144

plt.hist(x, bins=20)
plt.show()

a = stats.uniform.cdf(10, 0, 100)
b = stats.uniform.cdf(50, 0, 100)
print(b - a) 

例5根据指定大小产生[0,1)之间均匀分布的随机数

import numpy as np
np.random.seed(20200614)
print(np.random.rand())
print(np.random.rand(5))
print(np.random.rand(4, 3))
np.random.seed(20200614)
print(np.random.uniform()) 
print(np.random.uniform(size=5))
print(np.random.uniform(size=(4, 3)))

例6根据指定大小产生满足标准正态分布的数组(均值为0,标准差为1)

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

np.random.seed(20200614)
size = 50000
x = np.random.randn(size)
y1 = (np.sum(x < 1) - np.sum(x < -1)) / size
y2 = (np.sum(x < 2) - np.sum(x < -2)) / size
y3 = (np.sum(x < 3) - np.sum(x < -3)) / size
print(y1)  
print(y2)  
print(y3)  

plt.hist(x, bins=20)
plt.show()

y1 = stats.norm.cdf(1) - stats.norm.cdf(-1)
y2 = stats.norm.cdf(2) - stats.norm.cdf(-2)
y3 = stats.norm.cdf(3) - stats.norm.cdf(-3)
print(y1)  
print(y2)  
print(y3)  

还可以指定分布以及所需参数来进行随机,例如高斯分布中的mu和sigma 

  • numpy.random.normal(loc=0.0, scale=1.0, size=None) Draw random samples from a normal (Gaussian) distribution.
  • normal()为创建均值为 loc(mu),标准差为 scale(sigma),大小为 size 的数组。
    import numpy as np
    import matplotlib.pyplot as plt
    
    np.random.seed(20200614)
    x = 0.5 * np.random.randn(2, 4) + 5
    '''或者
    #模拟10000个随机变量
    x = 0.5*stats.norm.rvs(size=(2,4))+5
    '''
    print(x)
    
    
    np.random.seed(20200614)
    mu = 5
    sigma = 0.5
    x = np.random.normal(mu, sigma, (2, 4))
    print(x)
    
    size = 50000
    x = np.random.normal(mu, sigma, size)
    
    print(np.mean(x))
    print(np.std(x, ddof=1)) 

  • numpy.random.choice(a, size=None, replace=True, p=None) Generates a random sample from a given 1-D array.
  • 从序列中获取元素,若a为整数,元素取值从np.range(a)中随机获取;若a为数组,取值从a数组元素中随机获取。该函数还可以控制生成数组中的元素是否重复replace,以及选取元素的概率p

    import numpy as np
    
    np.random.seed(20200614)
    x = np.random.choice(10, 3)
    print(x) 
    
    x = np.random.choice(10, 3, p=[0.05, 0, 0.05, 0.9, 0, 0, 0, 0, 0, 0])
    print(x) 
    
    x = np.random.choice(10, 3, replace=False, p=[0.05, 0, 0.05, 0.9, 0, 0, 0, 0, 0, 0])
    print(x)  
    aa_milne_arr = ['pooh', 'rabbit', 'piglet', 'Christopher']
    x = np.random.choice(aa_milne_arr, 5, p=[0.5, 0.1, 0.1, 0.3])
    print(x) 
    np.random.seed(20200614)
    x = np.random.randint(0, 10, 3)
    print(x)
  • 例7:洗牌,改变自身内容,打乱顺序。

  • import numpy as np
    
    np.random.seed(20200614)
    x = np.arange(10)
    np.random.shuffle(x)
    print(x)
    print(np.random.shuffle([1, 4, 9, 12, 15]))
    x = np.arange(20).reshape((5, 4))
    print(x)
    np.random.shuffle(x)

    Pandas

文本数据练习题:

Ex1:房屋信息数据集

现有一份房屋信息数据集如下:

1df = pd.read_excel('../data/house_info.xls', usecols=['floor','year','area','price'])

2df.head(3)[80]:

flooryearareaprice
0高层(共6层)1986年建58.23㎡155万
1中层(共20层)2020年建88㎡155万
2低层(共28层)2010年建89.33㎡365万
  1. year列改为整数年份存储。
  2. floor列替换为Level, Highest两列,其中的元素分别为string类型的层类别(高层、中层、低层)与整数类型的最高层数。

计算房屋每平米的均价avg_price,以***元/平米的格式存储到表中,其中***为整数。

1

df = pd.read_excel('../data/house_info.xls', usecols=['floor','year','area','price'])
df.year = pd.to_numeric(df.year.str[:-2]).astype('Int64')
df.head(3)

2

pat = '(\w层)(共(\d+)层)'
new_cols = df.floor.str.extract(pat).rename(columns={0:'Level', 1:'Highest'})
df = pd.concat([df.drop(columns=['floor']), new_cols], 1)
df.head(3)

3

s_area = pd.to_numeric(df.area.str[:-1])
s_price = pd.to_numeric(df.price.str[:-1])
df['avg_price'] = ((s_price/s_area)*10000).astype('int').astype('string') + '元/平米'
df.head(3)

Ex2:《权力的游戏》剧本数据集现有一份权力的游戏剧本数据集如下:

1df = pd.read_csv('../data/script.csv')

2df.head(3)

[81]:

Release DateSeasonEpisodeEpisode TitleNameSentence
02011-04-17Season 1Episode 1Winter is Comingwaymar royceWhat do you expect? They're savages. One lot s...
12011-04-17Season 1Episode 1Winter is ComingwillI've never seen wildlings do a thing like this...
22011-04-17Season 1Episode 1Winter is Comingwaymar royceHow close did you get?
  1. 计算每一个Episode的台词条数。
  2. 以空格为单词的分割符号,请求出单句台词平均单词量最多的前五个人。
  3. 若某人的台词中含有问号,那么下一个说台词的人即为回答者。若上一人台词中含有nn个问号,则认为回答者回答了nn个问题,请求出回答最多问题的前五个人。

1

df = pd.read_csv('../data/script.csv')
df.columns = df.columns.str.strip()
df.groupby(['Season', 'Episode'])['Sentence'].count().head()

2

df.set_index('Name').Sentence.str.split().str.len().groupby('Name').mean().sort_values(ascending=False).head()

3

s = pd.Series(df.Sentence.values, index=df.Name.shift(-1))
s.str.count('\?').groupby('Name').sum().sort_values(ascending=False).head()

Matplotlib

场景案例练习题:用Drugs数据集,做出面积图的多子图形式。
注意,需要添加如下要素:
①添加每个子图标题,在子图右上方;
②添加整个画布的总标题,在画布左上方;
③添加X和Y轴的标签。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd


Dataset = pd.read_csv('data/Drugs.csv')
Dataset.head()
group = Dataset.groupby(['YYYY','State']).agg('sum').reset_index()
group.head()
df = group.pivot(index='YYYY', columns='State', values='DrugReports').reset_index()
df.head()
plt.style.use('seaborn-darkgrid') 
palette = plt.get_cmap('Set2') 
plt.figure(figsize=(15, 10)) 

num=0
for column in df.drop('YYYY', axis=1):
    num+=1
 
    
    plt.subplot(3,3, num)
 
    
    plt.fill_between(df['YYYY'], df[column], alpha=0.5, label=column)
 
    
    plt.xlim(2009.3,2017.3)
    plt.ylim(0,50000)
 
 
    plt.title(column, loc='right', fontsize=12, color=palette(num))


plt.suptitle("How many DrugReports the 5 states have in past few years?", fontsize=13, fontweight=0, color='black', style='italic', x=0.25,y=0.95)
 

plt.text(2014, -9500, 'Year', ha='center', va='center') 
plt.text(1998, 60000, 'DrugReports', ha='center', va='center', rotation='vertical')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值