在这个prices.csv中,这些价格列的结构如下:
Date price1 price2 price3 ... price7 price8 price9 price10
2018-10-18 11.49 7.32 7.31 ... 13.47 8.04 4.5055 9.67
2018-10-19 11.51 7.29 7.29 ... 13.41 8.09 4.5149 9.71
2018-10-22 11.47 7.29 7.26 ... 13.33 7.96 4.4772 9.65
2018-10-23 11.48 7.31 7.28 ... 13.34 7.80 4.4583 9.52
2018-10-24 11.58 7.35 7.23 ... 13.32 7.54 4.4206 9.27
我使用以下代码计算了这些价格的比率:
cols = list(df.columns[1:])
for i,c in enumerate(cols[:-1]):
for c2 in cols[i+1:]:
df['{}/{}'.format(c,c2)] = df[c]/df[c2]
length = len(df['{}/{}'.format(c,c2)].index)
start = df['{}/{}'.format(c,c2)].iloc[0]
end = df['{}/{}'.format(c,c2)].iloc[length-1]
change = str((end - start)/start)
这样将列添加到df中:
price1/price2, price1/price3, price1/price4 ...
这是完美的,但是,我实际上不希望新列仅将比率列的总收益(由“ change”计算)存储为以下格式:
PAIR RETURNS
price1/price2 0.012670773595482977
price1/price3 0.06298657186450757
price1/price4 0.06786323591797078
... ...
编辑:
df = pd.read_csv("price1.csv")
fieldnames = ["PAIR", "RETURNS"]
with open('results.csv', 'w') as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
cols = list(df.columns[1:])
for i,c in enumerate(cols[:-1]):
for c2 in cols[i+1:]:
df['{}/{}'.format(c,c2)] = df[c]/df[c2]
length = len(df['{}/{}'.format(c,c2)].index)
start = df['{}/{}'.format(c,c2)].iloc[0]
end = df['{}/{}'.format(c,c2)].iloc[length-1]
change = str((end - start)/start)
print(length)
print(start)
print(end)
print(change)
row = {"PAIR": df, "RETURNS": change}
writer.writerow(row)
此代码成功地将“更改”放入右列,但未正确将线对名称与行关联。同样由于某些原因,行之间也有空格:
EDIT2: print(df)和print(change)的输出如下(请注意,随着for循环继续运行,值会发生变化:
0.06298657186450757
Date price1 price2 ... price10 price1/price2 price1/price3
0 2018-10-18 11.49 7.32 ... 9.67 1.569672 1.571819
1 2018-10-19 11.51 7.29 ... 9.71 1.578875 1.578875
2 2018-10-22 11.47 7.29 ... 9.65 1.573388 1.579890
3 2018-10-23 11.48 7.31 ... 9.52 1.570451 1.576923
4 2018-10-24 11.58 7.35 ... 9.27 1.575510 1.601660
我需要找到一种方法来隔离df中的标头。
答案 0 :(得分:1)
我不确定我是否完全理解您的问题...但是似乎您已经拥有"PAIR"
列和"RETURNS"
列的值,并且只想生成它的值标题为result.csv
和"PAIR"
的{{1}}像这样:
"RETURNS"
在python中,您可以将CSV文件定义为一种“字典”,其中标头是“键” ,然后,每一行都可以定义为字典,您可以将行中的每个值与它的键标题关联,如下所示:
PAIR RETURNS
price1/price2 0.012670773595482977
price1/price3 0.06298657186450757
price1/price4 0.06786323591797078
... ...
您将获得:
import csv:
with open('test.csv', 'w') as f:
writer = csv.DictWriter(f, fieldnames=["HEADER_1","HEADER_2"])
row_1 = {"HEADER_1": "under header 1",
"HEADER_2": "under header 2"}
writer.writerow(row_1)
您的解决方案是(我假设您有一个包含对的python列表,另一个包含您的退货的python列表,并且两个列表的长度相同):
HEADER_1 HEADER_2
under header 1 under header 2
... ...
为了动态使用您的代码,我认为应该是这样的:
import csv
pairs = your_list_of_pairs
returns = your_list_of_returns
fieldnames = ["PAIR", "RETURNS"]
with open('results.csv', 'w') as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
for i in range(0, len(pairs):
row = {"PAIR": pairs[i], "RETURNS":returns[i]}
writer.writerow(row)