การสร้างสถิติสรุปจากตัวนับปริมาณการเข้าชมที่มีการประทับเวลา

ฉันกำลังรวบรวมข้อมูลการจราจรเพื่อการใช้งานพิเศษที่มีข้อมูลการจราจรประมาณ ทุก ๆ 10 นาที (แต่ไม่แม่นยำ) ค่าการประทับเวลาของตัวนับการจราจร เช่น:

11:45 100
11:56 110
12:05 120
12:18 130
...

นี่คือข้อมูลที่ฉันมีและฉันไม่สามารถปรับปรุงสิ่งนั้นได้

ฉันต้องการสร้างสถิติรายชั่วโมง/รายวันจากอินพุตนี้ คุณช่วยแนะนำฟังก์ชันหรืออัลกอริทึมสำเร็จรูปใน python ได้ไหม

ฉันกำลังคิดที่จะรวมตัวนับที่ประทับเวลาไว้เป็นชั่วโมงและทำการประทับเวลาครั้งแรกของชั่วโมงเทียบกับครั้งสุดท้ายและแสดงความแตกต่างเป็นกระแสการรับส่งข้อมูลในชั่วโมงที่กำหนด อย่างไรก็ตาม เนื่องจากสิ่งนี้อาจเริ่มต้นไม่แม่นยำกับชั่วโมงนั้น (เช่นกับที่กล่าวมาข้างต้น ข้อมูลเริ่มต้นด้วย 120 @ 12:05) มันอาจจะค่อนข้างผิดและเป็นการดีที่จะรวมข้อมูลก่อนหน้าตามสัดส่วนด้วย (เช่น ((120-110)/9)*5) อย่างไรก็ตามฉันไม่ต้องการที่จะบูรณาการล้อ

-- อัปเดต --

ตามคำแนะนำด้านล่าง ฉันได้ตรวจสอบแพนด้าและสร้างโค้ดด้านล่าง เพื่อเป็นการชี้แจงพื้นหลังที่เป็นลายลักษณ์อักษรข้างต้น ค่าการประทับเวลาจะเป็นระดับที่สองและกระจายอย่างไม่สม่ำเสมอภายในนาที (เช่น 11:45:03, 11:56:34 เป็นต้น) ดังนั้นโค้ดด้านล่างนี้รับอินพุต จัดทำดัชนีใหม่ไปที่ระดับที่สอง ดำเนินการแก้ไขเชิงเส้น (สมมติว่าการรับส่งข้อมูลมีการกระจายเท่า ๆ กันระหว่างจุดการวัด) ตัดเศษส่วนนาทีแรกและนาทีสุดท้าย (ดังนั้นหากจุดข้อมูลที่ 1 อยู่ที่ 11:45 :03 จะไม่บิดเบี้ยวเนื่องจากขาด 3 วินาทีแรก) และจะสุ่มตัวอย่างข้อมูลระดับที่สองใหม่เป็นระดับนาที ขณะนี้ทำงานได้ตามที่คาดไว้ แม้ว่าจะช้ามากก็ตาม ฉันเดาว่าเนื่องมาจากการแก้ไขระดับที่สอง เนื่องจากข้อมูลครอบคลุมตลอดระยะเวลาหลายเดือน มีแนวคิดใดบ้างที่จะปรับปรุงหรือเร่งความเร็วโค้ดเพิ่มเติม

import datetime
import pandas as pd
import numpy as np
import math

COLUMNS = ['date', 'lan_in', 'inet_in', 'lan_out', 'inet_out']

ts_converter = lambda x: datetime.datetime.fromtimestamp(int(x))
td = pd.read_table("traffic_log",
                   names = COLUMNS,
                   delim_whitespace = True,
                   header = None,
                   converters = { 'date' : ts_converter }).set_index('date')

# reindex to second-level data
td = td.reindex(pd.date_range(min(td.index), max(td.index), freq="s"))
# linear interpolation to fill data for all seconds
td = td.apply(pd.Series.interpolate)
# cut first and last fractional minute data
td = td[pd.Timestamp(long(math.ceil(td.index.min().value/(1e9*60))*1e9*60)):
        pd.Timestamp(long(math.floor(td.index.max().value/(1e9*60))*1e9*60))]
# resample to minute-level taking the minimum value for each minute
td = td.resample("t", how="min")
# change absolute values to differences
td = td.apply(pd.Series.diff)
# create daily statistics in gigabytes
ds = td.resample("d", how="sum").apply(lambda v: v/1024/1024/1024)
# create speed columns
for i in COLUMNS[1:]:
    td[i+'_speed'] = td[i] / 60 / 1024

person abali    schedule 10.12.2013    source แหล่งที่มา
comment
ใช้ pandas.pydata.org   -  person YXD    schedule 10.12.2013


คำตอบ (1)


หากฉันเข้าใจปัญหาของคุณอย่างถูกต้องบางทีสิ่งนี้อาจช่วยได้:

df = pd.DataFrame( [ ['11:45', 100 ], ['11:56', 110], ['12:05', 120], ['12:18', 130]], 
                   columns=['tick', 'val'] )
df.tick = df.tick.map ( pd.Timestamp )

ดังนั้น df มีลักษณะดังนี้:

                 tick  val
0 2013-12-10 11:45:00  100
1 2013-12-10 11:56:00  110
2 2013-12-10 12:05:00  120
3 2013-12-10 12:18:00  130

ตอนนี้คุณสามารถคำนวณความยาวของแต่ละช่วงเวลาและค้นหาค่าเฉลี่ยรายชั่วโมงได้:

df[ 'period' ] = df.tick - df.tick.shift( 1 )
df.period = df.period.div( np.timedelta64( '1', 'h' ) )
df[ 'chval' ] = df.val - df.val.shift( 1 )
df[ 'havg' ] = df.chval / df.period  

เอาท์พุท:

                 tick  val  period  chval     havg
0 2013-12-10 11:45:00  100     NaN    NaN      NaN
1 2013-12-10 11:56:00  110  0.1833     10  54.5455
2 2013-12-10 12:05:00  120  0.1500     10  66.6667
3 2013-12-10 12:18:00  130  0.2167     10  46.1538

เพื่อพิจารณาว่าบางช่วงเวลาครอบคลุมมากกว่าหนึ่งชั่วโมง ฉันคิดว่าวิธีแก้ปัญหาหนึ่งคือเปลี่ยนความถี่เป็นนาที เติมค่า nan ย้อนหลังทั้งหมด จากนั้นสุ่มตัวอย่างใหม่ทุกชั่วโมงด้วยการคำนวณค่าเฉลี่ย:

df = df.set_index( 'tick' ).asfreq( freq='T', method='bfill' )
df = df.shift( -1 ).resample( 'h', how='mean' ) 

เอาท์พุท:

                          val  period  chval     havg
2013-12-10 11:00:00  112.6667  0.1744     10  57.7778
2013-12-10 12:00:00  127.2222  0.1981     10  51.8519

ตอนนี้ฉันคิดว่าค่า havg ถูกต้องแล้ว

( 10 + 10 * 4 / 9 ) / 15 * 60 = 57.7778
(      10 * 5 / 9 + 10 ) / 18 * 60 = 51.8519
person behzad.nouri    schedule 10.12.2013
comment
ขอบคุณ มันดูโอเค แต่ฉันต้องการผลรวมของการรับส่งข้อมูลนอกเหนือจากความเร็วด้วย กล่าวคือ ฉันควรแปลงชุดข้อมูลนี้เป็นชุดข้อมูลระดับนาทีปกติที่มี เช่น จุดที่ 12:00 โดยมีค่า 110+10*4/9 (สมมติว่า การกระจายความเร็วสม่ำเสมอภายในช่วงการวัด) ฉันจะทำอย่างไร? - person abali; 10.12.2013
comment
@abali ที่เป็นการแก้ไข โปรดดูที่ นี่ - person behzad.nouri; 10.12.2013
comment
ขอบคุณ มันใช้งานได้ช้ามาก - ฉันได้แก้ไขคำถามพร้อมการอัปเดตแล้ว ยินดีรับข้อเสนอแนะเพิ่มเติม - person abali; 11.12.2013