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]:
floor | year | area | price | |
---|---|---|---|---|
0 | 高层(共6层) | 1986年建 | 58.23㎡ | 155万 |
1 | 中层(共20层) | 2020年建 | 88㎡ | 155万 |
2 | 低层(共28层) | 2010年建 | 89.33㎡ | 365万 |
- 将
year
列改为整数年份存储。 - 将
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 Date | Season | Episode | Episode Title | Name | Sentence | |
---|---|---|---|---|---|---|
0 | 2011-04-17 | Season 1 | Episode 1 | Winter is Coming | waymar royce | What do you expect? They're savages. One lot s... |
1 | 2011-04-17 | Season 1 | Episode 1 | Winter is Coming | will | I've never seen wildlings do a thing like this... |
2 | 2011-04-17 | Season 1 | Episode 1 | Winter is Coming | waymar royce | How close did you get? |
- 计算每一个
Episode
的台词条数。 - 以空格为单词的分割符号,请求出单句台词平均单词量最多的前五个人。
- 若某人的台词中含有问号,那么下一个说台词的人即为回答者。若上一人台词中含有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')