Python numpy - индекс назначения списка вне диапазона - PullRequest
0 голосов
/ 24 января 2019

У меня есть CSV-файл следующего формата

86,1
15,2
19,3
52,4
15,5
13,6
18,7
20,8
49,9
266,10

Для воспроизводимости я включил полный файл CSV здесь . Из столбца 1 я хотел прочитать текущую строку и сравнить ее со значением предыдущей строки. Если оно больше, я хотел бы взять разницу текущего значения от предыдущего и сохранить (append) разницу в списке. Если текущее значение равно значению предыдущей строки, продолжите сравнение. Позвольте мне прояснить это. Например, в приведенном выше примере записи, которую я предоставил, третья строка (19) больше, чем значение во второй строке (15) - так будет (19-15 =4), четвертый ряд (52-19 = 33) и т. д.

Вот мой простой подход с использованием numpy

import numpy as np
import pandas as pd
import csv

df = pd.read_csv("testdata.csv")
with open("testdata.csv") as f:
    reader = csv.reader(f, delimiter=",")
    for i in reader:
        print (i[0])
        diffs=np.diff(i[0])
        increased_value=np.median(diffs[diffs>0])

Однако я получаю сообщение об ошибке IndexError: list assignment index out of range. Как я могу исправить эту ошибку, чтобы решить задачу, которую я упомянул?

Ответы [ 6 ]

0 голосов
/ 24 января 2019

Проблема, с которой вы столкнулись, заключается в том, что при попытке запустить np.diff dtype по умолчанию для вашего массива - это dtype U3, что означает, что значения в вашем массиве не являются числами, что означает, что требуется преобразование. Попробуйте следующее:

with open("test_data.csv", "r") as f:
    reader = csv.reader(f) ## no need for delimiter if your delimiter is ','
    data = []
    for row in reader:
        data.append(row[0])

## ensure that you convert your data into numpy array with appropriate data type 
## before carrying out any mathematical operations 

np_array = np.array(data, dtype=np.uint8) 
np_diff = np.diff(np_array)
np_median = abs(np.median(np_diff[np_diff > 0]))

print(np_median)

Если вам нужно делать это регулярно, то вы всегда можете обернуть этот метод. Попробуйте это.

0 голосов
/ 24 января 2019

Использование панд s.diff():

data = StringIO("""86,1
15,2
19,3
52,4
15,5
13,6
18,7
20,8
49,9
266,10""")

df=pd.read_csv(data,header=None)

m1=df[0].diff().fillna(0)
#m1[m1>0].tolist()
#[4.0, 33.0, 5.0, 2.0, 29.0, 217.0]
m1[m1>0].median()
#17.0
0 голосов
/ 24 января 2019

Причина, по которой вы получаете

IndexError: индекс назначения списка вне диапазона

- np.diff () , принимающий входные данные как массивили список.

Как

arr = []
df = pd.read_csv("testdata3.csv")
df
with open("testdata3.csv", mode='r', encoding='utf-8-sig') as f:
    reader = csv.reader(f, delimiter=",")
    for i in reader:
#         print(i[0])
        arr.append(int(i[0]))

diffs=abs(np.diff(arr))
increased_value=np.median(diffs[diffs>0])
0 голосов
/ 24 января 2019

Нам технически не нужно numpy

from statistics import median
from operator import itemgetter, lt, sub

first = itemgetter(0)
nums = []

with open('testdata.csv', 'r') as fin:
    reader = csv.reader(fin)
    for line in reader:
        nums.append(int(first(line)))

res = [abs(sub(*t)) for t in zip(nums, nums[1:]) if lt(*t)]

[4, 33, 5, 2, 29, 217]

median(res)

17.0
0 голосов
/ 24 января 2019

По существу, np.diff() ожидает список, подобный вводу, и то, что вы передаете, является целым числом.Вот почему он терпит неудачу

0 голосов
/ 24 января 2019

Я думаю, что это лучше

df = pd.read_csv("testdata.csv", header=None)
df
     0     1
0   86     1
1   15     2
2   19     3
3   52     4
4   15     5
5   13     6
6   18     7
7   20     8
8   49     9
9   266   10

diffs = np.diff(df[0])
increased_value = np.median(diffs[diffs>0])
increased_value

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