Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 嵌套字典中的平均值_Python_Python 2.7 - Fatal编程技术网

Python 嵌套字典中的平均值

Python 嵌套字典中的平均值,python,python-2.7,Python,Python 2.7,我想创建一个新的值列表,即my_Quantity,其中每个项目等于d[key]['Quantity']中所有值的平均值,其中d[key]['start date']与my_dates中的值匹配。我想我已经很接近了,但是我对嵌套的部分很感兴趣 import datetime import numpy as np my_dates = [datetime.datetime(2014, 10, 12, 0, 0), datetime.datetime(2014, 10, 13, 0, 0), date

我想创建一个新的值列表,即my_Quantity,其中每个项目等于d[key]['Quantity']中所有值的平均值,其中d[key]['start date']与my_dates中的值匹配。我想我已经很接近了,但是我对嵌套的部分很感兴趣

import datetime
import numpy as np
my_dates = [datetime.datetime(2014, 10, 12, 0, 0), datetime.datetime(2014, 10, 13, 0, 0), datetime.datetime(2014, 10, 14, 0, 0)]

d = {
    'ID1' : {'start date': datetime.datetime(2014, 10, 12, 0, 0) , 'qty': 12},
    'ID2' : {'start date': datetime.datetime(2014, 10, 13, 0, 0) , 'qty': 34},
    'ID3' : {'start date': datetime.datetime(2014, 10, 12, 0, 0) , 'qty': 35},
    'ID4' : {'start date': datetime.datetime(2014, 10, 11, 0, 0) , 'qty': 40},
}

my_qty = []
for item in my_dates:
  my_qty.append([np.mean(x for x in d[key]['qty']) if d[key]['start date'] == my_dates[item]])

print my_qty
期望输出:

[23.5,34,0]
要澄清每个请求的输出,请执行以下操作:

[average of d[key]['qty'] where d[key]['start date '] == my_dates[0], average of d[key]['qty'] where d[key]['start date '] == my_dates[1], average of d[key]['qty'] where d[key]['start date '] == my_dates[2],]
使用纯python 简单的方法是将数量按日期分组到字典中:

import collections

quantities = collections.defaultdict(lambda: [])

for k,v in d.iteritems():
    quantities[v["start date"]].append(v["qty"])
然后运行字典计算平均值:

means = {k: float(sum(q))/len(q) for k,q in quantities.iteritems()}
给予:

>>> means
{datetime.datetime(2014, 10, 11, 0, 0): 40.0,
 datetime.datetime(2014, 10, 12, 0, 0): 23.5,
 datetime.datetime(2014, 10, 13, 0, 0): 34.0}
>>> means
             qty
start date      
2014-10-11  40.0
2014-10-12  23.5
2014-10-13  34.0
如果你想变得聪明,可以通过保持当前的平均值和你看到的数值的总数,在一次过程中计算平均值。您甚至可以在类中对其进行抽象:

class RunningMean(object):
    def __init__(self, mean=None, n=0):
        self.mean = mean
        self.n = n

    def insert(self, other):
        if self.mean is None:
            self.mean = 0.0
        self.mean = (self.mean * self.n + other) / (self.n + 1)
        self.n += 1

    def __repr__(self):
        args = (self.__class__.__name__, self.mean, self.n)
        return "{}(mean={}, n={})".format(*args)
只需浏览一下您的数据,您就会得到答案:

import collections
means = collections.defaultdict(lambda: RunningMean())
for k,v in d.iteritems():
    means[v["start date"]].insert(v["qty"])
和熊猫在一起 真正简单的方法是使用这个库,因为它是为这样的事情而设计的。下面是一些代码:

import pandas as pd
df = pd.DataFrame.from_dict(d, orient="index")
means = df.groupby("start date").aggregate(np.mean)
给予:

>>> means
{datetime.datetime(2014, 10, 11, 0, 0): 40.0,
 datetime.datetime(2014, 10, 12, 0, 0): 23.5,
 datetime.datetime(2014, 10, 13, 0, 0): 34.0}
>>> means
             qty
start date      
2014-10-11  40.0
2014-10-12  23.5
2014-10-13  34.0
使用纯python 简单的方法是将数量按日期分组到字典中:

import collections

quantities = collections.defaultdict(lambda: [])

for k,v in d.iteritems():
    quantities[v["start date"]].append(v["qty"])
然后运行字典计算平均值:

means = {k: float(sum(q))/len(q) for k,q in quantities.iteritems()}
给予:

>>> means
{datetime.datetime(2014, 10, 11, 0, 0): 40.0,
 datetime.datetime(2014, 10, 12, 0, 0): 23.5,
 datetime.datetime(2014, 10, 13, 0, 0): 34.0}
>>> means
             qty
start date      
2014-10-11  40.0
2014-10-12  23.5
2014-10-13  34.0
如果你想变得聪明,可以通过保持当前的平均值和你看到的数值的总数,在一次过程中计算平均值。您甚至可以在类中对其进行抽象:

class RunningMean(object):
    def __init__(self, mean=None, n=0):
        self.mean = mean
        self.n = n

    def insert(self, other):
        if self.mean is None:
            self.mean = 0.0
        self.mean = (self.mean * self.n + other) / (self.n + 1)
        self.n += 1

    def __repr__(self):
        args = (self.__class__.__name__, self.mean, self.n)
        return "{}(mean={}, n={})".format(*args)
只需浏览一下您的数据,您就会得到答案:

import collections
means = collections.defaultdict(lambda: RunningMean())
for k,v in d.iteritems():
    means[v["start date"]].insert(v["qty"])
和熊猫在一起 真正简单的方法是使用这个库,因为它是为这样的事情而设计的。下面是一些代码:

import pandas as pd
df = pd.DataFrame.from_dict(d, orient="index")
means = df.groupby("start date").aggregate(np.mean)
给予:

>>> means
{datetime.datetime(2014, 10, 11, 0, 0): 40.0,
 datetime.datetime(2014, 10, 12, 0, 0): 23.5,
 datetime.datetime(2014, 10, 13, 0, 0): 34.0}
>>> means
             qty
start date      
2014-10-11  40.0
2014-10-12  23.5
2014-10-13  34.0

以下是一些可以帮助您的工作代码:

for item in my_dates:
  nums = [ d[key]['qty'] for key in d if d[key]['start date'] == item ]
  if len(nums):
    avg = np.mean(nums)
  else:
    avg = 0
  print item, nums, avg

请注意,np.mean不适用于空列表,因此您必须检查要求平均值的数字的长度。

以下是一些可帮助您的工作代码:

for item in my_dates:
  nums = [ d[key]['qty'] for key in d if d[key]['start date'] == item ]
  if len(nums):
    avg = np.mean(nums)
  else:
    avg = 0
  print item, nums, avg
请注意,np.mean不适用于空列表,因此您必须检查要平均的数字长度。

单行答案:

mean_qty = [np.mean([i['qty'] for i in d.values()\
 if i.get('start date') == day] or 0) for day in my_dates] 

In [12]: mean_qty
Out[12]: [23.5, 34.0, 0.0]
或0的目的是在没有数量的情况下返回0,因为空列表上的np.mean默认返回nan

如果你需要速度,那么在jme出色的第二部分的基础上,你可以做到这一点。我通过不重新计算平均值,将他的时间缩短了3倍,直到需要:

class RunningMean(object):
    def __init__(self, total=0.0, n=0):
        self.total=total
        self.n = n

    def __iadd__(self, other):
        self.total += other
        self.n += 1
        return self

    def mean(self): 
        return (self.total/self.n if self.n else 0)

    def __repr__(self):
        return "RunningMean(total=%f, n=%i)" %(self.total, self.n)
means = defaultdict(RunningMean)
for v in d.values():
    means[v["start date"]] += (v["qty"])

Out[351]: 
[RunningMean(mean= 40.000000),
 RunningMean(mean= 34.000000),
 RunningMean(mean= 23.500000)]
答案只有一行:

mean_qty = [np.mean([i['qty'] for i in d.values()\
 if i.get('start date') == day] or 0) for day in my_dates] 

In [12]: mean_qty
Out[12]: [23.5, 34.0, 0.0]
或0的目的是在没有数量的情况下返回0,因为空列表上的np.mean默认返回nan

如果你需要速度,那么在jme出色的第二部分的基础上,你可以做到这一点。我通过不重新计算平均值,将他的时间缩短了3倍,直到需要:

class RunningMean(object):
    def __init__(self, total=0.0, n=0):
        self.total=total
        self.n = n

    def __iadd__(self, other):
        self.total += other
        self.n += 1
        return self

    def mean(self): 
        return (self.total/self.n if self.n else 0)

    def __repr__(self):
        return "RunningMean(total=%f, n=%i)" %(self.total, self.n)
means = defaultdict(RunningMean)
for v in d.values():
    means[v["start date"]] += (v["qty"])

Out[351]: 
[RunningMean(mean= 40.000000),
 RunningMean(mean= 34.000000),
 RunningMean(mean= 23.500000)]

你能澄清一下所需的输出吗?@user3467349用半英语/半代码向OPC添加了一些清晰性。你的方法非常接近。我的缺点是没有马上弄清楚你想做什么。顺便说一句,我不认为np.mean在非numpy数组上有任何速度提升。你能澄清一下所需的输出吗?@user3467349用半英语/半代码向opy添加了一些清晰度。你的方法非常接近。我的缺点是没有马上弄清楚你想做什么。顺便说一句,我不认为np.mean在非numpy数组上有任何速度增益。你不需要lennums只做np.meanums或0你不需要lennums只做np.meanums或0 lambda完全没有必要,因为第一行末尾的反斜杠。如果i.get'start date'==day]或0表示my_dates中的day,则可以使用[np.mean[i['qty']表示i in d.values]或括号内任意数量的换行符。您可能还需要解释或0位,其用途并不明显。反斜杠是为了不必滚动查看所有代码。是的,但不需要反斜杠来断行。试着去掉反斜杠,离开换行符。它将起作用,因为换行符位于列表理解的括号内。您还可以在括号内换行,这样元组文字、函数调用和声明都可以很容易地包装。@user3467349:一行答案是真的get,从哪里可以清楚地了解这种一行嵌套条件的概念?很高兴您喜欢我的一次传递方法:。有几点建议:如果要重载运算符,请重载_iadd_uuu而不是_add_uuu,因为前者的语义是就地加法,而后者通常不会修改操作数。如果可能的话,您的_urepr__;应该返回一个字符串,该字符串是用于创建对象的有效python代码。如果你只想在要求时计算平均值,我会把它作为一个属性。最后,保持跑步平均速度稍微快一点,虽然不是3倍,但我的测试显示是1.15倍。lambda完全没有必要,因为第一行末尾的反斜杠。如果i.get'start date'==day]或0表示my_dates中的day,则可以使用[np.mean[i['qty']表示i in d.values]或括号内任意数量的换行符。您可能还需要解释或0位,其用途并不明显。反斜杠是为了不必滚动查看所有代码。是的,但不需要反斜杠来断行。试着退一步
删掉新行。它将起作用,因为换行符位于列表理解的括号内。您还可以在括号内换行,这样元组文字、函数调用和声明都可以很容易地包装。@user3467349:一行答案是真的get,从哪里可以清楚地了解这种一行嵌套条件的概念?很高兴您喜欢我的一次传递方法:。有几点建议:如果要重载运算符,请重载_iadd_uuu而不是_add_uuu,因为前者的语义是就地加法,而后者通常不会修改操作数。如果可能的话,您的_urepr__;应该返回一个字符串,该字符串是用于创建对象的有效python代码。如果你只想在要求时计算平均值,我会把它作为一个属性。最后,保持跑步的平均速度稍微快一点,虽然不是3倍,但我的测试显示是1.15倍。我喜欢第二个。我喜欢第二个。