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
Я хочу сделать месячную гистограмму (НОРМАЛИЗОВАННУЮ) для данных о давлении и, наконец, записать графики в 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().
Я попробовал вышеуказанные коды, но получил эти ошибки. Не уверен, правильно ли я это использую.
1 ответ
Несколько простых шагов. Сначала вам нужно прочитать ваш файл данных в массив ячеек. как только у вас есть список списков или строк записи (как вы хотите их называть), вам нужно собрать все наблюдения за каждый месяц и взять среднее значение для каждой коллекции. Здесь я реализовал простой класс ведра, чтобы упростить агрегацию нагрузок по группам по месяцам и предоставить среднее значение для каждой группы. Наконец, я нанес результат с помощью 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, так что вам, возможно, придется изменить разделитель или очистить таблица, чтобы убедиться, что все строки прочитаны без ошибок.