Вот несколько примеров моих данных, прежде чем я начну объяснять.
PP04-O3N2SNpos log(O/H) + 12 positive error! negative error! nuclear metallicity NED calculated virgo infall distance in Kpc
9.04 0.24 -0.09 - -
8.76 0.17 -0.02 - 4.61
8.92 0.04 -0.04 9.03 2.97297
9.22 0.04 -0.04 - 8.24493
8.78 0.44 -0.24 9.23 10.25775
8.96 0.07 -0.2 9.05 7.2698
8.78 0.03 -0.03 8.48 2.02958
Таким образом, PP04 — это металличность на расчетном расстоянии NED от центра, а ядерная металличность — это металличность в центре. Я пытаюсь выяснить, есть ли какое-то уравнение, по которому, если бы я знал металличность ядра и расстояние от центра, я мог бы вычислить PP04. Это будет выглядеть так:
'PP04' - 'nuclear metallicity' = distance * gradient
где градиент - это то, что я ищу.
Для этого я написал код, который соответствует всем данным, поэтому ядерная металличность равна нулю, а затем я могу решить для градиента и построить график данных, но у меня есть несколько проблем с моим кодом.
import matplotlib.pyplot as plt
import pandas as pd
from pandas import *
from matplotlib import *
import traceback
import numpy as np
#import data into a pandas dataframe called df
df = pd.DataFrame.from_csv('Combined data.csv')
df = df.dropna()
#drop the nulls
print df
y = df['PP04-O3N2SNpos log(O/H)+12'] - df['nuclear metallicity']
yerr = np.array([(df['negative error!'],df['positive error!'])]).T
x = df['NED calculated virgo infall distance in Kpc']
intercept, gradient = np.polyfit(x,y,1)
print(intercept,gradient)
#to make a graph using the data
plt.errorbar(x,y,yerr,fmt = 'r-')
plt.xlabel('Distance from center in kpc')
plt.ylabel('PP04-O3N2SNpos log(O/H)+12')
plt.title('Central metallicity vs SN metallicity')
plt.show()
Еще одна ошибка, которую я получаю
TypeError: cannot concatenate 'str' and 'float' objects
Я действительно новичок в python, поэтому я уверен, что с моим кодом что-то не так, и если вы можете помочь с этим, я был бы признателен. Я не уверен, правильно ли я написал график данных, но я не могу проверить другие ошибки. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация, и заранее спасибо за помощь.
РЕДАКТИРОВАТЬ: я использовал приведенную ниже справку, чтобы изменить свой код, поэтому теперь он использует
pd.read_csv('Combined data.csv').dtypes
pd.read_csv('Combined data.csv',na_values = '-').dtypes
df = pd.read_csv('Combined data.csv',na_values = '-')
Но теперь я получаю ошибку
TypeError: unsupported operand type(s) for -: 'float' and 'str'
Вот трассировка.
KeyError
не происходит, когда вы получаете трассировку, показанную выше, поэтому это означает, что вы разобрались с тем, что ее вызвало. Возможно, имеет смысл убрать это из вопроса. 2) Ошибка предполагает, что ваш массивx
содержит строки, а не числа с плавающей запятой. Проверьте тип в последнем столбце и при необходимости преобразуйте. - person Lev Levitsky   schedule 07.08.2015pandas
преобразовать столбец в числа с плавающей запятой. Попробуйте использовать параметрna_values
дляread_csv
. - person Lev Levitsky   schedule 07.08.2015df.columns
, чтобы увидеть, есть ли пробелы в именах столбцов или что-то в этом роде. - person Lev Levitsky   schedule 07.08.2015na_values
. Нет смысла делать это в скрипте. 2) Напечатайтеdf.dtypes
и посмотрите, что происходит. Ядерная металличность (предположительно) еще не плавает. Попробуйте распечатать его, чтобы найти причину, возможно, там есть какие-то другиеna_values
. - person Lev Levitsky   schedule 07.08.2015