python - Python:绘制按月归一化的直方图
问题描述
我有一个CSV
包含如下数据的文件:
Time Pressure
1/1/2017 0:00 5.8253
... ...
3/1/2017 0:10 4.2785
4/1/2017 0:20 5.20041
5/1/2017 0:30 4.40774
6/1/2017 0:40 4.03228
7/1/2017 0:50 5.011924
12/1/2017 1:00 3.9309888
我想在压力数据上制作每月直方图(NORMALIZED),最后将图表写入 PDF。我知道我需要使用Groupby
和Numpy.hist
选项,但我不确定如何使用它们。(我是 Python 的新手)。请帮忙!
代码 1:
n = len(df) // 5
for tmp_df in (df[i:i+n] for i in range(0, len(df), n)):
gb_tmp = tmp_df.groupby(pd.Grouper(freq='M'))
ax = gb_tmp.hist()
plt.setp(ax.xaxis.get_ticklabels(),rotation=90)
plt.show()
plt.close()
这给了我以下错误消息:
ValueError: range() arg 3 must not be zero
代码 2:
df1 = df.groupby(pd.Grouper(freq='M'))
np.histogram(df1,bins=10,range=None,normed=True)
这将返回另一条错误消息:
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我尝试了上面的代码,但得到了这些错误。不确定我是否正确使用它。
解决方案
几个简单的步骤。首先,您需要将数据文件读入一组单元格。一旦你有了列表或条目行的列表(你想怎么称呼它们),你需要收集每个月的所有观察结果并取每个集合的平均值。在这里,我实现了一个简单的 buckets 类,以方便将压力汇总到我的月份中的组中,并为每个组提供平均值。最后我用 matplotlib 绘制了结果。
def readData(fn):
fh = open(fn)
lines = fh.read().split("\n")
ret = [k.split(" ") for k in lines[1:]]
fh.close()
return(ret)
class buckets:
def __init__(self):
self.data = {}
def add(self,key,value):
if not(key in self.data.keys()):
self.data[key]=[]
self.data[key].append(value)
def getMean(self,key):
nums = []
for k in range(0,len(self.data[key])):
try:
nums.append(self.data[key][k])
except:
pass
return(sum(nums)/float(len(nums)))
def keys(self):
return(self.data.keys())
import matplotlib
import numpy as np
data = readData("data.txt")
container = buckets()
for k in data:
print(k)
container.add(k[0].split("/")[0],float(k[1]))
histoBars = []
histoTicks = [int(k) for k in list(container.keys())]
histoTicks.sort()
histoTicks = [str(k) for k in histoTicks]
x = np.arange(len(histoTicks))
for k in histoTicks:
histoBars.append(container.getMean(k))
print(len(histoBars))
print(len(histoTicks))
import matplotlib.pyplot as plt
print(histoBars)
print(histoTicks)
fig, ax = plt.subplots()
plt.bar(x, histoBars)
plt.xticks( x, histoTicks )
plt.show()
最后一个快速说明,我不太确定您的文件是什么数据格式,看起来 2 列被 7 个空格分隔,但其中一个样本只有 6 个,因此您可能需要更改分隔符或清理表以确保所有行读取没有错误。
推荐阅读
- wso2 - 通过不同的服务器对用户进行身份验证,在 WSO2 中生成 JWT
- reporting-services - 使用 IIf 和 First 聚合在报表生成器上设置表达式不起作用
- c++ - 使用模板方法为类定义非模板方法
- c - 与 '#define' 相比,'inline __attribute__ ((forced_inline))' 的缺点是什么?
- javascript - 如何将此选定的文本放入DIV而不是textarea,并将所有选定的部分一一收集到div中
- python-3.x - 基于匹配字符串从更大的列表列表中提取子列表项
- linux - 是否可以在本地网络机器上拥有用户友好的 IP 地址?
- flutter - 我总是在颤抖中导航到空白页面
- regex - 正则表达式如何匹配[]中的任何空格
- css - 使用 Parcel bundler 构建时如何防止组合 CSS 规则?