移动数据框并填充 NaN
Shift Dataframe and filling up NaN
我想创建一个 DataFrame,其中包含 n 个消费者(此处 n=5)10 小时的每小时热量需求。
--> 名为“Village”的 DataFrame,n 列(每列代表一个消费者)和 10 行(10 小时)
所有消费者都遵循相同的需求概况,唯一的区别是它会在随机的小时数内发生变化。随机数服从正态分布。
我设法创建了一个遵循正态分布的离散数字列表,并且我设法创建了一个包含 n 行的 DataFrame,其中相同的需求概况通过该随机数进行偏移。
我无法解决的问题是,NaN 出现了,而不是用因班次而被切断的值填充班次时间。
示例:如果需求概况偏移 1 小时(例如消费者 5)。现在第一个小时出现“NaN”作为需求。我希望显示原始需求概况的第 10 小时的值(4755.005240),而不是“NaN”。因此,我不想改变需求概况的值,而是希望它更多地“旋转”。
heat_demand
0 1896.107462
1 1964.878199
2 2072.946499
3 2397.151402
4 3340.292937
5 4912.195496
6 6159.893152
7 5649.024821
8 5157.805271
9 4755.005240
Consumer 1 Consumer 2 Consumer 3 Consumer 4 Consumer 5
0 1896.107462 NaN 1964.878199 NaN NaN
1 1964.878199 NaN 2072.946499 NaN 1896.107462
2 2072.946499 NaN 2397.151402 NaN 1964.878199
3 2397.151402 1896.107462 3340.292937 1896.107462 2072.946499
4 3340.292937 1964.878199 4912.195496 1964.878199 2397.151402
5 4912.195496 2072.946499 6159.893152 2072.946499 3340.292937
6 6159.893152 2397.151402 5649.024821 2397.151402 4912.195496
7 5649.024821 3340.292937 5157.805271 3340.292937 6159.893152
8 5157.805271 4912.195496 4755.005240 4912.195496 5649.024821
9 4755.005240 6159.893152 NaN 6159.893152 5157.805271
有人可以提示我如何解决该问题吗?非常感谢提前和亲切的问候
路易丝
import numpy as np
import pandas as pd
import os
path= os.path.dirname(os.path.abspath(os.path.join(file)))
#Create a list with discrete numbers following normal distribution
n = 5
timeshift_1h = np.random.normal(loc=0.1085, scale=1.43825, size=n)
timeshift_1h = np.round(timeshift_1h).astype(int)
print ("Time Shift in h:", timeshift_1h)
#Read the Standard Load Profile
cols = ["heat_demand"]
df_StandardLoadProfile = pd.read_excel(os.path.join(path, '10_h_example.xlsx'),usecols=cols)
print(df_StandardLoadProfile)
#Create a df for n consumers, whose demand equals a shifted StandardLoadProfile.
#It is shifted by a random amount of hours, that is taken from the list timeshift_1h
list_consumers = list(range(1,n+1))
Village=pd.DataFrame()
for i in list_consumers:
a=timeshift_1h[i-1]
name = "Consumer {}".format(i)
Village[name] = df_StandardLoadProfile.shift(a)
print(Village)
use-case 有一个非常好的 numpy 函数,即 np.roll
(请参阅 here 了解文档)。它接受一个数组并按 shift
.
指定的步长移动它
对于您的示例,这可能如下所示:
import pandas as pd
import numpy as np
df = pd.read_csv("demand.csv")
df['Consumer 1'] = np.roll(df["heat_demand"], shift=1)
您可以填写反向列中的 nan
值 -
df = pd.DataFrame(np.arange(10))
df
# 0
#0 0
#1 1
#2 2
#3 3
#4 4
#5 5
#6 6
#7 7
#8 8
#9 9
df[0].shift(3).fillna(pd.Series(reversed(df[0])))
#0 9.0
#1 8.0
#2 7.0
#3 0.0
#4 1.0
#5 2.0
#6 3.0
#7 4.0
#8 5.0
#9 6.0
我想创建一个 DataFrame,其中包含 n 个消费者(此处 n=5)10 小时的每小时热量需求。 --> 名为“Village”的 DataFrame,n 列(每列代表一个消费者)和 10 行(10 小时) 所有消费者都遵循相同的需求概况,唯一的区别是它会在随机的小时数内发生变化。随机数服从正态分布。
我设法创建了一个遵循正态分布的离散数字列表,并且我设法创建了一个包含 n 行的 DataFrame,其中相同的需求概况通过该随机数进行偏移。
我无法解决的问题是,NaN 出现了,而不是用因班次而被切断的值填充班次时间。
示例:如果需求概况偏移 1 小时(例如消费者 5)。现在第一个小时出现“NaN”作为需求。我希望显示原始需求概况的第 10 小时的值(4755.005240),而不是“NaN”。因此,我不想改变需求概况的值,而是希望它更多地“旋转”。
heat_demand
0 1896.107462
1 1964.878199
2 2072.946499
3 2397.151402
4 3340.292937
5 4912.195496
6 6159.893152
7 5649.024821
8 5157.805271
9 4755.005240
Consumer 1 Consumer 2 Consumer 3 Consumer 4 Consumer 5
0 1896.107462 NaN 1964.878199 NaN NaN
1 1964.878199 NaN 2072.946499 NaN 1896.107462
2 2072.946499 NaN 2397.151402 NaN 1964.878199
3 2397.151402 1896.107462 3340.292937 1896.107462 2072.946499
4 3340.292937 1964.878199 4912.195496 1964.878199 2397.151402
5 4912.195496 2072.946499 6159.893152 2072.946499 3340.292937
6 6159.893152 2397.151402 5649.024821 2397.151402 4912.195496
7 5649.024821 3340.292937 5157.805271 3340.292937 6159.893152
8 5157.805271 4912.195496 4755.005240 4912.195496 5649.024821
9 4755.005240 6159.893152 NaN 6159.893152 5157.805271
有人可以提示我如何解决该问题吗?非常感谢提前和亲切的问候
路易丝
import numpy as np
import pandas as pd
import os
path= os.path.dirname(os.path.abspath(os.path.join(file)))
#Create a list with discrete numbers following normal distribution
n = 5
timeshift_1h = np.random.normal(loc=0.1085, scale=1.43825, size=n)
timeshift_1h = np.round(timeshift_1h).astype(int)
print ("Time Shift in h:", timeshift_1h)
#Read the Standard Load Profile
cols = ["heat_demand"]
df_StandardLoadProfile = pd.read_excel(os.path.join(path, '10_h_example.xlsx'),usecols=cols)
print(df_StandardLoadProfile)
#Create a df for n consumers, whose demand equals a shifted StandardLoadProfile.
#It is shifted by a random amount of hours, that is taken from the list timeshift_1h
list_consumers = list(range(1,n+1))
Village=pd.DataFrame()
for i in list_consumers:
a=timeshift_1h[i-1]
name = "Consumer {}".format(i)
Village[name] = df_StandardLoadProfile.shift(a)
print(Village)
use-case 有一个非常好的 numpy 函数,即 np.roll
(请参阅 here 了解文档)。它接受一个数组并按 shift
.
对于您的示例,这可能如下所示:
import pandas as pd
import numpy as np
df = pd.read_csv("demand.csv")
df['Consumer 1'] = np.roll(df["heat_demand"], shift=1)
您可以填写反向列中的 nan
值 -
df = pd.DataFrame(np.arange(10))
df
# 0
#0 0
#1 1
#2 2
#3 3
#4 4
#5 5
#6 6
#7 7
#8 8
#9 9
df[0].shift(3).fillna(pd.Series(reversed(df[0])))
#0 9.0
#1 8.0
#2 7.0
#3 0.0
#4 1.0
#5 2.0
#6 3.0
#7 4.0
#8 5.0
#9 6.0