Вот несколько примеров моих данных, прежде чем я начну объяснять.Использование фрейма данных pandas для подбора данных для графика
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, так что я уверен, что есть и другие вещи неправильно с моим кодом, и если вы можете помочь с этим тоже было бы оценили. Я не уверен, правильно ли я написал строчные данные, но я не могу проверить другие ошибки. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация и спасибо в продвинутом виде за помощью.
EDIT: Я использовал помощь ниже, чтобы изменить свой код, так что теперь его использование
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'
Вот это отслеживающий.
1) Очевидно, что 'KeyError' не происходит, когда вы получите отслеживающий показано выше, так что это означает, что вы разобрали все, что вызвало Это. Возможно, было бы разумно удалить его из вопроса. 2) Ошибка, похоже, предполагает, что ваш массив 'x' содержит строки, а не floats. Проверьте тип в последнем столбце и при необходимости конвертируйте. –
Мое предположение заключается в том, что дефисы, которые означают недостающие значения, могли бы помешать 'pandas' конвертировать столбец в float. Попробуйте использовать параметр 'na_values'' read_csv'. –
Причина, по которой KeyError не происходит в трассировке, заключалась в том, что я удалил часть, назвавшую df ['ядерная металичность'], чтобы увидеть, были ли другие df тоже получены ошибки, но затем я получил вышеуказанную ошибку. Так что у меня все еще есть KeyError, но я думаю, я должен был сделать это более ясным. Спасибо за помощь, и я попробую то, что вы предложили. – Rima