我最终使用iterrows
了一种幼稚的方法,因此可能有一种更有效的方法来利用熊猫重塑等。但我的想法是制作一个函数来接收你的数据框和你想要绘制的句柄,然后返回具有该句柄的每日关注者计数的另一个数据框。为此,函数
- 仅将 df 过滤到所需的句柄,
- 采用每个日期范围(例如,21/04/2017 到 29/05/2017),
- 把它变成熊猫
date_range
,然后
- 将所有日期放在一个列表中。
那时,collections.Counter
在单个列表上是一种按天计算结果的简单方法。
一个注意事项是 null End_Date
s 应该合并到您想要在图表上的任何结束日期。当我处理数据时,我称之为max_date
。总而言之:
from io import StringIO
from collections import Counter
import pandas as pd
def get_counts(df, handle):
"""Inputs: your dataframe and the handle
you want to plot.
Returns a dataframe of daily follower counts.
"""
# filters the df to the desired handle only
df_handle = df[df['Handles'] == handle]
all_dates = []
for _, row in df_handle.iterrows():
# Take each date range (for example, 21/04/2017 to 29/05/2017),
# turn that into a pandas `date_range`, and
# put all the dates in a single list
all_dates.extend(pd.date_range(row['Start_Date'],
row['End_Date']) \
.tolist())
counts = pd.DataFrame.from_dict(Counter(all_dates), orient='index') \
.rename(columns={0: handle}) \
.sort_index()
return counts
这就是功能。现在阅读和争论你的数据......
data = StringIO("""Follower_ID Handles Start_Date End_Date
100 x 30/05/2017 NaN
101 x 21/04/2017 29/05/2017
201 y 14/06/2017 NaN
100 y 16/06/2017 28/06/2017""")
df = pd.read_csv(data, delim_whitespace=True)
# fill in missing end dates
max_date = pd.Timestamp('2017-06-30')
df['End_Date'].fillna(max_date, inplace=True)
# pandas timestamps (so that we can use pd.date_range)
df['Start_Date'] = pd.to_datetime(df['Start_Date'])
df['End_Date'] = pd.to_datetime(df['End_Date'])
print(get_counts(df, 'y'))
最后一行打印这个句柄y
:
y
2017-06-14 1
2017-06-15 1
2017-06-16 2
2017-06-17 2
2017-06-18 2
2017-06-19 2
2017-06-20 2
2017-06-21 2
2017-06-22 2
2017-06-23 2
2017-06-24 2
2017-06-25 2
2017-06-26 2
2017-06-27 2
2017-06-28 2
2017-06-29 1
2017-06-30 1
你可以用你喜欢的包来绘制这个数据框。