如何以某种模式获得numpy随机生成的数字,以模拟一年中几天的天气

2024-09-26 17:50:57 发布

您现在位置:Python中文网/ 问答频道 /正文

好的,我需要创建一些随机数据来进行模拟。我知道我试图生成的一些现实生活场景的平均值和标准差。我面临的问题是,生成的与日期对应的随机数不现实。例如天气(MinTP),它的波动很大,这是不现实的。我希望以某种模式生成数字,以便平均值出现在数据集的中间。请参阅下面我的代码示例以及一年中表格和天气散点图的输出。我一直在使用np.random.normal()生成数据,也许我需要使用不同的函数

import numpy as np
import pandas as pd
import datetime

np.random.seed(2)

start2018 = datetime.datetime(2018, 1, 1)
end2018 = datetime.datetime(2018, 12, 31)
dates2018 = pd.date_range(start2018, end2018, freq='d')
synEne2018 = np.random.normal(loc=66.883795, scale=5.448145, size=365)
synMintp2018 = np.random.normal(loc=7.203288, scale=4.690315, size=365)
synCovidDailyCases2018 = np.random.normal(loc=0.0, scale=0.0, size=365)
synCovidDailyDeaths2018 = np.random.normal(loc=0.0, scale=0.0, size=365)
syn2018data = pd.DataFrame({'Date': dates2018, 'Total Daily Energy': synEne2018, 'MinTp': synMintp2018, 'DailyCovidCases': synCovidDailyCases2018, 'DailyCovidDeaths': synCovidDailyDeaths2018})
print(syn2018data)

fig, ax =plt.subplots()
sns.scatterplot(x="Date", y='MinTp', data=syn2018data[0:], color='r')

enter image description here


Tags: 数据importsizedatetimeasnprandomloc
1条回答
网友
1楼 · 发布于 2024-09-26 17:50:57

正态分布

正态分布有两个参数:

  1. 中庸。在numpy.random.normal中,它是参数“loc”
  2. 标准偏差std,即参数“scale”。它实际上并不是结果值的整个范围,但它是一个遵循正常规律的分布。基本上,这意味着,68%的数据将在距离您的meanstd之内,95%的数据将在距离您的meanstd之内,而99.7%的值将在距离您的meanstd之内

您可以使用正态分布表来掌握期望得到的值

normal distribution table

请记住,此表表示获取介于meanmean + z * std之间的值的概率,而不是获取介于mean - z * stdmean + z * std之间的值的概率。你必须做2 * p - 1才能得到后者

模拟年温度

如果降低比例,值将更接近平均值

为了更现实一些,我建议获得一条基本minTp曲线(冬季最小,8月份最大),然后使用loc=0和scale=0.2左右的正态分布添加随机性

如果在sin函数中指定了平均值和范围,则使用从零到π的正弦作为基数可以实现此目的:

import math
start2018 = datetime.datetime(2018, 1, 1)
end2018 = datetime.datetime(2018, 12, 31)
dates2018 = pd.date_range(start2018, end2018, freq='d')
t_range = 4.690315 # our range
t_mean = 7.203288  # our mean
synMintp2018 = np.sin(np.arange(365)/365 * math.pi)*t_range + t_mean
synMintp2018 += np.random.normal(loc=0, scale=0.2, size=365)
...
syn2018data = pd.DataFrame({'Date': dates2018, 'Total Daily Energy': synEne2018, 'MinTp': synMintp2018, 'DailyCovidCases': synCovidDailyCases2018, 'DailyCovidDeaths': synCovidDailyDeaths2018})

fig, ax =plt.subplots()
sns.scatterplot(x="Date", y='MinTp', data=syn2018data[0:], color='r')

Temperatures

添加偏移量

由于最小值更可能出现在1月份,因此我们可以添加偏移来平移基准曲线

import math
synMintp2018 = np.sin(np.arange(365)/365 * math.pi) * 4.690315 + 7.203288
synMintp2018 = np.roll(synMintp2018, 15) # offset in days
synMintp2018 += np.random.normal(loc=0, scale=0.2, size=365)
...
syn2018data = pd.DataFrame({'Date': dates2018, 'Total Daily Energy': synEne2018, 'MinTp': synMintp2018, 'DailyCovidCases': synCovidDailyCases2018, 'DailyCovidDeaths': synCovidDailyDeaths2018})


fig, ax =plt.subplots()
sns.scatterplot(x=syn2018data.index, y=syn2018data['MinTp'], color='r')

Temperatures with offset

相关问题 更多 >

    热门问题