Как изменить csv?
Работает на чтение, но не меняет значение в файле:
import csv
directory="C:\\Users\\pyth\\output_3.csv"
with open(directory, 'r+') as f:
d_reader = csv.DictReader(f,delimiter='\t')
for row in d_reader:
if float(row['Open']) > float(row['Close']):
row['CLINE_TYPE'] = '1_MIN'
else : row["CLINE_TYPE"] = '1_MAX'
Как написать на Pandas вложенные операторы ветвления?
Цель: найти строки следующие друг за другом с разницей 5 минут, при условии где в первой строке open > close, а во второй open < close или в первой строке open < close, а во второй open > close.
Пример из жизни: в каких двух днях прошлого года температура утра вчерашнего дня было больше температуры вечера вчерашнего дня , а температура вечера следующего дня больше температура утра следующего дня или наборот.
Логика: Из входных данных, нужно отобрать пару строк, которые удовлетворяют следующим условиям: 1) между строками разница 5 минут по полю "OPEN TIME" (то есть следующая подряд) 2) если в первой строке значения в полях "OPEN" строго больше значения поля "Close", то на второй строке OPEN строго меньше CLOSE, или наоборот. Если, условия выполняются, то записывается значения времени в переменную date_cline_up в случае "CLOSE" > "OPEN", date_cline_dow в случае "CLOSE" < "OPEN", и идёт запись в файл. Далее цикл ищет вторую пару строк удовлетворяющие условиям. Если, условие не выполняется, то значения date_cline_up или date_cline_dow перезаписываются в Nan, в зависимости от того какая первая строка была первой в паре или в каждой последующей паре. Из входных данных получается следующие строки выполняют условия: строки 0-1 будут содержать надпись в поле CLINE_TYPE -'1_MAX', и в строках, 2-3 1_MAX. Код в "полное условие" полностью покрывает описанную логику.
Входные данные :
Open Time Close time Open Close STATUS CLINE_TYPE
0 2021-11-06 13:25:00 2021-11-06 13:29:59.999000064 60534.13 60509.9
1 2021-11-06 13:30:00 2021-11-06 13:34:59.999000064 60509.89 60570.01
2 2021-11-06 13:35:00 2021-11-06 13:39:59.999000064 60570.01 60469.34
3 2021-11-06 13:40:00 2021-11-06 13:44:59.999000064 60469.34 60546.6
Полное условие:
date_cline_up=None
date_cline_dow=None
for row in d_reader:
curent_date = datetime.strptime(row["Open Time"], '%Y-%m-%d %H:%M:%S')
if date_cline_up is None and date_cline_dow is None:
if float(row["Open"]) > float(row["Close"]):
date_cline_dow = datetime.strptime(row["Open Time"], '%Y-%m-%d %H:%M:%S')
elif float(row["Open"]) < float(row["Close"]):
date_cline_up = datetime.strptime(row["Open Time"], '%Y-%m-%d %H:%M:%S')
elif date_cline_up is None and date_cline_dow is not None:
if (((curent_date - date_cline_dow).total_seconds()) % 3600 // 60) == 5 and float(row["Open"]) < float(row["Close"]):
row["CLINE_TYPE"] = '1_MIN'
else:
date_cline_dow = None
elif date_cline_up is not None and date_cline_dow is None:
if (((curent_date - date_cline_up).total_seconds()) % 3600 // 60) == 5 and float(row["Open"]) > float(row["Close"]):
row["CLINE_TYPE"] = '1_MAX'
else:
date_cline_up = None
Ответы (1 шт):
Если я правильно понял вопрос...
Сначала добавим вспомогательные столбцы со значениями из "следующей" строки:
df[["Open2", "Close2"]] = df[["Open", "Close"]].shift(-1)
получилось:
In [13]: df
Out[13]:
Open Time Close time Open Close Open2 Close2
0 2021-11-06 13:25:00 2021-11-06 13:29:59.999000064 60534.13 60509.90 60509.89 60570.01
1 2021-11-06 13:30:00 2021-11-06 13:34:59.999000064 60509.89 60570.01 60570.01 60469.34
2 2021-11-06 13:35:00 2021-11-06 13:39:59.999000064 60570.01 60469.34 60469.34 60546.60
3 2021-11-06 13:40:00 2021-11-06 13:44:59.999000064 60469.34 60546.60 NaN NaN
теперь можно фильтровать:
In [15]: df["Open Time"].diff().dt.total_seconds().fillna(300).eq(300) & (np.sign((df["Open"] - df["Close"]) * (df["Open2"] - df["Close2"])) < 0)
Out[15]:
0 True
1 True
2 True
3 False
dtype: bool
In [16]: df[df["Open Time"].diff().dt.total_seconds().fillna(300).eq(300) & (np.sign((df["Open"] - df["Close"]) * (df["Open2"] - df["Close2"])) < 0)]
Out[16]:
Open Time Close time Open Close Open2 Close2
0 2021-11-06 13:25:00 2021-11-06 13:29:59.999000064 60534.13 60509.90 60509.89 60570.01
1 2021-11-06 13:30:00 2021-11-06 13:34:59.999000064 60509.89 60570.01 60570.01 60469.34
2 2021-11-06 13:35:00 2021-11-06 13:39:59.999000064 60570.01 60469.34 60469.34 60546.60