如何将结果从一种CSV写入另一种?

时间:2019-07-09 15:08:04

标签: python pandas csv

在这个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)

此代码成功地将“更改”放入右列,但未正确将线对名称与行关联。同样由于某些原因,行之间也有空格:

enter image description here

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中的标头。

1 个答案:

答案 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)