我试图在DF
中找到一条线的等式这是一个虚假的数据集来解释:
Clicks Sales
5 10
5 11
10 16
10 20
10 18
15 28
15 26
... ...
100 200
我要做的是:
计算两者之间的线的等式,以便我能够输入多次点击并在任何预测的水平上具有销售额的输出。 我试图包围我的大脑的是我有许多不同的行功能(例如,每次点击量都有多个销售额)。如何迭代我的DF来计算一个聚合线函数?
这里有我所拥有的但是它一次只接受一个输入,我想创建一个平均值或汇总...
def slope(self, target):
return slope(target.x - self.x, target.y - self.y)
def y_int(self, target): # <= here's the magic
return self.y - self.slope(target)*self.x
def line_function(self, target):
slope = self.slope(target)
y_int = self.y_int(target)
def fn(x):
return slope*x + y_int
return fn
a = Point(5, 10) # I am stuck here since - what to input!?
b = Point(10, 16) # I am stuck here since - what to input!?
line = a.line_function(b)
print(line(x=10))
答案 0 :(得分:0)
使用long long int fnow = 0, fnext = 1, tempf;
函数scipy.stats.linregress
来填充数据。
也许还要检查https://en.wikipedia.org/wiki/Linear_regression以更好地理解线性回归。
答案 1 :(得分:0)
您可以按Clicks
分组并获取每组Sales
的平均值:
In [307]: sales = df.groupby('Clicks')['Sales'].mean(); sales
Out[307]:
Clicks
5 10.5
10 18.0
15 27.0
100 200.0
Name: Sales, dtype: float64
然后基于形成分段线性插值函数
使用interpolate.interp1d
:
from scipy import interpolate
fn = interpolate.interp1d(sales.index, sales.values, kind='linear')
例如,
import numpy as np
import pandas as pd
from scipy import interpolate
import matplotlib.pyplot as plt
df = pd.DataFrame({'Clicks': [5, 5, 10, 10, 10, 15, 15, 100],
'Sales': [10, 11, 16, 20, 18, 28, 26, 200]})
sales = df.groupby('Clicks')['Sales'].mean()
获得分组平均sales
后,您可以计算插值销售额
有很多方法。一种方法是使用np.interp
:
newx = [10]
print(np.interp(newx, sales.index, sales.values))
# [ 18.] <-- The interpolated sales when the number of clicks is 10 (newx)
np.interp
的问题在于,每次调用它时都会将sales.index
和sales.values
传递给np.interp
- 它没有内插函数的记忆。每次调用它时都会重新计算插值函数。
如果你有scipy,那么你可以创建插值函数一次然后再多次使用它:
fn = interpolate.interp1d(sales.index, sales.values, kind='linear')
print(fn(newx))
# [ 18.]
例如,您可以像这样评估一大堆点的插值函数(并绘制结果):
newx = np.linspace(5, 100, 100)
plt.plot(newx, fn(newx))
plt.plot(df['Clicks'], df['Sales'], 'o')
plt.show()
Pandas Series(和DataFrames)也有iterpolate
method。要使用它,您需要重新索引系列以包含要插入的点:
In [308]: sales.reindex(sales.index.union([14]))
Out[308]:
5 10.5
10 18.0
14 NaN
15 27.0
100 200.0
Name: Sales, dtype: float64
然后interpolate
填充系列为NaN的插值:
In [295]: sales.reindex(sales.index.union([14])).interpolate('values')
Out[295]:
5 10.5
10 18.0
14 25.2 # <-- interpolated value
15 27.0
100 200.0
Name: Sales, dtype: float64
但我认为这可能不适合您的问题,因为它没有 只返回您要查找的插值;它返回一个整体 系列。