我上传的数据links是监控站全年的con的时间序列数据。数据格式如下所示:
为了研究样本的时间模式,我想绘制每月样本的变化。
就像我从plot.ly下载的下图。每个框表示原始数据的每日平均样本。每月平均值由线条概述。
使用groupby
函数或pd.pivot
函数,我可以轻松获取某些月份或每日数据的子集。
但我发现生成a bunch of dataframes
很难。每个应包含特定月份的每日平均数据。
通过预先定义12个空数据帧,我可以生成12个满足我需求的数据帧。 但是有没有任何巧妙的方法来划分原始数据帧,然后根据用户定义的条件生成多个数据帧。
受到@alexis答案的启发。我试图用这些代码实现我的目标。它对我有用。
## PM is the original dataset with date, hour, and values.
position = np.arange(1,13,1)
monthDict = {1:'Jan', 2:'Feb', 3:'Mar', 4:'Apr', 5:'May', 6:'Jun',
7:'Jul', 8:'Aug', 9:'Sep', 10:'Oct', 11:'Nov', 12:'Dec'}
pm['label'] = np.nan
for i in range(0,len(pm),1):
pm['label'].iloc[i] = monthDict.get(int(pm['date'].str[4:6].iloc[i]))
## Create an empty dataframe for containing the daily mean value.
df = pd.DataFrame(np.nan, index=np.arange(0,31,1), columns=['A'])
for i,t in enumerate(pm.label.unique()):
df[str(t)] = np.nan
df = df.drop(['A'],1)
mean_ = []
for i in range(0,len(pm.label.unique()),1):
month_data = pm.groupby(['label']).get_group(pm.label.unique()[i]).groupby(pm['date'].str[6:8])['pm25'].mean()
mean_.append(month_data.mean())
for j in range(0,len(month_data),1):
df[pm.label.unique()[i]].iloc[j] = month_data[j]
#### PLOT
fig = plt.figure(figsize=(12,5))
ax = plt.subplot()
bp = ax.boxplot( df.dropna().values, patch_artist=True, showfliers=False)
mo_me = plt.plot(position,mean_, marker = 'o', color ='k',markersize =6, label = 'Monthly Mean', lw = 1.5,zorder =3)
cs = ['#9BC4E1','k']
for box in bp['boxes']:
box.set(color = 'b', alpha = 1)
box.set(facecolor = cs[0], alpha = 1)
for whisker in bp['whiskers']:
whisker.set(color=cs[1], linewidth=1,linestyle = '-')
for cap in bp['caps']:
cap.set(color=cs[1], linewidth=1)
for median in bp['medians']:
median.set(color=cs[1], linewidth=1.5)
ax.set_xticklabels(pm.label.unique(), fontsize = 14)
# ax.set_yticklabels(ax.get_yticks(), fontsize = 12)
for label in ax.yaxis.get_ticklabels()[::2]:
label.set_visible(False)
for tick in ax.yaxis.get_major_ticks():
tick.label.set_fontsize(14)
plt.ylabel('Concentration', fontsize = 16, labelpad =14)
plt.xlabel('Month', fontsize = 16, labelpad =14)
plt.legend(fontsize = 14, frameon = False)
ax.set_ylim(0.0, 178)
plt.grid()
plt.show()
这是我的输出数字。
有关我的数据管理或可视化代码的任何建议都将不胜感激!
答案 0 :(得分:1)
不要生成12个数据帧。不要将数据拆分成多个类似的变量,而是添加一个列,指示每行应属于哪个组。这是数据库表,数据框等的标准做法(有充分理由)。
在数据集上使用groupby
按月对数据进行分组,然后在生成的apply()
对象上使用DataFrameGroupBy
来限制您想要的任何分析(例如,每个组的平均值)。这也可以很容易地将月度结果绘制在一起。
您没有提供任何代码,因此很难具体而言。显示按月分组数据的方式以及您希望对月度数据框执行的操作,我将向您展示如何通过groupby对象将其限制为每月。