我是 Python 编程新手,而且仍在学习中。 我想问我有 csv 数据,其中有 5 列(TC、TD、TG、P、CTTR)。我想为 CTTR 列存储新值。
CTTR 列的新公式是
i 是线路号码。
但我不知道如何用Python编写公式。 我知道如何使用 pandas 获取原始 CTTR 值作为输入。
import pandas as pd
data_df = pd.read_csv("output1.csv")
cttr = data_df['CTTR']
print cttr
我有 12 行,我希望输出的行数与输入的行数相同。如果索引 [0] ,则 cttr[i-2] 和 cttr[i-1] 的值将 ==0;如果索引 [11] ,则 cttr[i+2] 和 cttrs[i+1] 的值将是==0。然后我想用 csv 的 CTTR 新值替换 CTTR 的原始值。
原始CTTR值
0
2
2
23
18
28
27
58
41
12
35
20
我期望的输出
0.6------> (0 + 2*0 + 4*0 + 2*2 + 2)/10
3.5 -----> (0 + 2*0 +4*2 +2*2 + 23)/10
7.6
16.2
20.3
28.3
33.9
40.8
36.6
27.8
24.5-----> (41 + 2*12 + 4*35 + 2*20 + 0)/10
16.2-----> (12 + 2*35 + 4*20 +2*0 + 0)/10
谢谢您!
您并不完全清楚您正在寻找的输出,但您可以做到的一种方法是:
vals = df.CTTR.values
np.array([vals[i-2] + 2*vals[i-1] + 4*vals[i] + 2*vals[i+1] + vals[i+2] for i in range(2,len(vals)-2)])/10.
也就是说,基本上你正在实现一个加权滚动平均值,我确信已经有一个实现(也许看看 pandas
rolling
)
如果您想在第一个/最后一个没有可用观测值的位置上有零,您可以这样做:
np.append(np.append([0,0],np.array([vals[i-2] + 2*vals[i-1] + 4*vals[i] + 2*vals[i+1] + vals[i+2] for i in range(2,len(vals)-2)])/10.),[0,0])
虽然这有点笨拙,所以你可能想将其包装在像这样的函数中:
def calc_new_cttr(series):
vals = series.values
cttrs = np.array([vals[i-2] + 2*vals[i-1] + 4*vals[i] + 2*vals[i+1] + vals[i+2] for i in range(2,len(vals)-2)])/10.
return np.append(np.append([0,0], cttrs),[0,0])
然后您可以像这样直接在您的系列上调用:
calc_new_cttr(data_df["CTTR"])
要写入 csv,您可以将转换后的列分配给数据框并使用 pandas csv writer 导出到 csv:
data_df["transformed_cttr"] = calc_new_cttr(data_df["CTTR"])
data_df.to_csv("/path/to/your/file.csv")
------------编辑-------------
您最新评论中描述的边界行为可以通过在应用转换之前简单地填充系列,然后返回结果数组而无需前两个条目来实现:
def cttr(series):
vals = np.append(np.append([0,0], series.values),[0,0])
cttrs = np.array([vals[i-2] + 2*vals[i-1] + 4*vals[i] + 2*vals[i+1] + vals[i+2] for i in range(2,len(vals)-2)])/10.
return cttrs