как рассчитать «3day_before_change» в файле csv - PullRequest
0 голосов
/ 06 августа 2020

У меня есть файл CSV с историческими данными по компании. Он содержит: цену открытия, цену закрытия, объем и т.д. c. Но мне нужно добавить в файл столбец «3day_before_change», в котором для каждой записи должно быть отношение цены закрытия текущей записи к цене закрытия записи 3 дня a go.

Если бы у меня были все даты, возможно, это было бы легко выполнить в цикле. Но некоторые даты отсутствуют, и это меня останавливает. Может, есть какой-нибудь инструмент для выполнения таких задач?

В конце должно быть так:

введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Это действительно работает в собственном python:

from collections import OrderedDict
import datetime, csv
    
date_format = '%Y-%m-%d'

source = open(***<<your cvs name>>***,'r').read()
header = source.split('\n')[0].split('\t') # \t as a delimiter in your csv. Could be ',' or whatever else you have

data = OrderedDict()

# prepare the dictionary
for head in header:    
    data[head] = []
    
# add desired column
data['3day_before_change'] = []

# fill the dictionary with values
for i, line in enumerate(reversed(source.split('\n')[1:])):
    for idx, line_data in enumerate(line.split('\t')):        
        list(data.items())[idx][1].append(line_data)
    
    list(data.items())[idx+1][1].append('-')
       
    # check if there's a '3 day before' value, add the ratio
    curDay = datetime.datetime.strptime(list(data.items())[0][1][-1], date_format)
    threeDays_before = curDay - datetime.timedelta(days=3)    
    
    if threeDays_before.strftime(date_format) in list(data.items())[0][1]:
        curVal = eval(data['Close*'][i])
        threeDayVal = eval(data['Close*'][list(data.items())[0][1].index(threeDays_before.strftime(date_format))])
        
        data['3day_before_change'][i] = curVal/threeDayVal

l=[]
for lst in data.values():
    l.append(lst)
l=zip(*l)
l=reversed(list(l))

with open('output.csv', 'w', newline='') as f:
    writer = csv.writer(f, delimiter="\t")
    writer.writerow(data.keys())
    for line in l:
        writer.writerow(line)
0 голосов
/ 06 августа 2020

IIU C вы можете расширить свой DF, используя reindex день за днем, cal c '3_day_change', используя .shift() и отбросив все строки, где close нулевые

df['date'] = pd.to_datetime(df['date'])
df.set_index('date',inplace=True)
df = df.reindex(pd.date_range(df.index.min(), df.index.max(), freq='D'))
df['3day_before_change'] = df['close'] / df['close'].shift(3)
df.loc[df['close'].notnull()]

теоретически он должен работать с данными в изображении, но я не смог воспроизвести ответ, потому что ваши данные не в текстовом формате

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...