迭代值以找到一条线的平均方程(Python3)

时间:2016-02-05 21:35:42

标签: python-3.x pandas statistics

我试图在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)) 

2 个答案:

答案 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.indexsales.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()

enter image description here

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

但我认为这可能不适合您的问题,因为它没有 只返回您要查找的插值;它返回一个整体 系列。