Загрузите несколько фреймов данных из одного CSV, используя Panda или NumPy - PullRequest
0 голосов
/ 04 марта 2019

У меня есть один CSV-файл с несколькими имитациями, разделенными записью Simulation (Index).Каждая запись имеет временную линию и 3 характерные линии.В основном в первом столбце были только записи Simulation (Index) и ничего больше, в то время как во втором столбце есть «заголовок» этого моделирования (Time + Features 1, n), а затем только числовые значения.

Я хочу, чтобысодержите это в некоторых фреймах данных или в некотором виде массивов для построения графиков для каждой симуляции и, очевидно, для лучшего контроля над данными.

Как человек, который является довольно новым для таких задачЯ прибег к pandas для быстрого решения, но я также открыт для любой реализации на python (numpy / other library).

Пример формата данных:

The lines of the features contain more than 500 samples

Спасибо

1 Ответ

0 голосов
/ 05 марта 2019

Ваш пример данных выглядит как Excel, поэтому я попробовал использовать Excel-лист и использовал read_excel от pandas (есть аналогичная команда для CSV):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df0 = pd.read_excel('testdata.xlsx',header=None)
df0.head()

дает

    0   1   2   3   4   5   6   7   8   9   10  11  12
0   sim1    time    1   2   3   4   5   6   7   8   9   10  11
1   NaN     feat1   1   0   -1  0   1   0   -1  0   1   0   -1
2   NaN     feat2   2   0   -2  0   2   0   -2  0   2   0   -2
3   NaN     feat3   3   0   -3  0   3   0   -3  0   3   0   -3
4   sim2    time    1   2   3   4   5   6   7   8   9   10  11

Вы можете извлечь данные для 1 модели в виде кадра данных pandas или в виде пустых массивов:

def get_data_numpy(df,j):
    i = j * (nFeats+1)
    t =  np.array(df.iloc[i,2:])
    y0 = np.array(df.iloc[i+1,2:])
    y1 = np.array(df.iloc[i+2,2:])
    y2 = np.array(df.iloc[i+3,2:])
    return t,y0,y1,y2

def get_data_pandas(df,j):
    i = j * (nFeats+1)
    t =  np.array(df.iloc[i,2:])
    dfy = df.iloc[i+1:i+nFeats+1,2:]
    return t,dfy

nModels = 1                                         # run for 1 model
nFeats  = 3
for jModel in range(nModels):
    tn,y0,y1,y2 = get_data_numpy(df0,jModel)
    tp,dfy      = get_data_pandas(df0,jModel)

    #--- graphics ---
    plt.style.use('fast')  
    fig, ax0 = plt.subplots(figsize=(20,4))
    plt.plot(tp,dfy.T, lw=4, alpha=0.4);           # plot pandas dfy with 1 command

    plt.plot(tn,-y0,lw=6,ls='--')                   # plot each numpy time series
    plt.plot(tn,-y1,lw=6,ls=':') 
    plt.plot(tn,-y2,lw=6,ls='-')
    plt.show() 

fig.savefig('plot_model_1.png', transparency=True)  

дает

enter image description here

На дисплее данных (df0.head()) и на графике показана только первая модель.Установите для nModels большее число, чем 1, и вы сможете запустить все модели.

...