Сначала я бы рекомендовал прочитать CSV и установить TIME в качестве индекса:
import pandas as pd
import numpy as np
df = pd.read_csv(csv_file, delim_whitespace=True)
df['TIME'] = pd.to_datetime(df['TIME'], unit='s')
df.set_index('TIME', inplace=True)
В случае, если вы просто хотите уменьшить временные интервалы до другого (например, до go с текущую 1 минуту до 5 минут), вы можете легко повторить выборку, используя метод Dataframe.resample :
# Tells what the aggregation should do for each column
colls_agg = {'OPEN': lambda x: x.iloc[0],
'HIGH': 'max',
'LOW': 'min',
'CLOSE': lambda x: x.iloc[-1],
'VOLUME': 'sum'}
def get_summary(df, time_interval):
# Tells what the aggregation should do for each column
return df.resample(pd.Timedelta(time_interval)).agg(colls_agg)
Если вы хотите, чтобы каждая строка вашего фрейма данных соответствовала сводку за последние X минут (что, я думаю, именно то, что вам нужно), вам необходимо пересчитать ее для каждой строки, как показано ниже.
colls_agg = {'OPEN': lambda x: x.iloc[0],
'HIGH': 'max',
'LOW': 'min',
'CLOSE': lambda x: x.iloc[-1],
'VOLUME': 'sum'}
def recompute_summary_line(line, full_df, time_interval):
"""Recomputes the summary for a line of the dataframe.
line should be a line of the dataframe,
full_df is the full dataframe
time_interval is the interval of time which will be selected"""
# Selects time betwen current time - time_interval
# until current time (including it)
lines_to_select = (full_df.index > line.name - time_interval) & \
(full_df.index <= (line.name))
agg_value = full_df[lines_to_select].agg(colls_agg)
# For the first few lines, this is not possible, so it returns nan
# Since we have included the current time, it will never happen.
# If you do NOT to include the current time, you might use this.
if agg_value.empty:
return pd.Series({'OPEN': np.nan, 'HIGH': np.nan,
'LOW': np.nan, 'VOLUME': np.nan})
return agg_value
def recompute_summary (df, time_interval):
"""Given a dataframe df, recomputes the summary for the
current time of each row using the information from the the previous
interval given in time_interval (for example '5min', '30s')"""
# Use df.apply to apply it in each line of the dataframe
return df.apply(lambda x: recompute_summary_line(
x, df, pd.Timedelta(time_interval)), axis='columns')
recompute_summary(df, '1min')
recompute_summary(df, '12h')