Pandas 线性数学矩阵计算
Pandas Linear math matrix calculation
我在 pandas 数据框中有一些数据,我正在尝试创建另一个严格计算值的数据框。
数据来自我上传到我创建的 Github 帐户的 CSV 格式的供热厂。 https://github.com/bbartling/Data
data = pd.read_csv('C:\Users\Python Scripts\SetPoint_data.csv', index_col='Date', parse_dates=True)
data.info()
输出为:
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 69839 entries, 2017-10-01 05:00:11.205000 to 2018-01-02 05:45:14.419000
Data columns (total 3 columns):
hwr 69839 non-null float64
hws 69839 non-null float64
oat 69839 non-null float64
dtypes: float64(3)
memory usage: 2.1 M
B
我想做的是计算锅炉系统的设定值,该设定值基于室外空气温度。 data[('oat')]
其他数据点是热水 return 和供水温度。最终,我想看看锅炉系统的性能与设定值有多接近。
我要计算的设定点是在室外空气温度为 10F 时,加热水的设定点为 170,在室外空气温度为 40F 时,加热水的设定点为 130。它确实是一个简单的线性重置计算,但我不知道如何构建另一个 pandas 数据框。
X = data[('oat')]
def setpoint_calc(X):
A = np.matrix([[10,1],[40,1]])
B = np.matrix([[170],[130]])
A_inverse = np.linalg.inv(A)
X = A_inverse * B
return X
setpoint_calc(X)
输出为:
matrix([[ -1.33333333],
[ 183.33333333]])
那么我如何扫描一定范围的 x 值来得出我计算的设定值?设定值 = -1.33333333 * 数据[('oat')] + 183.33333333
我知道我需要 slice/index 二维 numpy 数组,但我不确定如何......是循环中的最佳方法吗?
setpoint = pd.DataFrame()
for X in X:
setpoint_calc.append(X)
我可以直观地把它放入一个散点图中,用一些线来表示我试图在一个单独的 dataFrame 中计算的内容......希望这是有道理的:
plt.scatter(data['oat'], data['hws'], color='grey', marker='+')
plt.plot([10,40],[170,130], color='blue', label='Reset Range')
plt.plot([40,80],[130,130], color='green', label='130F during mild weather')
plt.plot([-25,10],[170,170], color='red', label='170F during cold weather')
plt.xlabel('Outdoor Temp')
plt.ylabel('Hot Water Temp')
plt.title('Calculated Setpoint')
plt.legend()
plt.show()
如果我没理解错的话,我想这就是你要找的:
data['setpoint'] = data['oat'].apply(lambda x: -1.33333333 * x + 183.33333333)
这将对 oat
列中的每个值执行计算,并将计算出的值存储在 DataFrame 上名为 setpoint
的新列中。
我在 pandas 数据框中有一些数据,我正在尝试创建另一个严格计算值的数据框。
数据来自我上传到我创建的 Github 帐户的 CSV 格式的供热厂。 https://github.com/bbartling/Data
data = pd.read_csv('C:\Users\Python Scripts\SetPoint_data.csv', index_col='Date', parse_dates=True)
data.info()
输出为:
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 69839 entries, 2017-10-01 05:00:11.205000 to 2018-01-02 05:45:14.419000
Data columns (total 3 columns):
hwr 69839 non-null float64
hws 69839 non-null float64
oat 69839 non-null float64
dtypes: float64(3)
memory usage: 2.1 M
B
我想做的是计算锅炉系统的设定值,该设定值基于室外空气温度。 data[('oat')]
其他数据点是热水 return 和供水温度。最终,我想看看锅炉系统的性能与设定值有多接近。
我要计算的设定点是在室外空气温度为 10F 时,加热水的设定点为 170,在室外空气温度为 40F 时,加热水的设定点为 130。它确实是一个简单的线性重置计算,但我不知道如何构建另一个 pandas 数据框。
X = data[('oat')]
def setpoint_calc(X):
A = np.matrix([[10,1],[40,1]])
B = np.matrix([[170],[130]])
A_inverse = np.linalg.inv(A)
X = A_inverse * B
return X
setpoint_calc(X)
输出为:
matrix([[ -1.33333333],
[ 183.33333333]])
那么我如何扫描一定范围的 x 值来得出我计算的设定值?设定值 = -1.33333333 * 数据[('oat')] + 183.33333333
我知道我需要 slice/index 二维 numpy 数组,但我不确定如何......是循环中的最佳方法吗?
setpoint = pd.DataFrame()
for X in X:
setpoint_calc.append(X)
我可以直观地把它放入一个散点图中,用一些线来表示我试图在一个单独的 dataFrame 中计算的内容......希望这是有道理的:
plt.scatter(data['oat'], data['hws'], color='grey', marker='+')
plt.plot([10,40],[170,130], color='blue', label='Reset Range')
plt.plot([40,80],[130,130], color='green', label='130F during mild weather')
plt.plot([-25,10],[170,170], color='red', label='170F during cold weather')
plt.xlabel('Outdoor Temp')
plt.ylabel('Hot Water Temp')
plt.title('Calculated Setpoint')
plt.legend()
plt.show()
如果我没理解错的话,我想这就是你要找的:
data['setpoint'] = data['oat'].apply(lambda x: -1.33333333 * x + 183.33333333)
这将对 oat
列中的每个值执行计算,并将计算出的值存储在 DataFrame 上名为 setpoint
的新列中。