Python 平均字典中多个值之间的差值

Python 平均字典中多个值之间的差值,python,Python,我有一个以制表符分隔的文本文件,有两列,账单名称和日期,日期是Excel数字格式。代码 import csv from collections import defaultdict d = defaultdict( list ) input_file = "C:\\Users\\Intern\\Documents\\Python.txt" output_file = "C:\\Users\\Intern\\Documents\\b.csv" with open( input_file, '

我有一个以制表符分隔的文本文件,有两列,账单名称和日期,日期是Excel数字格式。代码

import csv
from collections import defaultdict

d = defaultdict( list )

input_file = "C:\\Users\\Intern\\Documents\\Python.txt"
output_file = "C:\\Users\\Intern\\Documents\\b.csv"

with open( input_file, 'r') as infile:
    reader = csv.reader(infile, delimiter='\t')
    next(reader, None)  # skip the header
    for row in reader:
        d[ row[0] ].append( int(row[1]) )

with open( output_file, 'w' ) as outfile:
    writer = csv.writer(outfile, delimiter='\t')
    for key, value in d.items():
    if len(value) == 1:
        avg_diff = None # or 0 -- this indicates there was only 1 purchase
    else:
    # This requires your dates to be sorted, ascending, but that just takes
    # wrapping 'value' in 'sorted' if it isn't sorted yet
        avg_diff = mean([v[i] - v[i-1] for i, v in enumerate(value) if i])
    writer.writerow( [key, avg_diff] )
当前错误:

TypeError回溯(最近一次调用)
在()
22#这需要对日期进行排序、升序,但这只需要
23#如果尚未排序,则在“排序”中包装“值”
--->24 avg_diff=平均值([v[i]-v[i-1]表示i,v表示枚举(值)中的i])
25 writer.writerow([key,avg_diff])

in(.0)
22#这需要对日期进行排序、升序,但这只需要
23#如果尚未排序,则在“排序”中包装“值”
--->24 avg_diff=平均值([v[i]-v[i-1]表示i,v表示枚举(值)中的i])
25 writer.writerow([key,avg_diff])

TypeError:“float”对象不可下标


这就是我现在在更新代码时遇到的情况。

看起来您只需要一个简单的函数来计算平均值

def avg(iterable):
  count = 0
  running_sum = 0
  for item in iterable:
     running_sum += item
     count += 1
  return running_sum / float(count)
现在您只需要这些值。如果我理解您的意图,您希望
I
处的值减去
I-1处的值

有一个方法可以做到这一点,但如果您愿意,没有itertools编写自己的代码应该不难:

from itertools import tee, izip
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)
我们没有发现差异,但在一个可以传递到
avg
函数的生成器中很容易做到这一点(因为我们非常小心地使
avg
能够处理任何可编辑的,而不仅仅是序列):

您似乎可以(如果我理解正确的话)编写以下内容,而不是
max(value)-min(value)

def mean(x):
    return float(sum(x))/len(x)

...
for key, value in d.items():
    if len(value) == 1:
        avg_diff = None # or 0 -- this indicates there was only 1 purchase
    else:
        # This requires your dates to be sorted, ascending
        sv = sorted(value)
        avg_diff = mean([sv[i] - sv[i-1] for i in range(len(sv)) if i])
    writer.writerow( [key, avg_diff] )
这将为您提供每个人的平均日期间隔长度


我认为
None
对单个购买者更好,因为当两件东西在同一天购买时,0是一个有效值。

正如您在另一篇文章中提到的,此代码应该修复它。它将获取每个名称的所有日期,并将它们作为子列表与该名称关联。然后,它对子列表进行排序以按顺序获得日期,最后写入最大日期和最小日期之间的平均值。平均值最好在它自己的函数中进行,但我保持它的简单性(呃)

输出如下所示:

Bill to Name    Date
James Doe       41929
Jane Doe        41852
Adam Adamson    42244
Adam Adamson    41529
Adam Adamson    41852
Adam Adamson    238
James Doe       0
Jane Doe        0

那么你需要每个键的所有天数的平均值吗?我需要每个键的差值的平均值。我给它重新命名。我正在打一个关于索引错误的问题的中途,这时我有了一个开明的时刻并修复了它。当我为这个问题输入一个新问题时,stackoverflow保留了我以前键入的内容。这是我的错误,抱歉。我如何防止用这个除以0?有些差是0。只要至少有一个差,差是否为0就不重要了,因为唯一可以除以任何值的是差的数量(差向量的长度)。很抱歉,我没有包括这个案例——我现在就做。为了提供一些必要的上下文(对不起,我没有意识到这是必要的),我的日期是客户的购买日期。0在列表中很重要,因为它们表示只购买了1次的客户,但我想知道购买了多次的客户的平均购买间隔时间是多少。不应该有任何空列表,因此我不确定0来自何处。如果日期只是日期,而不是时间戳,那么在同一天进行的任何两次购买都不会有相同的日期吗?导致差值为零?我的答案中包含了这一点。我有最大和最小的差异,我现在要寻找的是所有日期之间的平均差异。如果它们有日期W,X,Y,Z,那么我想要的是W和X,X和Y,Y和Z之间差值的平均值。这就是我所拥有的数据结构的美妙之处。。。。它使更改输出变得容易。一秒钟。。。。我给你举个例子,我更新了。唯一的区别是最后一段代码。
Bill to Name    Date
James Doe       41929
Jane Doe        41852
Adam Adamson    42244
Adam Adamson    41529
Adam Adamson    41852
Adam Adamson    238
James Doe       0
Jane Doe        0