From looking at it, I don't see why a chart is needed for the speed factor. (base_speed - 10)/140 looks like it would work just fine. I'd suggest testing it.
I think that a good rating would be the expected number of opponents a pokemon can take down before fainting.
Code:
Let DH = expected number of hits needed to take down the pokemon
Let AH = expected number of hits the pokemon needs to take down an opponent
R = SF*(DH/AH) + (1-SF)*((DH-1)/AH)
R = (SF*DH + (1-SF)*(DH-1))/AH
R = (DH+SF-1)/AH
I don't know exactly how to calculate AH and DH but I've seen X-Act throw around 630/(SpA + Atk) for AH so it's probably quite simple.
Anyway, the rationale is as follows: if you are the fastest, you will hit as many times as you get hit, so if you kill in 2 hits and get killed in 1 hits, you will take down 0.5 pokemon; if you kill in 3 hits and get killed in 2 hits, you will take down 0.66 pokemon. And so on. On the other hand, if you are slower, you will hit one LESS times than you get hit: if you kill in 2 hits and get killed in 1 hit, you will not even get the chance to attack. Hence the (DH-1) term. Since SF is the probability that you are faster, you just linearly combine the two cases.
Now, the problem is, this only works well when AH > DH... indeed, if you are faster and take down pokemon in 1 hit and get taken down in 2 hits, technically, you'll take down more than 2 pokemon because the pokemon you faint can't fight back and the next in the line is unlikely to get priority. Basically you get freebies. But this does not really matter, for when AH < DH we can calculate the number of instances of the pokemon the
opponent can take down:
Code:
R1 = (DH+SF-1)/AH # number of opponents you can beat
R2 = (AH-SF)/DH # number of you your opponent can beat
# and now we compare AH to DH to choose a rating!
R = when AH > DH then R1-1
when AH == DH then 0
when AH < DH then 1-R2
This gives a rating that is negative for bad pokemon and positive for good pokemon. More precisely, it ranges from -1 to 1 if we carefully avoid such absurdities as pokemon fainting in less than one turn or taking less than one turn to KO an opponent.
Also, to refine the rating, you could calculate ratings for each type combination to multiply to DH and AH. Basically, the expected type modifier. Which you can further refine by considering the expected power of special/physical attacks of that type.
Note: I have to mention that I have not tested the rating. I don't plan to either, though I kind of wonder if it does work.