我有以下数据框。带有观察数据的数据框。
import numpy as np
data = np.array([[15, 38, 14, 13, 29, 25], [20, 13, 16, 32, 44, 39], [45, 46, 19, 23, 24, 18],
[19, 20, 21, 18, 25, 33], [13, 18, 22, 24, 27, 27] ])
# Creating pandas dataframe from numpy array
datos = pd.DataFrame({'Column1': data[:, 0], 'Column2': data[:, 1], 'Column3': data[:, 2], 'Column4': data[:, 3], 'Column5': data[:, 4]})
# Deuelve una lista por cada fila
lista_datos = datos.values.tolist()
# Ordenación de los datos.
lista_ordenada_ventas = np.sort(lista_datos, axis=None)
# Crear un narray con una lista
array_datos_ordenados = np.array(lista_ordenada_ventas.reshape(datos.shape[0], datos.shape[1]))
# Crear un df con un narray
ventas_semanales_ordenadas = pd.DataFrame(array_datos_ordenados)
# Crear un df de una única columna, con una lista
ventas = pd.DataFrame(lista_ordenada_ventas)
ventas.columns = (["Valores"])
我创建了一个 DataFrame,其中包含适用于所述分析观察的类间隔的限制。
datos = np.zeros((6, 2))
intervalos = pd.DataFrame(datos, columns = ["LimInf", "LimSup"] )
intervalos.iloc[0,0] = 13
c = 6
intervalos.iloc[0, 1] = 13 + c -1
for i in range (1, intervalos.shape[0]):
intervalos.iloc[i,0] = intervalos.iloc[i-1,1] + 1
intervalos.iloc[i, 1] = intervalos.iloc[i,0] + c -1
intervalos
我们继续创造精确的限制,
intervalos["LimExacInf"] = 0
intervalos["LimExacSup"] = 0
# Calcula el límite exacto superior
for i in range (0, intervalos.shape[0]):
intervalos.loc[i , "LimExacSup"] = (intervalos.loc[i, "LimSup"] + intervalos.loc[i, "LimInf"])/2
for i in range (1, intervalos.shape[0]):
intervalos.loc[i , "LimExacInf"] = intervalos.loc[i-1, "LimExacSup"]
c = intervalos.loc[1, "LimExacSup"] - intervalos.loc[1, "LimExacInf"]
intervalos.loc[0, "LimExacInf"] = intervalos.loc[0, "LimInf"]
intervalos["MarcaClase"] = (intervalos["LimExacSup"] + intervalos["LimExacInf"]) / 2
intervalos
接下来我要添加“AbsoluteFrequency”列,在变量表中计算每个范围内包含多少个,满足>=区间下限或<大于上限的条件。我尝试使用这个脚本,它给了我一个我无法解释的错误。
frecuencia = 0
intervalos["FrecAbsolutas"]= 0
lista_frecuencias= [0]
for i in range (0, ventas.shape[0]):
for j in range (0, intervalos.shape[0]):
if ventas.iloc[i,0] >= intervalos.iloc[j, 3] or ventas.iloc[i,0] < intervalos.iloc[j, 4]:
lista_frecuencias[i] = lista_frecuencias[i] + 1
intervalos["FrecAbsolutas"]= lista_frecuencias
intervalos
绝对频率应为:5、8、5、2、1 和 3 返回错误:IndexError: list index out of range 我将不胜感激修改脚本的建议。
另一方面,pandas、scipy 等中是否有任何功能可以执行此任务?我会感谢你的帮助。
您可以使用
pandas.IntervalIndex
来生成类间隔并pandas.cut
分割数据(并在这种情况下计算绝对频率):如果你想在两列中有限制,你可以这样做:
或者在您评论时使用 Sturges 规则,我们可以执行以下操作:
我在最大值 (46) 上加一,因为否则,由于区间被其上限封闭
[..., 46)
,因此观察 46 将在区间之外。因为这里是镜头!flatten() 函数对我来说是新的,它将 nparray 展平为单个列表。我已经修改了
因为使用data[:,:-1],您会忘记 nparray 每个列表的最后一个变量,这会影响绝对频率的计算。“ interval_range()”函数对我来说是新的,它在空数据帧内构建预定义宽度的类间隔,每个间隔都有精确的上限和下限。
“ cut”函数,对我来说也是新的,非常方便,因为它以某种方式对创建的 df 的每个范围内的变量进行排序。我不太明白的是它是如何计算频率的。绝对频率的总和必须等于变量的数量,在本例中为 30。使用您的陈述
绝对频率的总和为 19。如果我出于上述原因修改所述语句,它会返回我们。
在这种情况下,频率总和为 24,这也不正确。有一些值可以逃脱计数。例如,在区间 13-19 中,我们实际上有 9 个变量。
为了确定区间数,知道样本的大小,在这种情况下 M = 30 个变量,应用 Sturges 规则:在我们的例子中,最好使用period参数 而不是freq参数
根据我们得到的最后一个区间的确切上限,根据最大变量进行校正。
但是,绝对频率的总和仍然不正确。