假设我有一个数据表,客户已经购买了这样的东西:
Customer|Price|Quantity Sold
a | 200 | 3.3
b | 120 | 4.1
c | 040 | 12.0
d | 030 | 16.76
这应该是数据表的粗略表示,其中包含为同一产品销售的客户,价格和数量。
我想弄清楚如何计算此信息的中位数购买价格。
我对方法学有点困惑,因为我得到了大熊猫的分位数很容易,因为data[row].quantile(x)
但由于每行真的代表不止一个观察,我不确定如何获得分位数。
编辑:最重要的是,主要问题是销售量不是离散的。这是一个连续变量。 (我们喜欢说米,kgs等,所以创建更多行不是一种选择。)
对于一组离散值,通过排序和取中心值找到中值。然而,由于你有连续的Quantity
值,看起来你真的在寻找概率分布的中位数,其中Price
以Quantity
给出的相对频率分布。通过订购数据并获取累积的Quantity
,我们可以为您的问题提供图形表示:
您可以从该图中看到中值为40(X中点的y值)。这是应该预料到的,因为以两个最低价格出售的数量非常大。中位数可以从您的数据框计算如下:
df = df.sort_values('Price')
cumul = df['Quantity Sold'].cumsum()
# Get the row index where the cumulative quantity reaches half the total.
total = df['Quantity Sold'].sum()
index = sum(cumul < 0.5 * total)
# Get the price at that index
result = df['Price'].iloc[index]
可以使用不同的总比率来计算相同数据的任何其他分位数。
您可以循环销售数量并将每个项目添加到一个大的list_of_all_sold(还有其他方法可以执行此操作,这是一个示例):
c = ['a', 'b', 'c']
p = [200, 120, 40]
qs = [3,4,12]
list_of_all_sold = []
for i in range(len(qs)):
for x in range(qs[i]):
a.append(p[i])
然后,Python 3.4+有一个统计包,可用于查找中位数:
from statistics import median
median(list_of_all_sold)
编辑以查找连续数量的中位数:
您可以制作一个pandas数据帧,然后按价格对数据框进行排序,然后找到中位数并减去排序数据框中每个价格点的销售数量,逐行,直到找到中间点。像这样的东西:
c = ['a', 'b', 'c', 'd']
p = [200, 120, 40, 30]
qs = [3.3, 4.1, 12.0, 16.76]
# Create a pandas dataframe
import pandas as pd
df = pd.DataFrame({'price' : p, 'qs' : qs}, index = c)
# Find the index of the median number
median_num_idx = sum(qs) / 2
# Go down dataframe sorted by price
for index, row in df.sort_values('price').iterrows():
# Subtract the quantity sold at that price point from the median number index
median_num_idx = median_num_idx - row['qs']
# Check if you have reach the median index point
if median_num_idx <= 0:
print (row['price'])
break