вычисление данных OHLC в pandas

#python #python-3.x #pandas

#python #python-3.x #pandas

Вопрос:

У меня есть файл CSV:

 _id,ltp,volume,time
5f4dde2e9f742701e3d9a15c,214.55,29077675,2020-09-01T11:07:50.000Z
5f4dde2f9f742701e3d9a15d,214.55,29077690,2020-09-01T11:07:50.000Z
5f4dde2f9f742701e3d9a15e,214.65,29077690,2020-09-01T11:07:51.000Z
5f4dde309f742701e3d9a15f,214.65,29077900,2020-09-01T11:07:51.000Z
5f4dde309f742701e3d9a160,214.6,29077900,2020-09-01T11:07:52.000Z
5f4dde319f742701e3d9a161,214.7,29078191,2020-09-01T11:07:53.000Z
5f4dde329f742701e3d9a162,214.6,29078769,2020-09-01T11:07:54.000Z
5f4dde339f742701e3d9a163,214.65,29078832,2020-09-01T11:07:55.000Z
  

Мне нужно вычислить OHLC из этих данных за заданный интервал. open является первым элементом в интервале, high является максимальным, low является минимальным, close является последним.

Это достигается следующим кодом, подобным этому:

 data = df.resample('1T').agg({'ltp': ['first', 'max', 'min', 'last'], 'volume': 'sum'})
  

проблема 1: я не могу отделить столбец open, high, low, close от приведенного выше кода, который находится внутри столбца ‘ltp’. Для доступа open мне нужно написать data['ltp']['first'] . (Но это незначительная проблема, которую можно игнорировать)

проблема 2. Основная проблема заключается в том, что при вычислении volume в настоящее время у меня есть sum , но на самом деле я хочу достичь этого, например, volume at 10:01:00 — это 100 и at 10:02:00 — это 200 так что общий объем за этот период времени 200-100 = 100 , как я могу этого добиться?

Ответ №1:

Для вашей первой проблемы вам просто нужно переименовать столбцы или понизить один уровень. Для вашей второй проблемы возьмите первую и последнюю и вычислите разницу:

 df = pd.DataFrame([["5f4dde2e9f742701e3d9a15c",214.55,29077675,"2020-09-01T11:07:50.000Z"],
["5f4dde2f9f742701e3d9a15d",214.55,29077690,"2020-09-01T11:07:50.000Z"],
["5f4dde2f9f742701e3d9a15e",214.65,29077690,"2020-09-01T11:07:51.000Z"],
["5f4dde309f742701e3d9a15f",214.65,29077900,"2020-09-01T11:07:51.000Z"],
["5f4dde309f742701e3d9a160",214.6,29077900,"2020-09-01T11:07:52.000Z"],
["5f4dde319f742701e3d9a161",214.7,29078191,"2020-09-01T11:07:53.000Z"],
["5f4dde329f742701e3d9a162",214.6,29078769,"2020-09-01T11:07:54.000Z"],
["5f4dde339f742701e3d9a163",214.65,29078832,"2020-09-01T11:07:55.000Z"]], columns = ["_id","ltp","volume","time"])

df["time"] = pd.to_datetime(df["time"])
df = df.set_index("time")
data = df.resample('1S').agg({'ltp': ['first', 'max', 'min', 'last'], 'volume': ['first','last']})

data.columns = ["_".join(x) for x in data.columns.ravel()]
data["volumne_metric"] = data["volume_last"]-data["volume_first"]
  

Вывод:

                          ltp_first  ltp_max ltp_min ltp_last volume_first volume_last volumne_metric
time                            
2020-09-01 11:07:50 00:00   214.55  214.55  214.55  214.55  29077675    29077690    15
2020-09-01 11:07:51 00:00   214.65  214.65  214.65  214.65  29077690    29077900    210
2020-09-01 11:07:52 00:00   214.60  214.60  214.60  214.60  29077900    29077900    0
2020-09-01 11:07:53 00:00   214.70  214.70  214.70  214.70  29078191    29078191    0
2020-09-01 11:07:54 00:00   214.60  214.60  214.60  214.60  29078769    29078769    0
2020-09-01 11:07:55 00:00   214.65  214.65  214.65  214.65  29078832    29078832    0