График изменения в реальном времени и фрейм данных pandas

#python #pandas #dataframe #matplotlib #graph

#python #pandas #фрейм данных #matplotlib #График

Вопрос:

У меня есть фрейм данных (df) с 2000 строками.

           from        close   min     max   
0       1607403960  1.21145 1.21145 1.21145 
1       1607404020  1.21145 1.21149 1.21145 
2       1607404080  1.21149 1.21155 1.21149 
3       1607404140  1.21155 1.21154 1.21154 
4       1607404200  1.21154 1.21154 1.21153 
...        ...        ...     ...     ...
1995    1607523660  1.21167 1.21150 1.21147 
1996    1607523720  1.21150 1.21144 1.21144 
1997    1607523780  1.21144 1.21129 1.21126 
1998    1607523840  1.21129 1.21141 1.21129 
1999    1607523900  1.21141 1.21149 1.21141 
 

Затем я отображаю это на графике:

 plt.figure(figsize=(16,8))
plt.title('Plot')
plt.plot(df['close'])
plt.xlabel('x axis', fontsize=18)
plt.ylabel('y axis', fontsize=18)
plt.show()
 

Я также получаю данные в реальном времени с форматом словаря по умолчанию, в котором больше категорий. Например:

 defaultdict(<class 'dict'>, {1607527380: {'active_id': 1, 'size': 60, 'at': 1607527422003075951, 'from': 1607527380, 'close': 1.607380, 'min': 1.527380, 'max': 1.7380}})
defaultdict(<class 'dict'>, {1607527380: {'active_id': 1, 'size': 60, 'at': 1607527422003075951, 'from': 1607527380, 'close': 1.607380, 'min': 1.527380, 'max': 1.7380}})
defaultdict(<class 'dict'>, {1607527380: {'active_id': 1, 'size': 60, 'at': 1607527422003075951, 'from': 1607527380, 'close': 1.607380, 'min': 1.527380, 'max': 1.7380}})
 

Я хочу добавить эти данные в мой предыдущий df в режиме реального времени. Как я могу это сделать? Как мне преобразовать этот формат в фрейм данных pandas? И тогда я подумал об использовании функции FuncAnimation из matplotlib для получения динамического графика. Как вы думаете, это лучший способ сделать это? Я ценю любую помощь. Спасибо.

Ответ №1:

Вы можете легко создавать pd.DataFrames со словарями. Затем их можно отфильтровать по именам столбцов, а полученные фреймы данных объединить. Смотрите код ниже:

 d1 = {
    1607527380: {
        "active_id": 1,
        "size": 60,
        "at": 1607527422003075951,
        "from": 1607527380,
        "close": 1.607380,
        "min": 1.527380,
        "max": 1.7380,
    }
}

d2 = {
    1607527380: {
        "active_id": 1,
        "size": 60,
        "at": 1607527422003075951,
        "from": 1607527380,
        "close": 1.607380,
        "min": 1.527380,
        "max": 1.7380,
    }
}


import pandas as pd

full_df = pd.DataFrame()
for D in (d1, d2):
    #you can create pd.DataFrames from dict(),  .T is used to flip the axis
    new_df = pd.DataFrame(D).T
    #by indexing, you can filter out columns
    reduced_df = new_df[["from", "close", "min", "max"]]
    # pd.concat() combines both dataframes
    full_df = pd.concat([full_df, reduced_df], ignore_index=True)

print(full_df)

"""
           from    close      min    max
0  1.607527e 09  1.60738  1.52738  1.738
1  1.607527e 09  1.60738  1.52738  1.738
"""
 

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

1. Большое вам спасибо! Теперь, что, если у меня нет словарей с именами (d1, d2, …)? Потому что я получаю их в реальном времени в формате, указанном выше (defaultdict(<class ‘dict’>, …). И как я могу добавить данные из full_df в исходный df (тот, который содержит 2000 строк) в режиме реального времени? То есть, когда я получаю новый словарь, я хочу добавить это в df. Должен ли я также использовать pd.concat()?