Python: график месячной нормализованной гистограммы - PullRequest
0 голосов
/ 20 мая 2018

У меня есть 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 Ответ

0 голосов
/ 22 мая 2018

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

...