Получите минимум за счет итераций записи в кадре данных pandasPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Получите минимум за счет итераций записи в кадре данных pandas

Сообщение Anonymous »

Я создал следующий фрейм данных pandas:

Код: Выделить всё

import pandas as pd
import numpy as np

ds = { 'trend' : [1,1,1,1,2,2,3,3,3,3,3,3,4,4,4,4,4], 'price' : [23,43,56,21,43,55,54,32,9,12,11,12,23,3,2,1,1]}

df = pd.DataFrame(data=ds)
Кадр данных выглядит следующим образом:

Код: Выделить всё

display(df)

trend   price
0      1     23
1      1     43
2      1     56
3      1     21
4      2     43
5      2     55
6      3     54
7      3     32
8      3     9
9      3     12
10     3     11
11     3     12
12     4     23
13     4     3
14     4     2
15     4     1
16     4     1
Я сохранил фрейм данных в файл .csv с именем df.csv:

Код: Выделить всё

df.to_csv("df.csv", index = False)
Мне нужно создать новое поле с именем «минимум», которое:
  • обходит каждую запись кадра данных
  • берёт минимум между ценой, наблюдаемой на каждой итерации, и последней ценой, наблюдаемой в предыдущем тренде.
Например:
  • Я повторяю запись 0, а минимальная цена равна 23 (есть только этот).
  • Я перебираю запись 1 и беру минимум между 43 и 23: результат — 23.
Перенесемся к записи 4.
  • Мне нужно вычислить минимум между ценой, наблюдаемой в записи 4 (

    Код: Выделить всё

    price: 43
    ) и последняя цена, наблюдаемая для предыдущего тренда (

    Код: Выделить всё

    price: 21). Результат: 21.
    [/list]
    Перенесемся к записи 14.
    [list]
    [*]Мне нужно чтобы вычислить минимум между ценой
    , наблюдаемой в записи 14 (

    Код: Выделить всё

    price: 2
    ) и последняя цена, наблюдаемая для предыдущего тренда (

    Код: Выделить всё

    price: 12). Результат — 2.
    [/list]
    И так далее.
    Затем я написал такой код:
    minimum = []
    
    for i in range(len(df)):
    ds = pd.read_csv("df.csv", nrows=i+1)
    d = ds.groupby('trend', as_index=False).agg(
    {'price':'last'})
    
    d['minimum'] = d['price'].min()
    minimum.append(d['minimum'].iloc[-1])
    
    ds['minimum'] = minimum
    
    Результирующий фрейм данных выглядит следующим образом:
    display(ds)

    Код: Выделить всё

            trend   price   minimum
    0          1     23         23
    1          1     43         43
    2          1     56         56
    3          1     21         21
    4          2     43         21
    5          2     55         21
    6          3     54         21
    7          3     32         21
    8          3      9          9
    9          3     12         12
    10         3     11         11
    11         3     12         12
    12         4     23         12
    13         4      3          3
    14         4      2          2
    15         4      1          1
    16         4      1          1
    
    Полученный фрейм данных правильный.
    Проблема в том, что мне нужно применить этот процесс к фрейму данных, который содержит около 1 миллиона записей, и он будет на это уйдет около 48 лет.
    Кто-нибудь знает более быстрый способ получить те же результаты, что и выше?

    Подробнее здесь: https://stackoverflow.com/questions/786 ... -dataframe
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»