Python 平均字典中多个值之间的差值
我有一个以制表符分隔的文本文件,有两列,账单名称和日期,日期是Excel数字格式。代码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, '
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