Numpy: загрузить несколько файлов CSV в качестве словарей - PullRequest
0 голосов
/ 19 февраля 2019

Я хотел использовать метод numpy loadtxt , чтобы прочитать .csv файлы для моего эксперимента.У меня есть три разных данных временных рядов следующего формата с разными характеристиками, где первый столбец является меткой времени, а второй столбец является значением.

0.086206438,10
0.086425551,12
0.089227066,20
0.089262508,24
0.089744425,30
0.090036815,40
0.090054172,28
0.090377569,28
0.090514071,28
0.090762872,28
0.090912691,27

Для воспроизводимости я поделился данными трех временных рядовЯ использую здесь .

Если я сделаю это, как показано ниже

import numpy as np

fname="data1.csv"

col_time,col_window = np.loadtxt(fname,delimiter=',').T

Он работает нормально, как и предполагалось.Однако вместо того, чтобы читать только один файл, я хочу передать словарь в col_time,col_window = np.loadtxt(types,delimiter=',').T как следующий

protocols = {} types = {"data1": "data1.csv", "data2": "data2.csv", "data3": "data3.csv"}

, чтобы я мог прочитать несколько файлов csv и построить графиквсе результаты в единицах, использующих один for loop, как показано ниже.

for protname, fname in types.items():
    col_time, col_window = protocols[protname]["col_time"], protocols[protname]["col_window"]
    rt = np.exp(np.diff(np.log(col_window)))
    plt.plot(quotient_times, quotient, ".", markersize=4, label=protname)
    plt.title(protname)
    plt.xlabel("t")
    plt.ylabel("values")
    plt.legend()
    plt.show()

Но это дает мне ошибку ValueError: could not convert string to float: b'data1'.Как я могу загрузить несколько csv файлов в качестве словаря?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Предполагая, что вы хотите построить protocols dict, который будет использоваться в вашем коде, вы можете легко построить его с помощью простого цикла:

types = {"data1": "data1.csv", "data2": "data2.csv", "data3": "data3.csv"}
protocols = {}

for name, file in types.items():
    col_time, col_window = np.loadtxt(file, delimiter=',').T
    protocols[name] = {'col_time': col_time, 'col_window': col_window}

Затем вы можете успешно построить 3 графика:

for protname, fname in types.items():
    col_time, col_window = protocols[protname]["col_time"], protocols[protname]["col_window"]
    rt = np.exp(np.diff(np.log(col_window)))
    plt.plot(col_time, col_window, ".", markersize=4, label=protname)
    plt.title(protname)
    plt.xlabel("t")
    plt.ylabel("values")
    plt.legend()
    plt.show()
0 голосов
/ 19 февраля 2019

Загрузка данных из нескольких файлов CSV не поддерживается в pandas и numpy.Вы можете использовать функцию concat для панд DataFrame и загрузить все файлы.Пример ниже демонстрирует использование панд.Замените StringIO на файловый объект.

data="""
0.086206438,10
0.086425551,12
0.089227066,20
0.089262508,24
0.089744425,30
0.090036815,40
0.090054172,28
0.090377569,28
0.090514071,28
0.090762872,28
0.090912691,27
"""
data2="""
0.086206438,29
0.086425551,32
0.089227066,50
0.089262508,54
"""
data3="""
0.086206438,69
0.086425551,72
0.089227066,70
0.089262508,74
"""
import pandas as pd
from io import StringIO
files={"data1":data,"data2":data2,"data3":data3}
# Load the first file into data frame
key=list(files.keys())[0]
df=pd.read_csv(StringIO(files.get(key)),header=None,usecols=[0,1],names=['data1','data2'])
print(df.head())
# remove file from dictionary
files.pop(key,None)
print("final values")
# Efficient :Concat this dataframe with remaining files
df=pd.concat([pd.read_csv(StringIO(files[i]),header=None,usecols=[0,1],names=['data1','data2']) for i in files.keys()],
           ignore_index=True)
print(df.tail())

Для получения дополнительной информации: pandas append vs concat

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...