我刚开始使用pandas数据框读取数据,但是在处理数据集时遇到了一些麻烦。我已经阅读过许多其他关于类似问题的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
错误。
如何使用内置的熊猫工具通过将基于月的每日值分组在一起来计算月平均值?
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()
将其转换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个月。
阅读 Pandasresample
文档以获取更多详细信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句