#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()?