Как я могу записать результаты из одного CSV в другой? - PullRequest
0 голосов
/ 09 июля 2019

У меня есть эти столбцы цен в этих ценах. 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 ...

Что идеально, однако я не хочу, чтобы новые столбцы просто сохраняли общий результат возвращаемых столбцов отношения (рассчитанный по «изменению») в results.csv в следующем формате:

    PAIR              RETURNS
price1/price2    0.012670773595482977 
price1/price3    0.06298657186450757
price1/price4    0.06786323591797078
     ...                 ...

EDIT:

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 Ответ

1 голос
/ 09 июля 2019

Я не уверен, что полностью понимаю ваш вопрос ... но похоже, что у вас уже есть значения для вашего столбца "PAIR" и для вашего столбца "RETURNS", и единственное, что вы хотите, это произвести result.csvс заголовками "PAIR" и "RETURNS" следующим образом:

   PAIR              RETURNS
price1/price2    0.012670773595482977 
price1/price3    0.06298657186450757
price1/price4    0.06786323591797078
     ...                 ...

В python вы можете определить файл CSV как своего рода «словарь», где ваши заголовки являются «ключи» , тогда каждая строка может быть определена как словарь, и вы можете связать каждое значение в вашей строке с заголовком ключа следующим образом:

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)

И вы получите:

HEADER_1          HEADER_2
under header 1    under header 2
     ...                 ...

Ваше решение будет таким (я предполагаю, что у вас есть список python, содержащий ваши пары, другой список python, содержащий ваши возвращения, и оба списка имеют одинаковую длину):

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)

Для динамического использования вашего кода, я думаю, будет что-то вроде этого:

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)

    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)

            row = {"PAIR": df, "RETURNS":change}
            writer.writerow(row)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...