【发布时间】:2019-08-07 20:53:09
【问题描述】:
我正在尝试连续 n 天绘制 n 条高斯曲线。情节必须从用户输入的base 值开始,在 46800 秒(13:00 或下午 1 点)达到peak 值,并在一天结束时再次以接近base 值结束在接下来的 n 天里,必须复制相同的曲线。我正在听从这篇文章的建议:Generating multiple gaussian plots
我有以下代码:
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats
import math
import pandas as pd
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
from datetime import datetime
def date_inputs(start_date, end_date):
try:
start_date = datetime.strptime(start_date, '%Y-%m-%d %H:%M:%S')
end_date = datetime.strptime(end_date, '%Y-%m-%d %H:%M:%S')
dates = pd.date_range(start_date, end_date, freq = 'S').tolist()
dates = pd.Series(dates)
dates_diff = abs((end_date - start_date).days)
dates = dates.iloc[:-1]
print('Dates accepted!')
return dates, dates_diff
except ValueError:
raise ValueError("Incorrect date format, should be YYYY-MM-DD HH:MM:SS")
start_date_input = str(input('Enter start date in %Y-%m-%d %H:%M:%S format: '))
end_date_input = str(input('Enter end date in %Y-%m-%d %H:%M:%S format: '))
dates, n = date_inputs(start_date_input, end_date_input)
def bell_curve(total_consumption, peak, base, n):
x = np.linspace(0, n*86400, n*86400)
sigma = total_consumption/(math.sqrt(2*math.pi)*(peak-base))
sigmas = [sigma]*n
pdf_value = np.zeros(x.shape)
for m, s in zip(mus, sigmas):
pdf_value += stats.norm.pdf(x,m,s)
plt.figure(figsize = (20,10))
plt.plot(dates, (total_consumption*pdf_value) + base)
plt.xticks(rotation = 70)
plt.show()
return pdf_value
mu = 46800
seconds_in_one_day = 86400
mus = []
for i in range(0,n):
mus.append(mu+(i*seconds_in_one_day))
peak = float(input('Enter the peak value in Watts:'))
total_consumption = float(input('Enter the total consumption in one day in Watts:'))
base = float(input('Enter the base value in Watts:'))
pdf_values = bell_curve(total_consumption, peak, base, n)
当我给出如下输入时:
start_day: 2018-01-01 00:00:00,end_day: 2018-01-02 00:00:00 与 peak 为 2222,base 为 500 和 total_consumption 为 630000000,我得到下图:
上面的图表是一天的,是正确的。
当我将结束日期更改为end_day: 2018-01-03 00:00:00 时,开始日期和结束日期之间的差异为 2,因此我希望将 2 个相同的图表并排绘制,具有相同的峰值、相同的基值和峰值出现在13:00 或次日下午 1 点:
但与图 2 不同的是,该图如下所示:
在图 3 中,我们可以看到绘制的不是 2 个图,而是一个图,其峰值和基值完全错误。
谁能告诉我这里的代码有什么错误?
谢谢
【问题讨论】:
-
您已经将 2 天范围标准化。当您对图表进行归一化时,曲线下的面积必须等于 1。
-
嘿@AnnaNevison,你能告诉我代码中的问题在哪里吗?
标签: python python-3.x matplotlib logic gaussian