重采样和插值
Resampling and interpolate
在理解如何将数据重新采样为小时费率而不是现在的 4 小时块时卡在作业上。这是要求执行的操作。
差异
ENTRIES 和 EXITS 字段包含每周不会重置为零的原始计数。我们想知道在 4 小时内有多少次进入和退出。为了计算这一点,我们需要计算具有相同 (UNIT, C/A, SCP) 键的相邻行之间的差异。创建 NUM_ENTRIES 和 NUM_EXITS 列来存储这些数字。
提示:
shift 方法会很有用。
在进行移位时使用 groupby 会更容易,因为它会尊重子单元之间的边界。 level 参数将有助于定义子单元。
大多数计数器会向上计数,但也有一些会向下计数。你应该如何处理这些情况?修复此问题以获得额外积分。
上一问题中的数字存在一个问题,即它们是在不同时间采样的。将 ENTRIES 和 EXITS 列重新采样为每小时费率并对其进行插值以填充缺失值。使用 "pchip" 插值方法,因为它会保持单调性。同样,这应该使用 groupby 在组中完成,但 apply 函数将允许使用任意插值方法。现在,重新计算第 2 部分中的 NUM_ENTRIES 和 NUM_EXITS 列。
提示:
使用 reset_index 清除索引的 UNIT、C/A 和 SCP 级别,因为这使得应用函数中使用的重采样和插值方法更加直接。通过 set_index.
执行插值后将索引添加回去
这是要求重新采样的部分的代码
df = pd.read_csv("turnstile_161126.txt")
timestamp =pd.to_datetime(df['DATE'] + ' ' + df['TIME'])
df.insert(3, 'TIMESTAMP', timestamp)
df.columns = df.columns.str.strip()
df = df.set_index(['UNIT','C/A','SCP','TIMESTAMP'])
df['NUM_ENTRIES'] = df.ENTRIES - df.ENTRIES.shift(1)
df['NUM_EXITS'] = df.EXITS - df.EXITS.shift(1)
STATION LINENAME DIVISION DATE TIME DESC ENTRIES EXITS NUM_ENTRIES NUM_EXITS
UNIT C/A SCP TIMESTAMP
R051 A002 02-00-00 2016-11-19 03:00:00 59 ST NQR456W BMT 11/19/2016 03:00:00 REGULAR 5924658 2007780 NaN NaN
2016-11-19 07:00:00 59 ST NQR456W BMT 11/19/2016 07:00:00 REGULAR 5924672 2007802 14.0 22.0
2016-11-19 11:00:00 59 ST NQR456W BMT 11/19/2016 11:00:00 REGULAR 5924738 2007908 66.0 106.0
2016-11-19 15:00:00 59 ST NQR456W BMT 11/19/2016 15:00:00 REGULAR 5924979 2007980 241.0 72.0
2016-11-19 19:00:00 59 ST NQR456W BMT 11/19/2016 19:00:00 REGULAR 5925389 2008056 410.0 76.0
2016-11-19 23:00:00 59 ST NQR456W BMT 11/19/2016 23:00:00 REGULAR 5925614 2008081 225.0 25.0
2016-11-20 03:00:00 59 ST NQR456W BMT 11/20/2016 03:00:00 REGULAR 5925684 2008096 70.0 15.0
2016-11-20 07:00:00 59 ST NQR456W BMT 11/20/2016 07:00:00 REGULAR 5925688 2008113 4.0 17.0
2016-11-20 11:00:00 59 ST NQR456W BMT 11/20/2016 11:00:00 REGULAR 5925755 2008191 67.0 78.0
2016-11-20 15:00:00 59 ST NQR456W BMT 11/20/2016 15:00:00 REGULAR 5925937 2008260 182.0 69.0
2016-11-20 19:00:00 59 ST NQR456W BMT 11/20/2016 19:00:00 REGULAR 5926232 2008332 295.0 72.0
2016-11-20 23:00:00 59 ST NQR456W BMT 11/20/2016 23:00:00 REGULAR 5926394 2008367 162.0 35.0
2016-11-21 03:00:00 59 ST NQR456W BMT 11/21/2016 03:00:00 REGULAR 5926425 2008378 31.0 11.0
2016-11-21 07:00:00 59 ST NQR456W BMT 11/21/2016 07:00:00 REGULAR 5926440 2008420 15.0 42.0
2016-11-21 11:00:00 59 ST NQR456W BMT 11/21/2016 11:00:00 REGULAR 5926622 2008741 182.0 321.0
2016-11-21 15:00:00 59 ST NQR456W BMT 11/21/2016 15:00:00 REGULAR 5926872 2008851 250.0 110.0
2016-11-21 19:00:00 59 ST NQR456W BMT 11/21/2016 19:00:00 REGULAR 5927775 2008927 903.0 76.0
https://i.stack.imgur.com/M0595.png
更新的答案:
import pandas as pd
import random
from random import randint
from dateutil.relativedelta import relativedelta
import datetime
start = datetime.datetime(2016,1,1)
r = range(0,2000)
units = ['UnitA','UnitB','UnitC']
CA = ['A002','B002','C002']
CSP = ['02-00-00','03-00-00','04-00-00']
DF = pd.DataFrame()
# create dummy dataframe
for unit in units:
date = [start + relativedelta(hours=4*i) for i in r]
Entries = [random.uniform(5000000, 6000000) for i in r]
Exits = [random.uniform(1000000, 2000000) for i in r]
df = pd.DataFrame(data={
'date': date,
'unit': unit,
'Entries': Entries,
'Exits': Exits,
'CA': CA[randint(0,2)],
'CSP': CSP[randint(0,2)],
})
DF = pd.concat([DF,df])
# set index based upon desired groupby PLUS date column
DF.set_index(keys=['unit','CA','CSP','date'], inplace=True)
# show results
print DF[['Entries','Exits']].unstack(['unit','CA','CSP']).resample('1H').interpolate(method='pchip') # <--if desired, add .unstack() at end to re-arrange DF
产生:
在理解如何将数据重新采样为小时费率而不是现在的 4 小时块时卡在作业上。这是要求执行的操作。
差异 ENTRIES 和 EXITS 字段包含每周不会重置为零的原始计数。我们想知道在 4 小时内有多少次进入和退出。为了计算这一点,我们需要计算具有相同 (UNIT, C/A, SCP) 键的相邻行之间的差异。创建 NUM_ENTRIES 和 NUM_EXITS 列来存储这些数字。
提示:
shift 方法会很有用。 在进行移位时使用 groupby 会更容易,因为它会尊重子单元之间的边界。 level 参数将有助于定义子单元。 大多数计数器会向上计数,但也有一些会向下计数。你应该如何处理这些情况?修复此问题以获得额外积分。
上一问题中的数字存在一个问题,即它们是在不同时间采样的。将 ENTRIES 和 EXITS 列重新采样为每小时费率并对其进行插值以填充缺失值。使用 "pchip" 插值方法,因为它会保持单调性。同样,这应该使用 groupby 在组中完成,但 apply 函数将允许使用任意插值方法。现在,重新计算第 2 部分中的 NUM_ENTRIES 和 NUM_EXITS 列。 提示: 使用 reset_index 清除索引的 UNIT、C/A 和 SCP 级别,因为这使得应用函数中使用的重采样和插值方法更加直接。通过 set_index.
执行插值后将索引添加回去这是要求重新采样的部分的代码
df = pd.read_csv("turnstile_161126.txt")
timestamp =pd.to_datetime(df['DATE'] + ' ' + df['TIME'])
df.insert(3, 'TIMESTAMP', timestamp)
df.columns = df.columns.str.strip()
df = df.set_index(['UNIT','C/A','SCP','TIMESTAMP'])
df['NUM_ENTRIES'] = df.ENTRIES - df.ENTRIES.shift(1)
df['NUM_EXITS'] = df.EXITS - df.EXITS.shift(1)
STATION LINENAME DIVISION DATE TIME DESC ENTRIES EXITS NUM_ENTRIES NUM_EXITS
UNIT C/A SCP TIMESTAMP
R051 A002 02-00-00 2016-11-19 03:00:00 59 ST NQR456W BMT 11/19/2016 03:00:00 REGULAR 5924658 2007780 NaN NaN
2016-11-19 07:00:00 59 ST NQR456W BMT 11/19/2016 07:00:00 REGULAR 5924672 2007802 14.0 22.0
2016-11-19 11:00:00 59 ST NQR456W BMT 11/19/2016 11:00:00 REGULAR 5924738 2007908 66.0 106.0
2016-11-19 15:00:00 59 ST NQR456W BMT 11/19/2016 15:00:00 REGULAR 5924979 2007980 241.0 72.0
2016-11-19 19:00:00 59 ST NQR456W BMT 11/19/2016 19:00:00 REGULAR 5925389 2008056 410.0 76.0
2016-11-19 23:00:00 59 ST NQR456W BMT 11/19/2016 23:00:00 REGULAR 5925614 2008081 225.0 25.0
2016-11-20 03:00:00 59 ST NQR456W BMT 11/20/2016 03:00:00 REGULAR 5925684 2008096 70.0 15.0
2016-11-20 07:00:00 59 ST NQR456W BMT 11/20/2016 07:00:00 REGULAR 5925688 2008113 4.0 17.0
2016-11-20 11:00:00 59 ST NQR456W BMT 11/20/2016 11:00:00 REGULAR 5925755 2008191 67.0 78.0
2016-11-20 15:00:00 59 ST NQR456W BMT 11/20/2016 15:00:00 REGULAR 5925937 2008260 182.0 69.0
2016-11-20 19:00:00 59 ST NQR456W BMT 11/20/2016 19:00:00 REGULAR 5926232 2008332 295.0 72.0
2016-11-20 23:00:00 59 ST NQR456W BMT 11/20/2016 23:00:00 REGULAR 5926394 2008367 162.0 35.0
2016-11-21 03:00:00 59 ST NQR456W BMT 11/21/2016 03:00:00 REGULAR 5926425 2008378 31.0 11.0
2016-11-21 07:00:00 59 ST NQR456W BMT 11/21/2016 07:00:00 REGULAR 5926440 2008420 15.0 42.0
2016-11-21 11:00:00 59 ST NQR456W BMT 11/21/2016 11:00:00 REGULAR 5926622 2008741 182.0 321.0
2016-11-21 15:00:00 59 ST NQR456W BMT 11/21/2016 15:00:00 REGULAR 5926872 2008851 250.0 110.0
2016-11-21 19:00:00 59 ST NQR456W BMT 11/21/2016 19:00:00 REGULAR 5927775 2008927 903.0 76.0
https://i.stack.imgur.com/M0595.png
更新的答案:
import pandas as pd
import random
from random import randint
from dateutil.relativedelta import relativedelta
import datetime
start = datetime.datetime(2016,1,1)
r = range(0,2000)
units = ['UnitA','UnitB','UnitC']
CA = ['A002','B002','C002']
CSP = ['02-00-00','03-00-00','04-00-00']
DF = pd.DataFrame()
# create dummy dataframe
for unit in units:
date = [start + relativedelta(hours=4*i) for i in r]
Entries = [random.uniform(5000000, 6000000) for i in r]
Exits = [random.uniform(1000000, 2000000) for i in r]
df = pd.DataFrame(data={
'date': date,
'unit': unit,
'Entries': Entries,
'Exits': Exits,
'CA': CA[randint(0,2)],
'CSP': CSP[randint(0,2)],
})
DF = pd.concat([DF,df])
# set index based upon desired groupby PLUS date column
DF.set_index(keys=['unit','CA','CSP','date'], inplace=True)
# show results
print DF[['Entries','Exits']].unstack(['unit','CA','CSP']).resample('1H').interpolate(method='pchip') # <--if desired, add .unstack() at end to re-arrange DF
产生: