Как манипулировать строками / заголовками фрейма данных pandas? Как указать, является ли цена строки выше или ниже предыдущей цены?

#python #pandas #dataframe #header #rows

#python #pandas #фрейм данных #заголовок #строки

Вопрос:

У меня есть фрейм данных, который выглядит следующим образом:

                             NDAQ    NDAQ    NDAQ    NDAQ    NDAQ     Close_Price_Increase
                            open    high    low     close   volume
time                    
2020-08-26 09:30:00-04:00   130.71  130.87  130.39  130.86  1824
2020-08-26 09:45:00-04:00   131     131.71  131     131.22  3420
2020-08-26 10:00:00-04:00   131.13  131.13  130.76  130.76  508
...                         ...     ...     ...     ...     ...
  

Я бы хотел, чтобы это выглядело так:

 Date                        Open    High    Low     Close   Volume   Close_Price_Increase
2020-08-26 09:30:00-04:00   130.71  130.87  130.39  130.86  1824     ...
2020-08-26 09:45:00-04:00   131     131.71  131     131.22  3420     1
2020-08-26 10:00:00-04:00   131.13  131.13  130.76  130.76  508      0
...                         ...     ...     ...     ...     ...      ...
  

Данные загружаются в этом формате. Я использую API Alpaca для загрузки указанных данных и преобразования в фрейм данных с помощью этого кода:

 df_ticker = api_alpaca.get_barset(
    symbols=['NDAQ'],
    start=pd.Timestamp(str(df_transposed['Interval_Date'].iloc[0])   '-04:00', tz='America/New_York').isoformat(),
    end=pd.Timestamp(str(df_transposed['Interval_Date'].iloc[-1])   '-04:00', tz='America/New_York').isoformat(),
    timeframe='15Min'
).df
  

Я пытался:

 df_ticker.rename(columns=df.iloc[0,2]).drop(df.index[0,2])
idx = df.Index(['time'], name='time')
idx.rename('Date')
  

безрезультатно.

Я также пытаюсь показать, увеличилась ли цена за данный интервал (обозначив его как 1) или уменьшилась (обозначив его как 0). Я пытался:

 def getPrice():
    i = 0
    row = len(df_ticker)
    for i in row:
        if df_ticker['close'].iloc[i]> df_ticker['close'].iloc[i-1]:
            i = i   1
            return 1
        else:
            i = i   1
            return 0
df_ticker.insert(loc=5, column='Price_Change', value=getPrice)
  

Я не думаю, что итерация по фрейму данных является самым мудрым выбором.

Ответ №1:

 df=df.reset_index() #now your first column date should go as column

new_names=['Date','Open','High','Low','Close','Volume','Close_Price_Increase']

df.columns=new_names #now you should replace old column names, remeber that number of elements in list (new_names) should be equal to number of columns in your df
  

Комментарии:

1. Спасибо, но я получаю ValueError: несоответствие длины: ожидаемая ось имеет 11 элементов, новые значения имеют 7 элементов

2. как я уже упоминал, ваш список должен содержать такое же количество элементов, что и ваш фрейм данных. Кажется, что в вашем исходном фрейме данных 11 столбцов, поэтому в вашем new_names должно быть 11 элементов, а не 7

3. Я разобрался с именами заголовков. Спасибо. Есть ли шанс, что вы знаете, как сравнивать строки, чтобы показать увеличение / уменьшение?

4. если вы хотите показать увеличение и т.д. у вас должно быть два фрейма данных для сравнения, задайте другой вопрос или отредактируйте этот, с pd.DataFrame(data) которым мы можем работать

Ответ №2:

Решенное сравнение по строкам с:

 df_ticker['Price_Change'] = np.where(df_ticker['Close'] >= df_ticker['Close'].shift(1), 1,0)