来自 pandas DataFrame 的可扩展 Python 正态分布
Scaleable Python normal distribution from pandas DataFrame
我有一个 pandas 数据框(下面的代码),它具有按星期几和季度划分的均值和标准差。我想做的是按星期几提取每个均值和标准差,从这两个值创建一个随机正态样本,然后绘制它。
np.random.seed(42)
day_of_week=['mon', 'tues', 'wed', 'thur', 'fri', 'sat','sun']
year=[2017]
qtr=[1,2,3,4]
mean=np.random.uniform(5,30,len(day_of_week)*len(qtr))
std=np.random.uniform(1,10,len(day_of_week)*len(qtr))
dat=pd.DataFrame({'year':year*(len(day_of_week)*len(qtr)),
'qtr':qtr*len(day_of_week),
'day_of_week':day_of_week*len(qtr),
'mean':mean,
'std': std})
dowuq=dat.day_of_week.unique()
现在我有一个解决上述问题的方法,但这种方法的可扩展性不是很好。如果我想添加越来越多的列,即另一年或按周细分,这不会很有效。我是 python 的新手,所以非常感谢您的帮助。
有效但不可扩展的代码:
plt.style.use('fivethirtyeight')
for w in dowuq:
datsand=dat[dat['day_of_week']==''+str(w)+''][0:4]
mu=datsand.iloc[0]['mean']
sigma=datsand.iloc[0]['std']
mu2=datsand.iloc[1]['mean']
sigma2=datsand.iloc[1]['std']
mu3=datsand.iloc[2]['mean']
sigma3=datsand.iloc[2]['std']
mu4=datsand.iloc[3]['mean']
sigma4=datsand.iloc[3]['std']
s1=np.random.normal(mu, sigma, 2000)
s2=np.random.normal(mu2, sigma2, 2000)
s3=np.random.normal(mu3, sigma3, 2000)
s4=np.random.normal(mu4, sigma4, 2000)
sns.kdeplot(s1, bw='scott', label='Q1')
sns.kdeplot(s2, bw='scott', label='Q2')
sns.kdeplot(s3, bw='scott', label='Q3')
sns.kdeplot(s4, bw='scott', label='Q4')
plt.title(''+str(w)+' in 2017')
plt.ylabel('Density')
plt.xlabel('Random')
plt.xticks(rotation=15)
plt.show()
您可能应该使用 groupby
,它允许您对数据框进行分组。目前我们仅在 'day'
上分组,但如果需要,您可以在将来扩展它。
我们也可以改为使用 iterrows
循环所有列出的行:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
np.random.seed(42)
day_of_week = ['mon', 'tues', 'wed', 'thur', 'fri', 'sat', 'sun']
year = [2017]
qtr = [1, 2, 3, 4]
mean = np.random.uniform(5, 30, len(day_of_week) * len(qtr))
std = np.random.uniform(1, 10, len(day_of_week) * len(qtr))
dat = pd.DataFrame({'year': year * (len(day_of_week) * len(qtr)),
'qtr': qtr * len(day_of_week),
'day_of_week': day_of_week * len(qtr),
'mean': mean,
'std': std})
# Group by day of the week
for day, values in dat.groupby('day_of_week'):
# Loop over rows for each day of the week
for i, r in values.iterrows():
cur_dist = np.random.normal(r['mean'], r['std'], 2000)
sns.kdeplot(cur_dist, bw='scott', label='{}_Q{}'.format(day, r['qtr']))
plt.title('{} in 2017'.format(day))
plt.ylabel('Density')
plt.xlabel('Random')
plt.xticks(rotation=15)
plt.show()
plt.clf()
我有一个 pandas 数据框(下面的代码),它具有按星期几和季度划分的均值和标准差。我想做的是按星期几提取每个均值和标准差,从这两个值创建一个随机正态样本,然后绘制它。
np.random.seed(42)
day_of_week=['mon', 'tues', 'wed', 'thur', 'fri', 'sat','sun']
year=[2017]
qtr=[1,2,3,4]
mean=np.random.uniform(5,30,len(day_of_week)*len(qtr))
std=np.random.uniform(1,10,len(day_of_week)*len(qtr))
dat=pd.DataFrame({'year':year*(len(day_of_week)*len(qtr)),
'qtr':qtr*len(day_of_week),
'day_of_week':day_of_week*len(qtr),
'mean':mean,
'std': std})
dowuq=dat.day_of_week.unique()
现在我有一个解决上述问题的方法,但这种方法的可扩展性不是很好。如果我想添加越来越多的列,即另一年或按周细分,这不会很有效。我是 python 的新手,所以非常感谢您的帮助。
有效但不可扩展的代码:
plt.style.use('fivethirtyeight')
for w in dowuq:
datsand=dat[dat['day_of_week']==''+str(w)+''][0:4]
mu=datsand.iloc[0]['mean']
sigma=datsand.iloc[0]['std']
mu2=datsand.iloc[1]['mean']
sigma2=datsand.iloc[1]['std']
mu3=datsand.iloc[2]['mean']
sigma3=datsand.iloc[2]['std']
mu4=datsand.iloc[3]['mean']
sigma4=datsand.iloc[3]['std']
s1=np.random.normal(mu, sigma, 2000)
s2=np.random.normal(mu2, sigma2, 2000)
s3=np.random.normal(mu3, sigma3, 2000)
s4=np.random.normal(mu4, sigma4, 2000)
sns.kdeplot(s1, bw='scott', label='Q1')
sns.kdeplot(s2, bw='scott', label='Q2')
sns.kdeplot(s3, bw='scott', label='Q3')
sns.kdeplot(s4, bw='scott', label='Q4')
plt.title(''+str(w)+' in 2017')
plt.ylabel('Density')
plt.xlabel('Random')
plt.xticks(rotation=15)
plt.show()
您可能应该使用 groupby
,它允许您对数据框进行分组。目前我们仅在 'day'
上分组,但如果需要,您可以在将来扩展它。
我们也可以改为使用 iterrows
循环所有列出的行:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
np.random.seed(42)
day_of_week = ['mon', 'tues', 'wed', 'thur', 'fri', 'sat', 'sun']
year = [2017]
qtr = [1, 2, 3, 4]
mean = np.random.uniform(5, 30, len(day_of_week) * len(qtr))
std = np.random.uniform(1, 10, len(day_of_week) * len(qtr))
dat = pd.DataFrame({'year': year * (len(day_of_week) * len(qtr)),
'qtr': qtr * len(day_of_week),
'day_of_week': day_of_week * len(qtr),
'mean': mean,
'std': std})
# Group by day of the week
for day, values in dat.groupby('day_of_week'):
# Loop over rows for each day of the week
for i, r in values.iterrows():
cur_dist = np.random.normal(r['mean'], r['std'], 2000)
sns.kdeplot(cur_dist, bw='scott', label='{}_Q{}'.format(day, r['qtr']))
plt.title('{} in 2017'.format(day))
plt.ylabel('Density')
plt.xlabel('Random')
plt.xticks(rotation=15)
plt.show()
plt.clf()