Я написал код на Python для создания матрицы вероятности перехода из данных, но я продолжаю получать неправильные значения для двух конкретных точек данных. Я потратил несколько дней, пытаясь выяснить проблему, но безуспешно.
О коде: ввод 4 столбцов в CSV-файл. После подготовки данных первые два столбца - это новые и старые значения состояния. Мне нужно рассчитать, как часто каждое старое значение состояния переходит в новое (в основном, как часто каждая пара (x, y) встречается в первых двух столбцах данных). Значения в этих столбцах находятся в диапазоне от 0 до 99. В матрице trans_pr я хочу получить число, как часто пара (x, y) встречается в данных, и иметь это число в соответствующих координатах (x, y) в trans_pr. матрица. Поскольку значения находятся в диапазоне от 0 до 99, я могу просто добавить 1 к матрице в этих координатах каждый раз, когда они встречаются в данных.
Проблема: код работает нормально, но я всегда получаю нули в координатах (:, 29) и (:, 58) и (29, :) и (58; :), несмотря на наличие наблюдений там. Иногда кажется, что число с этими координатами добавляется к предыдущей строке. Опять же, не имеет никакого смысла для меня.
Буду очень признателен, если кто-нибудь сможет помочь. (Я новичок в Python, поэтому код, вероятно, неэффективен, но важна только ошибка.)
Код настолько прост, насколько может быть:
from numpy import *
import csv
my_data = genfromtxt('99c_test.csv', delimiter=',')
"""prepares data for further calculations"""
my_data1=zeros((len(my_data),4))
my_data1[1:,0]=100*my_data[1:,0]
my_data1[1:,1]=100*my_data[1:,3]
my_data1[1:,2]=my_data[1:,1]
my_data1[1:,3]=my_data[1:,2]
my_data2=my_data1
trans_pr=zeros((101,101))
print my_data2
"""fills the matrix with frequencies of observations"""
for i in range(len(my_data2)):
trans_pr[my_data2[i,1],my_data2[i,0]]=trans_pr[my_data2[i,1],my_data2[i,0]]+1
c = csv.writer(open("trpr1.csv", "wb"))
c.writerows(trans_pr)
Вы можете проверить код с помощью этого ввода (просто сохраните его как CSV-файл):
p_cent,p_euro,p_euro_old,p_cent_old
0.01,1,1,0.28
0.01,1,1,0.29
0.01,1,1,0.3
0.01,1,1,0.28
0.01,1,1,0.29
0.01,1,1,0.3
0.01,1,1,0.57
0.01,1,1,0.58
0.01,1,1,0.59
0.01,1,1,0.6