如何从pandas dataframe中的大型每日JSON数据集中计算月平均值?

2024-05-15 00:42:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我对使用pandas dataframes读取数据相对较新,使用数据集时遇到一些问题。我已经阅读了许多其他关于类似问题的StackOverflow文章,但是我在将这些解决方案应用到我的案例中时遇到了困难,可能是因为我的JSON数据的结构。我的JSON数据排列在我的数据框df = pd.DataFrame.from_records(data)中,通常如下所示

dateTime value 0 01/16/20 04:32:42 {'bpm': 70, 'confidence': 0} 1 01/16/20 04:32:57 {'bpm': 70, 'confidence': 0} 2 01/16/20 04:33:12 {'bpm': 70, 'confidence': 1}
等等,许多日常价值观。

我的目标是读取所有这些原始每日数据,计算“bpm”的月平均值,并绘制成matplot图。我的问题是我在使用pandas datetime或mean()操作时遇到问题,因为我认为pandas不接受datetime中的datetime格式,当我尝试使用mean()时,它会给我一个pandas.core.base.DataError: No numeric types to aggregate错误

我如何使用内置的pandas工具,通过根据月份将每日值分组计算月平均值

for file in os.listdir(data_dir): # look at every file in the folder if file.startswith("heart_rate") and file.endswith(".json"): # only want heart_rate-date.json files with open(os.path.join(data_dir, file)) as f: # open each file in data_dir data = json.load(f) df = pd.DataFrame.from_records(data) print(df) #df.dateTime = pd.to_datetime(df.dateTime) #df['Month'] = df['dateTime'].dt.month for i, j in enumerate(data): if data[i]['value']['confidence'] > 0: daily_avg_bpm += data[i]['value']['bpm'] daily_date = data[i]['dateTime'].split()[0] my_date = datetime.datetime.strptime(daily_date, "%m/%d/%y").date() days.append(my_date) months.append(daily_date[:2]) daily_avg_bpm /= len(data) dates.append(daily_date) avg_bpms.append(round(daily_avg_bpm)) f.close() plt.xlabel('Month') plt.ylabel('Heart Rate') plt.title("Fitbit Heart Rate") for i, j in enumerate(dates): plt.plot(dates[i], avg_bpms[i]) plt.show()

Tags: 数据inpandasdfdatadatetimedateplt
2条回答

我没有您的数据,因此这可能无法立即工作。但除了你应该能够使用这种方法

台阶

  1. value列的dict值转换为列(Reference
  2. 分组依据(Reference
  3. 平均值(Reference
import pandas as pd

df = pd.DataFrame.from_records(data)
# Step 1
df = pd.concat([df.drop(['value'], axis=1), df['value'].apply(pd.Series)], axis=1)
# Step 2
df.groupby(by=[df.dateTime])
# Step 3
print(df['bpm'].mean().sort_values())

最简单的方法是将values转换为列,并将dateTime转换为实际日期时间。这样,您就可以使用resample来聚合所需的频率:

import pandas as pd

data = pd.DataFrame({'dateTime':[ '01/16/20 04:32:42', '01/16/20 04:32:57', '02/16/20 04:33:12', '03/16/20 04:33:12'],
'value': [{'bpm': 70, 'confidence': 0}, {'bpm': 75, 'confidence': 0},  
          {'bpm': 73, 'confidence': 1}, {'bpm': 78, 'confidence': 1}]})

# expland 
df = data['value'].apply(pd.Series)

# to datetime and set index 
df['dateTime'] = pd.to_datetime(data['dateTime'])
df.set_index('dateTime', inplace=True)

# data resample to Monthy with mean 
example = df.resample('M', kind='period').mean()

# plot
example['bpm'].plot(title="Fitbit Heart Rate", xlabel="Month", ylabel="Heart Rate");

注:

对于要显示的图形,请确保您的数据为N>;所选频率的1。因此,如果月份的频率为“M”,请确保数据集中至少有2个月

有关更多详细信息,请阅读Pandas ^{}文档。

相关问题 更多 >

    热门问题