import math
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from scipy.optimize import curve_fit
def read_column_to_list(file_path, sheet_name, column_name):
# 读取Excel文件
df = pd.read_excel(file_path, sheet_name=sheet_name)
# 获取指定列的数据并转换为列表
column_list = df[column_name].tolist()
return column_list
def fit_linear_丙(x, y):
def custom_func(x, a, b):
return a * x + b
popt, _ = curve_fit(custom_func, x, y)
# 得到斜率K和截距B
K, B = popt
# 生成拟合直线的 x 值
x_fit = np.linspace(min(x), max(x), 100)
y_fit = K * x_fit + B
# 绘制原始数据点和拟合直线
plt.scatter(x, y, label='Original Data')
plt.plot(x_fit, y_fit, color='red', label='Fitted Line')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
return K, B
def process_data_and_fit_丙 (file_path, sheet_name, column_name, start, end, n):
Lp = read_column_to_list(file_path, sheet_name, column_name)
Q_stage1 = Lp[start:end]
Q0 = max(Q_stage1)
Q_stage1 = [i / Q0 for i in Q_stage1]
Q_stage1 = [math.pow(i, -n) for i in Q_stage1]
XQ = [(i + start + 1, value) for i, value in enumerate(Q_stage1)]
x = []
y = []
for index, item in enumerate(XQ):
x.append(XQ[index][0])
y.append(XQ[index][1])
slope, intercept = fit_linear_丙(x, y)
print(f"斜率: {slope}, 截距: {intercept}, 截距固定为1")
return slope, intercept
def divide_lists(listA, listB):
listC = []
for a, b in zip(listA, listB):
try:
listC.append(a / b)
except ZeroDivisionError:
listC.append(np.nan) # 如果除数为 0,添加 NaN
return listC
def calculate_NR(a3, b3):
return (1 - math.pow(a3 * 0.05, 0.5)) / b3
def calculate_dfw(b3, NR, R, a3):
"""
根据给定的参数计算dfw的值。
:param b3: 变量b3的值,可以是单个数值或列表。
:param NR: 变量NR的值,可以是单个数值或列表。
:param R: 变量R的值,可以是单个数值或列表。
:param a3: 变量a3的值,可以是单个数值或列表。
:return: 计算得到的dfw的值,如果输入是列表,则返回列表形式的结果。
"""
b3 = np.array(b3)
NR = np.array(NR)
R = np.array(R)
a3 = np.array(a3)
dfw = 2 * b3 * NR * (1 - b3 * NR * R) / a3
return dfw.tolist() # 将numpy数组转换为列表返回,如果输入是单个数值,返回的也是单个数值的列表形式
if __name__ == "__main__":
file_path = "D:\\Pycharm\\project\\reformExcelData\\OceanOil\\check\\inf\\data\\PL19-3-E48ST1-deal-delete-sum.xlsx"
sheet_name = "Sheet1"
column_name_L = "平均月累产液量 (10⁴m³/d)"
column_name_N = "平均月累产油量 (10⁴m³/d)"
column_name_R = "气油比"
Lp = read_column_to_list(file_path, sheet_name, column_name_L)
Np = read_column_to_list(file_path, sheet_name, column_name_N)
R = read_column_to_list(file_path, sheet_name, column_name_R)
y = divide_lists(Lp, Np)
x = Lp
slope, intercept = fit_linear_丙(x, y)
b3 = slope
a3 = intercept
print(f"b3:{slope}, a3:{intercept}")
NR = calculate_NR(a3, b3)
print(f"NR: {NR}")
dfw = calculate_dfw(b3, NR, R, a3)
print(f"dfw: {dfw}")
丙型水驱特征曲线
于 2024-11-25 16:43:14 首次发布