Сравнение двух фреймов данных с одинаковой формой и итерация по строкам, вычисление pct_change от df1 - line1 до df2 - line1 - PullRequest
0 голосов
/ 27 апреля 2020

У меня проблема с вычислением разницы (в%) для двух фреймов данных, имеющих одинаковую форму (datetimeindex + столбцы 0-2000). Я хотел бы сравнить значения строк df1 со строками d2 (df1 line1 с df2 line1, df1 line2 с df2 line2 et c.) И вычислить разницу между двумя значениями и сохранить результат в новом dataframe. Я хочу сравнить значения по столбцам, которые попадают в одно и то же время (например, 12:01), но у фреймов данных есть значения из разных дней (время одинаковое).

Это примеры данных:

df1

                       A       B       
time      
2019-04-20 12:01       12     0.5      
2019-04-20 12:02       14      1      
2019-04-20 12:03       15     0.2     
2019-04-20 12:04       18      5       
2019-04-20 12:05       9       6       

df2:

                       A       B       
time      
2019-04-21 12:01       10     0.5      
2019-04-21 12:02       11     1.5    
2019-04-21 12:03        5      4      
2019-04-21 12:04       20      3       
2019-04-21 12:05        3      6     

ожидаемый результат:

             A          B       
time      
12:01       -16.67       0      
12:02       -21.43      50     
12:03       -66.67    1900     
12:04        11.11     -40       
12:05       -66.67       0      

В качестве первого шага я уже попробовал pandas функции слияния и объединения, но они не дают желаемого результата.

Затем я попытался написать функцию:

def merge_calculate(df1, df2):

    if len(df1) == len(df2):
    return(((df2.values - df1.values)/df1.values)*100) #df1.values = start value, df2.values = end value

Функция дает мне массив, но я не уверен, что вычисления были выполнены так, как я хотел.

Я благодарен за любой вклад! Спасибо

1 Ответ

0 голосов
/ 27 апреля 2020
import datetime as dt
diff = -(df1.values - df2.values)/df1.values*100
date_time = [dt.datetime.strptime(d, "%Y-%m-%d %H:%M") for d in list(df1.index)]
time = [dt.datetime.time(d) for d in date_time]
df3=pd.DataFrame(data=diff,columns=df1.columns,index=time)

Объяснение:

  • diff - это сравнение между df1 и df2, и это 2-d numpy массив
  • Вам необходимо назначить индекс и столбцы для diff, чтобы сделать его фреймом данных:
  • data=diff назначает данные для фрейма данных
  • columns просто равно columns=df1.columns
  • index=time * time, извлеченный из datetime

print (df3), дает вывод:

                 A       B
    12:01:00 -16.666667    -0.0
    12:02:00 -21.428571    50.0
    12:03:00 -66.666667  1900.0
    12:04:00  11.111111   -40.0
    12:05:00 -66.666667    -0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...