计算发生次数后,如何为列表中的每一天创建条目
After counting occurrences, how to make entries for each day in list
我在两个单独的 csv 文件中有两列日期。我正在将它们读入 python,并计划在 matplotlib
中绘制
一个用于发票:
5/1/2015
5/1/2015
5/1/2015
5/2/2015
5/2/2015
5/2/2015
5/2/2015
5/3/2015
5/3/2015
5/3/2015
5/3/2015
5/4/2015
5/4/2015
5/4/2015
5/4/2015
5/4/2015
5/4/2015
5/5/2015
5/5/2015
5/5/2015
5/5/2015
5/7/2015
另一个是争议:
5/1/2015
5/1/2015
5/2/2015
5/2/2015
5/3/2015
5/5/2015
5/5/2015
我想用每天的发票数量除以争议数量来制作一个清单。所以对于 2015 年 5 月 1 日,百分比是 2/3。 2015 年 5 月 2 日 2/4。 2015年5月3日是1/4。 2015 年 5 月 4 日是 0。2015 年 5 月 5 日是 2/4。 2015 年 5 月 6 日没有发票或争议,因此百分比应为零。因此列表应该是 [.66, .5, .25, 0, .5, 0, 0]
然后我将在 y 轴上绘制百分比,在 x 轴上绘制日期。
我曾尝试使用 df.index.day 但后来我得到了每个月的第一天、第二天等的分组。我使用 value_counts 来计算每个日期的出现次数和然后在两个列表之间进行划分,但我遗漏了没有发票或争议的数字,我希望每一天都有一个价值。
有人知道一个简单的方法吗?
获取计数的一种简单方法是使用 collections.Counter
:
from collections import Counter
with open('invoice_dates') as f:
invoice_count = Counter(line.strip() for line in f)
dispute_count
也是如此。然后,您可以通过
获取字典映射日期以争议百分比
from __future__ import division # in case you are on Python 2.x
dispute_percentage = {date: dispute_count.get(date, 0) / invoices
for date, invoices in invoice_count.items()}
如果您在 Python 2.x.
,请在最后一行使用 iteritems()
而不是 items()
您应该更清楚地表明您使用的是 pandas
-- 有内置工具可以帮助您做您想做的事。在这种情况下,您可以在 f
和 f2
上使用 value_counts
。使用您的示例数据:
>>> f = pd.to_datetime(f)
>>> f2 = pd.to_datetime(f2)
>>> f.value_counts()/f2.value_counts()
2015-05-01 0.666667
2015-05-02 0.500000
2015-05-03 0.250000
2015-05-04 NaN
2015-05-05 0.500000
2015-05-07 NaN
dtype: float64
>>> (f.value_counts()/f2.value_counts()).fillna(0.0)
2015-05-01 0.666667
2015-05-02 0.500000
2015-05-03 0.250000
2015-05-04 0.000000
2015-05-05 0.500000
2015-05-07 0.000000
dtype: float64
我在两个单独的 csv 文件中有两列日期。我正在将它们读入 python,并计划在 matplotlib
中绘制一个用于发票:
5/1/2015
5/1/2015
5/1/2015
5/2/2015
5/2/2015
5/2/2015
5/2/2015
5/3/2015
5/3/2015
5/3/2015
5/3/2015
5/4/2015
5/4/2015
5/4/2015
5/4/2015
5/4/2015
5/4/2015
5/5/2015
5/5/2015
5/5/2015
5/5/2015
5/7/2015
另一个是争议:
5/1/2015
5/1/2015
5/2/2015
5/2/2015
5/3/2015
5/5/2015
5/5/2015
我想用每天的发票数量除以争议数量来制作一个清单。所以对于 2015 年 5 月 1 日,百分比是 2/3。 2015 年 5 月 2 日 2/4。 2015年5月3日是1/4。 2015 年 5 月 4 日是 0。2015 年 5 月 5 日是 2/4。 2015 年 5 月 6 日没有发票或争议,因此百分比应为零。因此列表应该是 [.66, .5, .25, 0, .5, 0, 0]
然后我将在 y 轴上绘制百分比,在 x 轴上绘制日期。
我曾尝试使用 df.index.day 但后来我得到了每个月的第一天、第二天等的分组。我使用 value_counts 来计算每个日期的出现次数和然后在两个列表之间进行划分,但我遗漏了没有发票或争议的数字,我希望每一天都有一个价值。
有人知道一个简单的方法吗?
获取计数的一种简单方法是使用 collections.Counter
:
from collections import Counter
with open('invoice_dates') as f:
invoice_count = Counter(line.strip() for line in f)
dispute_count
也是如此。然后,您可以通过
from __future__ import division # in case you are on Python 2.x
dispute_percentage = {date: dispute_count.get(date, 0) / invoices
for date, invoices in invoice_count.items()}
如果您在 Python 2.x.
,请在最后一行使用iteritems()
而不是 items()
您应该更清楚地表明您使用的是 pandas
-- 有内置工具可以帮助您做您想做的事。在这种情况下,您可以在 f
和 f2
上使用 value_counts
。使用您的示例数据:
>>> f = pd.to_datetime(f)
>>> f2 = pd.to_datetime(f2)
>>> f.value_counts()/f2.value_counts()
2015-05-01 0.666667
2015-05-02 0.500000
2015-05-03 0.250000
2015-05-04 NaN
2015-05-05 0.500000
2015-05-07 NaN
dtype: float64
>>> (f.value_counts()/f2.value_counts()).fillna(0.0)
2015-05-01 0.666667
2015-05-02 0.500000
2015-05-03 0.250000
2015-05-04 0.000000
2015-05-05 0.500000
2015-05-07 0.000000
dtype: float64